From 41e146d3410b0001b43816aa1742a1729b927909 Mon Sep 17 00:00:00 2001 From: Elijah Stanger-Jones Date: Thu, 7 Dec 2023 13:31:29 -0500 Subject: [PATCH] first commit --- .deps/metis_adapter.Plo | 6 + .libs/libcoinhsl.la | 1 + .libs/libcoinhsl.lai | 41 + .libs/libcoinhsl.so | 1 + .libs/libcoinhsl.so.2 | 1 + .libs/libcoinhsl.so.2.1.0 | Bin 0 -> 1274048 bytes .libs/metis_adapter.o | Bin 0 -> 1624 bytes CoinHslConfig.h.in | 45 + LICENSE | 87 + Makefile.am | 91 + Makefile.in | 1028 + README.md | 61 + ar-lib | 271 + coinhsl.pc.in | 15 + coinhsl/ChangeLog | 56 + coinhsl/CoinHslConfig.h.in | 27 + coinhsl/LICENCE | 222 + coinhsl/Makefile.am | 109 + coinhsl/Makefile.in | 1863 ++ coinhsl/README | 121 + coinhsl/aclocal.m4 | 1158 + coinhsl/coinhsl.pc.in | 11 + coinhsl/common/.deps/.dirstamp | 0 coinhsl/common/.dirstamp | 0 coinhsl/common/.libs/deps.o | Bin 0 -> 170632 bytes coinhsl/common/.libs/deps90.o | Bin 0 -> 401864 bytes coinhsl/common/deps.f | 12479 +++++++++ coinhsl/common/deps.lo | 12 + coinhsl/common/deps90.f90 | 23010 ++++++++++++++++ coinhsl/common/deps90.lo | 12 + coinhsl/common/dump.f90 | 77 + coinhsl/compile | 347 + coinhsl/config.guess | 1558 ++ coinhsl/config.h.in | 102 + coinhsl/config.sub | 1791 ++ coinhsl/configure | 22805 ++++++++++++++++ coinhsl/configure.ac | 96 + coinhsl/depcomp | 791 + coinhsl/hsl_ma77/.deps/.dirstamp | 0 coinhsl/hsl_ma77/.dirstamp | 0 coinhsl/hsl_ma77/.libs/hsl_ma77d.o | Bin 0 -> 313088 bytes coinhsl/hsl_ma77/C/.deps/.dirstamp | 0 coinhsl/hsl_ma77/C/.dirstamp | 0 coinhsl/hsl_ma77/C/.libs/hsl_ma77d_ciface.o | Bin 0 -> 37864 bytes coinhsl/hsl_ma77/C/hsl_ma77d.h | 220 + coinhsl/hsl_ma77/C/hsl_ma77d_ciface.f90 | 914 + coinhsl/hsl_ma77/C/hsl_ma77d_ciface.lo | 12 + coinhsl/hsl_ma77/hsl_ma77d.f90 | 12425 +++++++++ coinhsl/hsl_ma77/hsl_ma77d.lo | 12 + coinhsl/hsl_ma86/.deps/.dirstamp | 0 coinhsl/hsl_ma86/.dirstamp | 0 coinhsl/hsl_ma86/.libs/hsl_ma86d.o | Bin 0 -> 164104 bytes coinhsl/hsl_ma86/C/.deps/.dirstamp | 0 coinhsl/hsl_ma86/C/.dirstamp | 0 coinhsl/hsl_ma86/C/.libs/hsl_ma86d_ciface.o | Bin 0 -> 16016 bytes coinhsl/hsl_ma86/C/hsl_ma86d.h | 145 + coinhsl/hsl_ma86/C/hsl_ma86d_ciface.f90 | 409 + coinhsl/hsl_ma86/C/hsl_ma86d_ciface.lo | 12 + coinhsl/hsl_ma86/hsl_ma86d.f90 | 6495 +++++ coinhsl/hsl_ma86/hsl_ma86d.lo | 12 + coinhsl/hsl_ma97/.deps/.dirstamp | 0 coinhsl/hsl_ma97/.dirstamp | 0 coinhsl/hsl_ma97/.libs/hsl_ma97d.o | Bin 0 -> 200712 bytes coinhsl/hsl_ma97/C/.deps/.dirstamp | 0 coinhsl/hsl_ma97/C/.dirstamp | 0 coinhsl/hsl_ma97/C/.libs/hsl_ma97d_ciface.o | Bin 0 -> 33800 bytes coinhsl/hsl_ma97/C/hsl_ma97d.h | 177 + coinhsl/hsl_ma97/C/hsl_ma97d_ciface.f90 | 949 + coinhsl/hsl_ma97/C/hsl_ma97d_ciface.lo | 12 + coinhsl/hsl_ma97/hsl_ma97d.f90 | 8684 ++++++ coinhsl/hsl_ma97/hsl_ma97d.lo | 12 + coinhsl/hsl_mc68/C/.deps/.dirstamp | 0 coinhsl/hsl_mc68/C/.dirstamp | 0 coinhsl/hsl_mc68/C/.libs/hsl_mc68i_ciface.o | Bin 0 -> 5760 bytes coinhsl/hsl_mc68/C/hsl_mc68i.h | 86 + coinhsl/hsl_mc68/C/hsl_mc68i_ciface.f90 | 150 + coinhsl/hsl_mc68/C/hsl_mc68i_ciface.lo | 12 + coinhsl/install-sh | 527 + coinhsl/libcoinhsl.sym | 58 + coinhsl/loadmetis/loadmetis.c | 53 + coinhsl/ltmain.sh | 9661 +++++++ coinhsl/m4/ax_blas.m4 | 238 + coinhsl/m4/libtool.m4 | 7997 ++++++ coinhsl/m4/ltoptions.m4 | 384 + coinhsl/m4/ltsugar.m4 | 123 + coinhsl/m4/ltversion.m4 | 23 + coinhsl/m4/lt~obsolete.m4 | 98 + coinhsl/ma27/.deps/.dirstamp | 0 coinhsl/ma27/.dirstamp | 0 coinhsl/ma27/.libs/ma27d.o | Bin 0 -> 47016 bytes coinhsl/ma27/ma27d.f | 3471 +++ coinhsl/ma27/ma27d.lo | 12 + coinhsl/ma28/.deps/.dirstamp | 0 coinhsl/ma28/.dirstamp | 0 coinhsl/ma28/.libs/ma28d.o | Bin 0 -> 18584 bytes coinhsl/ma28/ma28d.f | 1088 + coinhsl/ma28/ma28d.lo | 12 + coinhsl/ma57/.deps/.dirstamp | 0 coinhsl/ma57/.dirstamp | 0 coinhsl/ma57/.libs/ma57d.o | Bin 0 -> 135872 bytes coinhsl/ma57/ma57d.f | 7967 ++++++ coinhsl/ma57/ma57d.lo | 12 + coinhsl/mc19/.deps/.dirstamp | 0 coinhsl/mc19/.dirstamp | 0 coinhsl/mc19/.libs/mc19d.o | Bin 0 -> 5176 bytes coinhsl/mc19/mc19d.f | 172 + coinhsl/mc19/mc19d.lo | 12 + coinhsl/missing | 215 + compile | 384 + config.guess | 1667 ++ config.h.in | 127 + config.sub | 1793 ++ config_coinhsl_default.h | 44 + configure | 25333 ++++++++++++++++++ configure.ac | 177 + depcomp | 791 + install-sh | 529 + ltmain.sh | 11147 ++++++++ metis_adapter.c | 273 + missing | 215 + 120 files changed, 173636 insertions(+) create mode 100644 .deps/metis_adapter.Plo create mode 120000 .libs/libcoinhsl.la create mode 100644 .libs/libcoinhsl.lai create mode 120000 .libs/libcoinhsl.so create mode 120000 .libs/libcoinhsl.so.2 create mode 100755 .libs/libcoinhsl.so.2.1.0 create mode 100644 .libs/metis_adapter.o create mode 100644 CoinHslConfig.h.in create mode 100644 LICENSE create mode 100644 Makefile.am create mode 100644 Makefile.in create mode 100644 README.md create mode 100755 ar-lib create mode 100644 coinhsl.pc.in create mode 100644 coinhsl/ChangeLog create mode 100644 coinhsl/CoinHslConfig.h.in create mode 100644 coinhsl/LICENCE create mode 100644 coinhsl/Makefile.am create mode 100644 coinhsl/Makefile.in create mode 100644 coinhsl/README create mode 100644 coinhsl/aclocal.m4 create mode 100644 coinhsl/coinhsl.pc.in create mode 100644 coinhsl/common/.deps/.dirstamp create mode 100644 coinhsl/common/.dirstamp create mode 100644 coinhsl/common/.libs/deps.o create mode 100644 coinhsl/common/.libs/deps90.o create mode 100644 coinhsl/common/deps.f create mode 100644 coinhsl/common/deps.lo create mode 100644 coinhsl/common/deps90.f90 create mode 100644 coinhsl/common/deps90.lo create mode 100644 coinhsl/common/dump.f90 create mode 100755 coinhsl/compile create mode 100755 coinhsl/config.guess create mode 100644 coinhsl/config.h.in create mode 100755 coinhsl/config.sub create mode 100755 coinhsl/configure create mode 100644 coinhsl/configure.ac create mode 100755 coinhsl/depcomp create mode 100644 coinhsl/hsl_ma77/.deps/.dirstamp create mode 100644 coinhsl/hsl_ma77/.dirstamp create mode 100644 coinhsl/hsl_ma77/.libs/hsl_ma77d.o create mode 100644 coinhsl/hsl_ma77/C/.deps/.dirstamp create mode 100644 coinhsl/hsl_ma77/C/.dirstamp create mode 100644 coinhsl/hsl_ma77/C/.libs/hsl_ma77d_ciface.o create mode 100644 coinhsl/hsl_ma77/C/hsl_ma77d.h create mode 100644 coinhsl/hsl_ma77/C/hsl_ma77d_ciface.f90 create mode 100644 coinhsl/hsl_ma77/C/hsl_ma77d_ciface.lo create mode 100644 coinhsl/hsl_ma77/hsl_ma77d.f90 create mode 100644 coinhsl/hsl_ma77/hsl_ma77d.lo create mode 100644 coinhsl/hsl_ma86/.deps/.dirstamp create mode 100644 coinhsl/hsl_ma86/.dirstamp create mode 100644 coinhsl/hsl_ma86/.libs/hsl_ma86d.o create mode 100644 coinhsl/hsl_ma86/C/.deps/.dirstamp create mode 100644 coinhsl/hsl_ma86/C/.dirstamp create mode 100644 coinhsl/hsl_ma86/C/.libs/hsl_ma86d_ciface.o create mode 100644 coinhsl/hsl_ma86/C/hsl_ma86d.h create mode 100644 coinhsl/hsl_ma86/C/hsl_ma86d_ciface.f90 create mode 100644 coinhsl/hsl_ma86/C/hsl_ma86d_ciface.lo create mode 100644 coinhsl/hsl_ma86/hsl_ma86d.f90 create mode 100644 coinhsl/hsl_ma86/hsl_ma86d.lo create mode 100644 coinhsl/hsl_ma97/.deps/.dirstamp create mode 100644 coinhsl/hsl_ma97/.dirstamp create mode 100644 coinhsl/hsl_ma97/.libs/hsl_ma97d.o create mode 100644 coinhsl/hsl_ma97/C/.deps/.dirstamp create mode 100644 coinhsl/hsl_ma97/C/.dirstamp create mode 100644 coinhsl/hsl_ma97/C/.libs/hsl_ma97d_ciface.o create mode 100644 coinhsl/hsl_ma97/C/hsl_ma97d.h create mode 100644 coinhsl/hsl_ma97/C/hsl_ma97d_ciface.f90 create mode 100644 coinhsl/hsl_ma97/C/hsl_ma97d_ciface.lo create mode 100644 coinhsl/hsl_ma97/hsl_ma97d.f90 create mode 100644 coinhsl/hsl_ma97/hsl_ma97d.lo create mode 100644 coinhsl/hsl_mc68/C/.deps/.dirstamp create mode 100644 coinhsl/hsl_mc68/C/.dirstamp create mode 100644 coinhsl/hsl_mc68/C/.libs/hsl_mc68i_ciface.o create mode 100644 coinhsl/hsl_mc68/C/hsl_mc68i.h create mode 100644 coinhsl/hsl_mc68/C/hsl_mc68i_ciface.f90 create mode 100644 coinhsl/hsl_mc68/C/hsl_mc68i_ciface.lo create mode 100755 coinhsl/install-sh create mode 100644 coinhsl/libcoinhsl.sym create mode 100644 coinhsl/loadmetis/loadmetis.c create mode 100644 coinhsl/ltmain.sh create mode 100644 coinhsl/m4/ax_blas.m4 create mode 100644 coinhsl/m4/libtool.m4 create mode 100644 coinhsl/m4/ltoptions.m4 create mode 100644 coinhsl/m4/ltsugar.m4 create mode 100644 coinhsl/m4/ltversion.m4 create mode 100644 coinhsl/m4/lt~obsolete.m4 create mode 100644 coinhsl/ma27/.deps/.dirstamp create mode 100644 coinhsl/ma27/.dirstamp create mode 100644 coinhsl/ma27/.libs/ma27d.o create mode 100644 coinhsl/ma27/ma27d.f create mode 100644 coinhsl/ma27/ma27d.lo create mode 100644 coinhsl/ma28/.deps/.dirstamp create mode 100644 coinhsl/ma28/.dirstamp create mode 100644 coinhsl/ma28/.libs/ma28d.o create mode 100644 coinhsl/ma28/ma28d.f create mode 100644 coinhsl/ma28/ma28d.lo create mode 100644 coinhsl/ma57/.deps/.dirstamp create mode 100644 coinhsl/ma57/.dirstamp create mode 100644 coinhsl/ma57/.libs/ma57d.o create mode 100644 coinhsl/ma57/ma57d.f create mode 100644 coinhsl/ma57/ma57d.lo create mode 100644 coinhsl/mc19/.deps/.dirstamp create mode 100644 coinhsl/mc19/.dirstamp create mode 100644 coinhsl/mc19/.libs/mc19d.o create mode 100755 coinhsl/mc19/mc19d.f create mode 100644 coinhsl/mc19/mc19d.lo create mode 100755 coinhsl/missing create mode 100755 compile create mode 100755 config.guess create mode 100644 config.h.in create mode 100755 config.sub create mode 100644 config_coinhsl_default.h create mode 100755 configure create mode 100644 configure.ac create mode 100755 depcomp create mode 100755 install-sh create mode 100755 ltmain.sh create mode 100644 metis_adapter.c create mode 100755 missing diff --git a/.deps/metis_adapter.Plo b/.deps/metis_adapter.Plo new file mode 100644 index 0000000..f47567d --- /dev/null +++ b/.deps/metis_adapter.Plo @@ -0,0 +1,6 @@ +metis_adapter.lo: metis_adapter.c /usr/include/stdc-predef.h \ + CoinHslConfig.h + +/usr/include/stdc-predef.h: + +CoinHslConfig.h: diff --git a/.libs/libcoinhsl.la b/.libs/libcoinhsl.la new file mode 120000 index 0000000..98b535a --- /dev/null +++ b/.libs/libcoinhsl.la @@ -0,0 +1 @@ +../libcoinhsl.la \ No newline at end of file diff --git a/.libs/libcoinhsl.lai b/.libs/libcoinhsl.lai new file mode 100644 index 0000000..35737a1 --- /dev/null +++ b/.libs/libcoinhsl.lai @@ -0,0 +1,41 @@ +# libcoinhsl.la - a libtool library file +# Generated by libtool (GNU libtool) 2.4.6 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='libcoinhsl.so.2' + +# Names of this library. +library_names='libcoinhsl.so.2.1.0 libcoinhsl.so.2 libcoinhsl.so' + +# The name of the static archive. +old_library='' + +# Linker flags that cannot go in dependency_libs. +inherited_linker_flags=' -fopenmp' + +# Libraries that this one depends upon. +dependency_libs=' -llapack -lblas -L/usr/lib/gcc/x86_64-linux-gnu/7 -L/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/7/../../.. -lgfortran -lm -lquadmath' + +# Names of additional weak libraries provided by this library +weak_library_names='' + +# Version information for libcoinhsl. +current=3 +age=1 +revision=0 + +# Is this an already installed library? +installed=yes + +# Should we warn about portability when linking against -modules? +shouldnotlink=no + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='/usr/local/lib' diff --git a/.libs/libcoinhsl.so b/.libs/libcoinhsl.so new file mode 120000 index 0000000..1e0e027 --- /dev/null +++ b/.libs/libcoinhsl.so @@ -0,0 +1 @@ +libcoinhsl.so.2.1.0 \ No newline at end of file diff --git a/.libs/libcoinhsl.so.2 b/.libs/libcoinhsl.so.2 new file mode 120000 index 0000000..1e0e027 --- /dev/null +++ b/.libs/libcoinhsl.so.2 @@ -0,0 +1 @@ +libcoinhsl.so.2.1.0 \ No newline at end of file diff --git a/.libs/libcoinhsl.so.2.1.0 b/.libs/libcoinhsl.so.2.1.0 new file mode 100755 index 0000000000000000000000000000000000000000..5dd470f7afe59bd30a1482c82116c23f43d3fffb GIT binary patch literal 1274048 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
wgy4GSThe{KeH)spnU7$_W6$5c!ArP;! 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

K0k{_>TmtsPBxq)SenTCun(@{B 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≷xes@ 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

t|VX-6I?gl;e&}c6;!x&Nhx6VK}_M7bW)|DZMM~ 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

    XdtEphx~{f1mvbS zp@bSbz+WGwgIf5$89gAM9sMcz)2=hcGvV3e{nB{=W`uapgQM$tbjN5Kd^SI6(-L#g z**uYnW;`fGJ{Ag;tnla<C&PkR^)FbiVjehseNCfl(*!K4)1**dY;})$R`$zX?s|^v$Ih&+OVCT%tcjs z%U>5)A@T^W9lPa5uuFhInTojw4zN;1(NnevIgo8b!!JrsW>2`YO5+g&gel4&7hIMba4%@kkBLC%IxT%W$LkFD~n-53}6)FbtZF%b=#Q zOkScL=TouN9;Q00QY$)s<#a~t*Ue3~U+@VnhHP1IyYc{M=9pPThh)NYTi4TTrd7yE z_YcT-Kad^S?)BY;>Z0Oy*=`q@kK?o+_JyF^3Ot?6h-68waEcV86DLTEeDDBWH+hE0 z8q`j^|2=u(CloK?n}@QjVy*E%UtDloWsBS*eWyeon|_@%teE^ zurLqn&~@F2(Kcfj2_pRsPZkaaS%mK7)A}(b<8fwynh?fbP6ML2T<~&^z2jzx%O#HF z;|m*xiF|^EuOOp*>$_e$l-kRgH4A>KPJ<%Hm9g^f(QsR#4RUgg9jvtWlONP702~5_mVBVGauZoFlD=6Xk({Gtb0o{k&cv-L+;Ip zB9}gu?@@b+Ax-fX6#XQq)W&1Du@=>q*Vohs4YV^-1>FwE+^nU6fqp z_1}p-!csXWDCZ^@GBp~nIFDrHEH@c3Hd{Jld_H&{WFRb5vq_6Zx@#2xa*>qc_k_J4 zh~$G6#7-7zY55{X}eP9&*$PrTx`WH)8Cf=Dqp zsH&B{_4KZZ#4Hnsdruh6mo$B`svA2l_UsW@C<`a4^1&XBy~QMyB}Ae!a>2p!vCS@~ zHW_`9nk#)FpA*M-ezKDYLaZ%bLR;+X#WEiu^5pe>0{|oVnEC0tLh%OUSNW=@E|5Z! zU`{tQn%$c#UA(zLTgz1W6MsW?q~<3SR**m1cm)4O{%B-RZnOCb`J?hTvZ-fXJY6If z`Ji6~`t)j{6q6p;_@L)On$8D3qcJ#-VBV)G8%=XMc|1zm@Fi&roM;S-2b_bI0g-6M ziaA5{k#w*n7w30Is0NMFFxX19_!UAG&jMXw3H?$<8tO%o zUPCeDuv(`mI#V*4lozR5GLfA(BA;!0yODMB18vn2S7-$Uhv#9)8a# z*2c*V$PWFY&JZWNJ=4JUNOVWQ%t@d{xe-Gm&3$n15(8rtlAvbZ)e6 zN-jO+CwpK4um1)qAl5uadQSjs$QCB}@)q;KPt7^(2v;1SaIWwk727S=!AV3L@=K%$ z1)DAeSr;?OQFv=Kg@@=>(&@;9oCvf7VV>6FMx;@vKLWjzB*(dFG@lK>A&r_3uad&e zhu29>`iWQ2osUsF6Z%AHf3jP+YI|7wdxalEbzUdc35AU1|Ao`onUDj0XC>zj9Xxg7 z{cZR2URo5_5}M=xMSj>^U6bMk+mPKb)mUwD{V@AHX6vq#zRZRzoLA?z;ueeBz)Q_v zE}e^rgC5PjM7mkeV!P}l{0b)cHGlPt^E0{`8+wHH>INwsg_>m_$)vva(!Eur!N__h4MoFYHEW z=vlkZv-uRlbRh1%x6Sl}424|c)5_S(V)Uk2&!spSh{1@ zcwT0jk`3EllZ|GQZzjs^FQnWil;7QC%56Y|;gs8|TIy>t@v*|(0w39NmHYx}J-x6w zy4h$v=a}lzf2HJ{e1SOJMDcYBP4sRHr`~}`pJ2v9VD=sMIU40Tk$Sh7VBWk_c#*=d3+cp&CIpI?78g+s^l~~ zSDN$=M^5*ia3ndcsN9T-snO4+6Hc(sV>CkNi>msab{I@#SjWafxIW#;(h zSH~XFg4Z`w@&Wfl+UXAZU&X#OeW??}Q97{*YZV;PB6m|BI9 z(3yx7i${HQOdMb^(TN(-gb>HV^ znMpxTUQ#C0_AJv_Pq`d|p?aU3jP>f3BzWk{Tnhe9`vz+9X7o56u266?FeRX zt8YxKEn z1&KB1%92r6wa`&GFdQiolubOJO*~uv_jkN>NMWC;$pzcu?o~c*CRe)*iMbdOJ<6Di zF@gPIYK1I=ZlD|)7Cu&(sLFQTj1XdIau~wQ7)4K`p(jF(k`WwwGE`O|r|1vG&(<3J zY;^dkTxbTYBb|^rFNpVI7mx$O5yTxEjPgemX^i;7&|qO6XAn90YfMmbn#h?Sjx%6I z+`iZH!ALgPGAh5b;VHgL^nf8?lF7cy_lS4{ZH+(m3)UokMAY0giXfTno#p@VUOM!N ziyXV$rUkXZi{cnmQimvB$GY@?&V*GB@Fl~UV7fROrAc!!N$hb6*d*6PEb_~`T(G&S z?;QLI+fO`WCloCpt-z5efrI~f2x>^3zs z;7TybCcO(Xf?S;rCnb*~AxcRTx_m<50bB4j@kuP$oahp&YOzCLl>G6Jk`N{-2KYxI zOm2;nRKW{)OZmjF^NFX+>9@ahC_OWMfpTpY499)Xz%mmo*Ws;b=dF04PBJzxHt{FG&SMq0gM3(B>BDBh3 z%4uTF@*1NFwP+%Zc)E{&gx5u2VCo%ycp~#@Y?4?F_sQnEoW)@{r+$zMuh2wna1Y3` ztTCq4knTrJsS!o&Cq|=?VK+^CJz7c9p@_-9m}50MsbT$f4cxd(h`F_C2UD@*u1692`|>pE3t?sXev!%@Ol!7Ek(ywHT{0$fTOu zR=3h5X&9Pijs&&n2O6#g2`Wk=VaoM5R~q-_G-im77bIe^3vIj6;!gP2$jfSe;T!Wc zqj(5e1oE%#$U5TX%7?ofS^3(6JLCDaRzNvAzqT-*U%SngDhFrO%&(m>J2)?LWAxGQ zcVh-R*yEAR=IjdWyHX@IFL1@TTP^3h9+ zUTf{WH;*vZHAEj`YGN9?Qh4mqKBA!aQ)aYhswO)IT5=ck5MEP86-Sb5R3UqylsH?; zizE{HJ*j~sbN5aVu)bI>y(xM~Hm)nDhkLr##q%x6-Um#t=2_d*tu}sQQNJ^B>Zo9CWY6_5Jj!c%I+(fl9%TV4@t1}SS@R$eYD7}?xs$>mRgvX*_HF`1Z#e%3sPAZgO?ywfW$f5 z-dB_tpnOgW{~QLYNn7QjBmV-9150qi&60!1YH+68sW4_A9=Uj$C)ZrOc!C+A6tN2s z7n0WEmsX4*if?=;#0C_jDcWjKg*&REqnI5cS%{V z4OPC=ZHA{3F7#AeM8vz_u>Va|`QPpT$=*Xr|98JQd{TVlJB3$=X+17@mD@2NVHPyQ zRk$6K@Ph^;8s0|Ql`Gg;q%bN510V};noe79$_GFmMYlw`@f)y;i1pW`cd4|wQ^4@dJ6aS zzSYj%&?a|-5yN5D+Jm>~$7OUlVU`$R(Sl$hily$>gLt%t+x?-M=iD$N*gi!MjlvLZ45b&k3}yq~=7b0@a7 zH2zH*=Y^bY@0e`iYB*8`z>---+EhFB@z!`r4}_xI@tU zw=!BSBIZ5NydmZYTSk;2MmByUXYc#=8k8Il@zBfD4Ns8Y!(k?#_+kd@(Y&=FWPU#` z5nM!vIVgr>B&q&Q1Tz-1HxRcWJJ_ z!K_}qubb6{_oLFkVJ&n)&EEFYkx;&GMb6>@S>e?cZa@P!zKBJ;?P6!xsxEwx9u3>i zy6Bk|>RicxQS@63NR`DdnfR4UiR6biK}$^wvhSc1azQLr7L2ehIcAxZU9|2ONy2RKJ?FQN`K>LjY=!LT z4h!@pvPOG*n`!CTpJg9lxgmeV4%5p=jTbN1&!cjE%JFXpC`*+}AN#R~?X?v{qMQvfOITj+g%)AxQoFy=8!wB+Y&0{>mA}{=9%s~`XnCJU_W1T7y_tOWlj`$P{P*K#s4@8)9PKdG zop$fczGaqPe7vj)%zLkrocI2{`@QS_Vf0q{~di5u7Z_vZyL5BX-jqZzv^MsRa&;3r&-az@B;Zv)k4{7m>ehuk}PT= zv7R(bHo=cFplpUMPIH5&b|HUD>O<3rB>t+Dg| zZ{0dUYkH|G9#uv$-c@EpYGK$KUtHkt6K6)_Q3-zGS9qIvo3*cpoqdSgchOC{HASxE zUG{-yH-oHN+@2mk@|qfT+!1TeSwV=u=srT^3YH!=PPrLDjlx$#!Elm5**lYy%i|W3 z*{wokwQxx8vy#HG**T25DxJig(A;>oHimwRHYIbXS8QAD*ZUf%`7v>GzK3KmdhIi* z$r#?PQ#RX|{YZFYZ>bD#6DdU6gHakX%3%;K&pN1%F_Are!yBs;x|Y_*m1m!jh8S{? z59T*#=#o-hmy|6R4VaV2e0P?Z5T$$8Gj=vv=M=j0YIF@tpq9oLFML?dpAa`+ZLcd_ z3=z8hVKp`YxTd`)IHoXfxQ$6sB#3d#IItrY!ROsSdhVkFM(;qt)EdH1~ zL&bkZf7%}k{kgLP^KL6JVnDLHb@KO2lII-(2v3qJryy5t*-P7W_uzwVNZ9!n$inVX z#zM+ZH-ORCUU|_p^}7JfP6nAQ|IF$QSRg^e|%8~jniY}J-p13?+?EA*{G;wK_ zkvRH}L7Kuf43gg*S3%jbkC|W2<^c z(5?jhsZ%i&$QizX&lPKM96P(RPZM8|;B3Qbe@{%>OvWa@(DjVij`h!oFoQox?%|`6 zeCPOIiFQ9oyR6b&J{IrdVxp@iG2KC4knEx>Y3s$912ewKzbyG)+7E`^?VreZix(-y zw-ayBlIxlxm9`h7lUzv?)UM2Su#B&GLN(3J-|FP^+==sjB=S6+(WXK4(iwr9%y%K3 z4~;_&@<*mGKwyCg7+I&n2&&c+GbJh`>o{*8HpzzJI`r%!C2^mGz8SR&s# zJpLeUj#ot{BaRWqimTJD)PG~;Kwx?6q`zxA)@i-amdqdOO&-@gYXVs;(uW^>FD5>* zWX%)=vLuHd6FIJG^G>KtX&)TN)M0ngA$k;3CYYUk8FPn=H@L#b8%$rV@z?MN+51J; zcoyb_xmF184zpdB;ttTEOqn9uKz`OPKyDQcl+ zZSH~(9tt18$!VrQENAzScaOy%97_BFHww|Xp!a-{6d1tb>geej2GY}0GJn<-$jRal zMi3K%0A|xF3Ym-ImOrxLo1Cm9ew&?+5gc+-EO^+$q%{(n9Qz}oBjVdxcjQ`Qdzbc_Icz>`{jp7RWPwL81*oDsHJ^Bc7$| z0m)_7F6d1za#XT!hp=-MEGwynR?oURowzn3nN`rm>GhgL(un2nkv4TP(BfR1?ALih zOh};2h$o`DyZuLo0qI?XKYyx47fTgm224AUE7fTS8f2ZJ!Q3wnt=AIb_yC4C z)(;fF@g~Q&+~4J518y%UzPqURbM;p&Lk;1`9s~p4b;QxiJwuRO4jjr=7vz26HZ;=B@StiUXFSYh6$C4?s)#i-HFES7j9Od zc5U1)+Yu`A)7%h2#3tO@VA%?i1S=En%RFmFqBb~Ua0l-@T9DvTyQj8fw|K&ED=SU( z;bal!V>=#%G3=BIlod18(s_JYoo+{w47Cy{?HE6!$$xj$QSVH(wZW2w%mFoe+b<>P z90PHtJa-9@ui}*WB#hW%FM;bV_Mohrw~;pbXek1$$XqJ_Al6dogSiWP=w(g_$B4^K z=y{c;=|18&%$x?e_})=cLqB1}C?X;als zvjNMcprxp^Ih-jVskL&KVJ@nq@y(4-m;v~%!dsxp6k94-@8)XRIaIh`ECjpn{1Vo* zd~sZta%Ix;Dl-OQCUi=LSPgAk7A@vF6MgY249wdes+=HtJ5 zVjFonMGStR@I=vXJHMSXlbSJHG)eR-)JABw<`GMu@ls)Rupe_RNn`4hlV?NslsAu< z0yNPJAV)r_PV`(fyCQci?{&Eb{^fL7z0?LvZ-&nirzN?q5H6iJP7^wVqz)$RtXA56 z2J$_vL@}#re|hk$aX(yGJOxn4|9zI%+-Vd1fq>^`a}NWCL#ke(zuDFWJWfSv6zBA>+^3`V_qDAyg4p! zC2v9I3Xs{H`-V^Af~5!28vjz* zhiB6_bw=AQhU555IzYIEme`HQY+(@%K5lxYhCzzMVt&~M^o8rCx?ODtYcojGX%$DB zHSzQGq4wC#BVq6$Ds5+;^Ua{GPY3suF*a!usDYXeE927!V+sN zBpVW%m-4OCyg+KC?Nn0Vk?Ttx0mbTG-0Udjn!5#Eef7IkAIIbM7I3EU+eFK>m=y16 zqtZ=M=(%#iVds`op$v~9ahVrU;7=6h>zf=z02($-e)AF-X(!soy6UZHg3Q$jp2AOT3DPwDJjUVVFXGz%=NESuu3^yBR5;@8kc*;G06yqIV- zk0A1L3W@17T2DJ6fkxp?vqn9yWW@FR>%TZ`hlQJIiPyW_L43nIT$=CEi+_T2T_<56 zy;qw}@34#d_KoNEA4=4#xm`}RX`5DBvNzCT?yz}Yi#uLL-Z7^Ta%)|q|4jDkw^E4G zQZ{Tz88^|Rxqr2e{mzPbY_(=eRBr^}FQbhCKPW&7xQ7W@ct&Gl>#={*&vC>1c?;js z;O|{q?B`$p8~r?BFa4~i64$}}j9OsqP)t7#J=}nnp3k`Syz=`X-36uT=vik3%h_-4?dfDf%r1%Wes`>IN}E`s)E$L>j}uwnRTH5r3}yG>S#T#u*`uUXnI zANCPoUE>>jx&_&4KRz?pvsGVwZ3^!%@D%1|&6gUGHcchSusg!8GLYWFe-*#2=AUR{ zTsiC0Abs6|lyHmHCA;8%@(H_MOIK~6MYQR9g}cI?xJPH^DZ!2qUit+-BsyZ13J$sd zA^P1PeV5@LLHZtSNp1(UB@Z)N^kQAF3Wnn*PLOSTwy}B^>%R$tcRaPg5 zfA;YpRZg6-wc`;*2eY1JRRf?73wB3`Z54xRldCDD8B!xS=`(vD=Mb{`Ya7bEwD28< z2#XgSs9FmE_9mjKIkDqeov?$`DcLyGwOQrV+u?4w8vZ1(B!^c{dr77E{#%Y#q)!xCet{s zx?hUo1x``yLZMoSalourFkfv~m4S%G7Di+lySTYv2La69tJf(Fb^3-xzC{P7tl>J& z+5@?gaGJX>Tk*fP{oqrwU$XaLYct2F65q3?ntRAnm@n^_uLs{Rjlv~8JC$vL67J}x zeJQ6xrm|P4>tQz2ryl@o+0mH2RfA8W##M=RJg?-L3lO1zmfTJHNXKUNF5*3vzuuG# zM8$1ilBk%m&sF=f3+IM%1?$?wROwSfsd%e4syFZpGnTBVqP#M`9Q|;svC`YV2D^O+ zc{;rMPpA|6y+U-HANyMwN6>tu@p7Gj}cMlnZ1| zwC?v12v2R%YCU18Sy0h=fKnDjD|}vibd5bhepHTN>O^55h_XIW7$q@CpRCJRoyJan zNog;98pu_;hpb#`>(FRT`@6C&?Fe|36fyAVv`1Wn=0uZJJ`HL^#OW5t!fgJD^|f%d zp!tL2Zwi(jRIS4O2C_`QF~Bf5d8lxbZ4YYFGAUR(UzajG%7wV+F1L$9C7z;FH&cy- ztx28-_M;#uUc;!rY5j18w!*Cx18)k_i%Ij#vI}?=kNUc>)nqGoajU7#*bre&uVB8} zr6QC)FO{#_lE|M9-`|f$%6&3-eBu5PER7q@6W{%s!u~CMdH`<{*)Rmpet-;={}Hw>T}soo~-NTCNLs z+CoxsS@ETpG^;i@^HQ(6@H0eKBD*WwFpa^7Pffg0z!~-pPOodpzQ5}&T3i#x`Xf@= z)*x>!(W?sDN_L#Vv0q;&1n3dY0L0L0URxa=lCQa6M+gCb3b%=#QfE>x2)DFWK5Vyw zG;X=@Lw2Okw8TKwL_u;v3D%9*rtLoL1d?l#$UxWYgdoK)_z27CLZj5M-gtpZx8!!6g- zMj8dE->s8pEl5tjt=k@RBEr_mmx+b9PX49PrcW>u_RMj08i|W!3kSjwynSs{tP90V zfBtXa|9Sk6ne}qJjl@iNs$5n8@afz#CFDnUZxQ=iXRA}fAwasJzi=_=(R~fvQhOr( z_<(}9Pa3E?0vw_jCOe*mu9n6$RM4#gqMJnSTQ%CnbDfzp|1_MDwz_ltwM-hniDlBe zS$D(}S5thGnwj;t7fJ(DU8-Uozfh;}!{XIxY$;ZB8!erPptM6dS#^A)cS9cUwq)R4 zXx68Ws{O$)yvItQP^5e*kNUn(@6c&&lGE~a)rC1$lCTRg1a9r6Ee*g~dC+w?@B>ZK zc{t^P1MisEtt4xHW6X@9H0B| z*{pUv#C$x&jJ6$w1C47gCUtxXT6;1u4$chmX{U*xWMq*cj&B>R19 zc7wa}fTJBlj!#+ijBN5Le6#MhdaUQ>&5{wIPCWfevUN#hLo&y;<^7$w8NL?V>g$8_ z5ZT^VKc|&leyx+gRi~*;V9P~jsSm>(s7~}O#8O|)Vs3&>JPu*uXa~M+$^AyNSNkop zHB3*tk22YFbVcX>mbMBQj*yah5Yo~Lgu8lv_W5B}`tx|r%_>>x?YbWJDH=D=o{p9N zve-(03ZU5*tn^oOQ=&4UxT2N*3Y)@?8BMZR-SEH}&%fqtX⪚msw?cQ#8Peo7P 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

    lKX&z2-GtKj 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 JEH9<5{~uG%e)9kT literal 0 HcmV?d00001 diff --git a/CoinHslConfig.h.in b/CoinHslConfig.h.in new file mode 100644 index 0000000..f2c91f7 --- /dev/null +++ b/CoinHslConfig.h.in @@ -0,0 +1,45 @@ +/* config_coinhsl.h.in. */ + +#ifndef __CONFIG_COINHSL_H__ +#define __CONFIG_COINHSL_H__ + +/* Define to 1 if MA27 is available. */ +#undef COINHSL_HAS_MA27 + +/* Define to 1 if MA28 is available. */ +#undef COINHSL_HAS_MA28 + +/* Define to 1 if MA57 is available. */ +#undef COINHSL_HAS_MA57 + +/* Define to 1 if MA77 is available. */ +#undef COINHSL_HAS_MA77 + +/* Define to 1 if MA86 is available. */ +#undef COINHSL_HAS_MA86 + +/* Define to 1 if MA97 is available. */ +#undef COINHSL_HAS_MA97 + +/* Define to 1 if MC19 is available. */ +#undef COINHSL_HAS_MC19 + +/* Define to 1 if MC68 is available. */ +#undef COINHSL_HAS_MC68 + +/* Define to 1 if METIS is available */ +#undef COINHSL_HAS_METIS + +/* Version number of project */ +#undef COINHSL_VERSION + +/* Major Version number of project */ +#undef COINHSL_VERSION_MAJOR + +/* Minor Version number of project */ +#undef COINHSL_VERSION_MINOR + +/* Release Version number of project */ +#undef COINHSL_VERSION_RELEASE + +#endif diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..16cc69a --- /dev/null +++ b/LICENSE @@ -0,0 +1,87 @@ +Eclipse Public License - v 1.0 + +THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + +a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and + +b) in the case of each subsequent Contributor: + +i) changes to the Program, and + +ii) additions to the Program; + +where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program. + +"Contributor" means any person or entity that distributes the Program. + +"Licensed Patents" mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. + +"Program" means the Contributions distributed in accordance with this Agreement. + +"Recipient" means anyone who receives the Program under this Agreement, including all Contributors. + +2. GRANT OF RIGHTS + +a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. + +b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. + +c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program. + +d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. + +3. REQUIREMENTS + +A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: + +a) it complies with the terms and conditions of this Agreement; and + +b) its license agreement: + +i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; + +ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; + +iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and + +iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. + +When the Program is made available in source code form: + +a) it must be made available under this Agreement; and + +b) a copy of this Agreement must be included with each copy of the Program. + +Contributors may not remove or alter any copyright notices contained within the Program. + +Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. + +For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement , including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. + +Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. + +This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..e9d66fe --- /dev/null +++ b/Makefile.am @@ -0,0 +1,91 @@ +# Copyright (C) 2003, 2009 International Business Machines and others +# All Rights Reserved. +# This file is distributed under the Eclipse Public License. + +EXTRA_DIST = INSTALL.HSL + +includecoindir = $(includedir)/coin-or/hsl +includecoin_HEADERS = CoinHslConfig.h + +lib_LTLIBRARIES = libcoinhsl.la + +libcoinhsl_la_SOURCES = coinhsl/common/deps.f + +if COIN_HAS_MC19 + libcoinhsl_la_SOURCES += coinhsl/mc19/mc19d.f +endif + +if COIN_HAS_MA27 + libcoinhsl_la_SOURCES += coinhsl/ma27/ma27d.f +endif + +if COIN_HAS_MA28 + libcoinhsl_la_SOURCES += coinhsl/ma28/ma28d.f +endif + +if COIN_HAS_MA57 + libcoinhsl_la_SOURCES += coinhsl/ma57/ma57d.f +endif + +if COIN_HAS_DEPSF90 + libcoinhsl_la_SOURCES += coinhsl/common/deps90.f90 +endif + +if COIN_HAS_HSL_MC68 + libcoinhsl_la_SOURCES += coinhsl/hsl_mc68/C/hsl_mc68i_ciface.f90 + includecoin_HEADERS += coinhsl/hsl_mc68/C/hsl_mc68i.h +endif + +if COIN_HAS_HSL_MA77 + libcoinhsl_la_SOURCES += coinhsl/hsl_ma77/hsl_ma77d.f90 coinhsl/hsl_ma77/C/hsl_ma77d_ciface.f90 + includecoin_HEADERS += coinhsl/hsl_ma77/C/hsl_ma77d.h +endif + +if COIN_HAS_HSL_MA86 + libcoinhsl_la_SOURCES += coinhsl/hsl_ma86/hsl_ma86d.f90 coinhsl/hsl_ma86/C/hsl_ma86d_ciface.f90 + includecoin_HEADERS += coinhsl/hsl_ma86/C/hsl_ma86d.h +endif + +if COIN_HAS_HSL_MA97 + libcoinhsl_la_SOURCES += coinhsl/hsl_ma97/hsl_ma97d.f90 coinhsl/hsl_ma97/C/hsl_ma97d_ciface.f90 + includecoin_HEADERS += coinhsl/hsl_ma97/C/hsl_ma97d.h +endif + +libcoinhsl_la_SOURCES += metis_adapter.c +if COIN_HAS_METIS + # call coinmetis_nodend from metis_adapter.c instead of metis_nodend in common/deps90.f90 + AM_FCFLAGS = $(FC_DEFINE)metis_nodend=coinmetis_nodend $(FCFLAGS_f90) + # call COINMETIS_NODEND from metis_adapter.c instead of METIS_NODEND in ma57/ma57d.f + AM_FFLAGS = $(FC_DEFINE)METIS_NODEND=COINMETIS_NODEND $(FCFLAGS_f) +endif +AM_CFLAGS = $(HSL_CFLAGS) + +libcoinhsl_la_LIBADD = $(HSL_LFLAGS) + +libcoinhsl_la_LDFLAGS = $(LT_LDFLAGS) + +# dependencies +# need to define dependencies in terms of variables, since automake does not allow multiple rules for the same target +ma77=hsl_ma77d +ma86=hsl_ma86d +ma97=hsl_ma97d +mc68=hsl_mc68i +$(ma77).lo: deps90.lo +$(ma86).lo: deps90.lo +$(ma97).lo: deps90.lo +$(ma77)_ciface.lo: $(ma77).lo +$(ma86)_ciface.lo: $(ma86).lo +$(ma97)_ciface.lo: $(ma97).lo +$(mc68)_ciface.lo: deps90.lo + +pkgconfiglibdir = $(libdir)/pkgconfig +pkgconfiglib_DATA = coinhsl.pc + +test: + @echo "No test available for HSL." + +######################################################################## +# Maintainer Stuff # +######################################################################## + +CLEANFILES = *.mod diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..9028390 --- /dev/null +++ b/Makefile.in @@ -0,0 +1,1028 @@ +# Makefile.in generated by automake 1.16.2 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2020 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Copyright (C) 2003, 2009 International Business Machines and others +# All Rights Reserved. +# This file is distributed under the Eclipse Public License. + + + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@COIN_HAS_MC19_TRUE@am__append_1 = coinhsl/mc19/mc19d.f +@COIN_HAS_MA27_TRUE@am__append_2 = coinhsl/ma27/ma27d.f +@COIN_HAS_MA28_TRUE@am__append_3 = coinhsl/ma28/ma28d.f +@COIN_HAS_MA57_TRUE@am__append_4 = coinhsl/ma57/ma57d.f +@COIN_HAS_DEPSF90_TRUE@am__append_5 = coinhsl/common/deps90.f90 +@COIN_HAS_HSL_MC68_TRUE@am__append_6 = coinhsl/hsl_mc68/C/hsl_mc68i_ciface.f90 +@COIN_HAS_HSL_MC68_TRUE@am__append_7 = coinhsl/hsl_mc68/C/hsl_mc68i.h +@COIN_HAS_HSL_MA77_TRUE@am__append_8 = coinhsl/hsl_ma77/hsl_ma77d.f90 coinhsl/hsl_ma77/C/hsl_ma77d_ciface.f90 +@COIN_HAS_HSL_MA77_TRUE@am__append_9 = coinhsl/hsl_ma77/C/hsl_ma77d.h +@COIN_HAS_HSL_MA86_TRUE@am__append_10 = coinhsl/hsl_ma86/hsl_ma86d.f90 coinhsl/hsl_ma86/C/hsl_ma86d_ciface.f90 +@COIN_HAS_HSL_MA86_TRUE@am__append_11 = coinhsl/hsl_ma86/C/hsl_ma86d.h +@COIN_HAS_HSL_MA97_TRUE@am__append_12 = coinhsl/hsl_ma97/hsl_ma97d.f90 coinhsl/hsl_ma97/C/hsl_ma97d_ciface.f90 +@COIN_HAS_HSL_MA97_TRUE@am__append_13 = coinhsl/hsl_ma97/C/hsl_ma97d.h +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ + $(am__configure_deps) $(am__includecoin_HEADERS_DIST) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = config.h CoinHslConfig.h +CONFIG_CLEAN_FILES = coinhsl.pc +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgconfiglibdir)" \ + "$(DESTDIR)$(includecoindir)" +LTLIBRARIES = $(lib_LTLIBRARIES) +am__DEPENDENCIES_1 = +libcoinhsl_la_DEPENDENCIES = $(am__DEPENDENCIES_1) +am__dirstamp = $(am__leading_dot)dirstamp +@COIN_HAS_MC19_TRUE@am__objects_1 = coinhsl/mc19/mc19d.lo +@COIN_HAS_MA27_TRUE@am__objects_2 = coinhsl/ma27/ma27d.lo +@COIN_HAS_MA28_TRUE@am__objects_3 = coinhsl/ma28/ma28d.lo +@COIN_HAS_MA57_TRUE@am__objects_4 = coinhsl/ma57/ma57d.lo +@COIN_HAS_DEPSF90_TRUE@am__objects_5 = coinhsl/common/deps90.lo +@COIN_HAS_HSL_MC68_TRUE@am__objects_6 = coinhsl/hsl_mc68/C/hsl_mc68i_ciface.lo +@COIN_HAS_HSL_MA77_TRUE@am__objects_7 = coinhsl/hsl_ma77/hsl_ma77d.lo \ +@COIN_HAS_HSL_MA77_TRUE@ coinhsl/hsl_ma77/C/hsl_ma77d_ciface.lo +@COIN_HAS_HSL_MA86_TRUE@am__objects_8 = coinhsl/hsl_ma86/hsl_ma86d.lo \ +@COIN_HAS_HSL_MA86_TRUE@ coinhsl/hsl_ma86/C/hsl_ma86d_ciface.lo +@COIN_HAS_HSL_MA97_TRUE@am__objects_9 = coinhsl/hsl_ma97/hsl_ma97d.lo \ +@COIN_HAS_HSL_MA97_TRUE@ coinhsl/hsl_ma97/C/hsl_ma97d_ciface.lo +am_libcoinhsl_la_OBJECTS = coinhsl/common/deps.lo $(am__objects_1) \ + $(am__objects_2) $(am__objects_3) $(am__objects_4) \ + $(am__objects_5) $(am__objects_6) $(am__objects_7) \ + $(am__objects_8) $(am__objects_9) metis_adapter.lo +libcoinhsl_la_OBJECTS = $(am_libcoinhsl_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libcoinhsl_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ + $(AM_FFLAGS) $(FFLAGS) $(libcoinhsl_la_LDFLAGS) $(LDFLAGS) -o \ + $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/metis_adapter.Plo +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +F77COMPILE = $(F77) $(AM_FFLAGS) $(FFLAGS) +LTF77COMPILE = $(LIBTOOL) $(AM_V_lt) --tag=F77 $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(F77) $(AM_FFLAGS) $(FFLAGS) +AM_V_F77 = $(am__v_F77_@AM_V@) +am__v_F77_ = $(am__v_F77_@AM_DEFAULT_V@) +am__v_F77_0 = @echo " F77 " $@; +am__v_F77_1 = +F77LD = $(F77) +F77LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(F77LD) $(AM_FFLAGS) $(FFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_F77LD = $(am__v_F77LD_@AM_V@) +am__v_F77LD_ = $(am__v_F77LD_@AM_DEFAULT_V@) +am__v_F77LD_0 = @echo " F77LD " $@; +am__v_F77LD_1 = +FCCOMPILE = $(FC) $(AM_FCFLAGS) $(FCFLAGS) +LTFCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(FC) $(AM_FCFLAGS) $(FCFLAGS) +AM_V_FC = $(am__v_FC_@AM_V@) +am__v_FC_ = $(am__v_FC_@AM_DEFAULT_V@) +am__v_FC_0 = @echo " FC " $@; +am__v_FC_1 = +FCLD = $(FC) +FCLINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_FCLD = $(am__v_FCLD_@AM_V@) +am__v_FCLD_ = $(am__v_FCLD_@AM_DEFAULT_V@) +am__v_FCLD_0 = @echo " FCLD " $@; +am__v_FCLD_1 = +SOURCES = $(libcoinhsl_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +DATA = $(pkgconfiglib_DATA) +am__includecoin_HEADERS_DIST = CoinHslConfig.h \ + coinhsl/hsl_mc68/C/hsl_mc68i.h coinhsl/hsl_ma77/C/hsl_ma77d.h \ + coinhsl/hsl_ma86/C/hsl_ma86d.h coinhsl/hsl_ma97/C/hsl_ma97d.h +HEADERS = $(includecoin_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) \ + config.h.in CoinHslConfig.h.in +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +CSCOPE = cscope +AM_RECURSIVE_TARGETS = cscope +ACLOCAL = @ACLOCAL@ +ADD_CFLAGS = @ADD_CFLAGS@ +ADD_FCFLAGS = @ADD_FCFLAGS@ +ADD_FFLAGS = @ADD_FFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +COIN_PKG_CONFIG_PATH = @COIN_PKG_CONFIG_PATH@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FC = @FC@ +FCFLAGS = @FCFLAGS@ +FCFLAGS_F = @FCFLAGS_F@ +FCFLAGS_f = @FCFLAGS_f@ +FCFLAGS_f90 = @FCFLAGS_f90@ +FC_DEFINE = @FC_DEFINE@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +HSL_CFLAGS = @HSL_CFLAGS@ +HSL_CFLAGS_NOPC = @HSL_CFLAGS_NOPC@ +HSL_LFLAGS = @HSL_LFLAGS@ +HSL_LFLAGS_NOPC = @HSL_LFLAGS_NOPC@ +HSL_PCFILES = @HSL_PCFILES@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_LDFLAGS = @LT_LDFLAGS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +METISCHECK_LFLAGS = @METISCHECK_LFLAGS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENMP_FCFLAGS = @OPENMP_FCFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_FC = @ac_ct_FC@ +ac_ct_PKG_CONFIG = @ac_ct_PKG_CONFIG@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +EXTRA_DIST = INSTALL.HSL +includecoindir = $(includedir)/coin-or/hsl +includecoin_HEADERS = CoinHslConfig.h $(am__append_7) $(am__append_9) \ + $(am__append_11) $(am__append_13) +lib_LTLIBRARIES = libcoinhsl.la +libcoinhsl_la_SOURCES = coinhsl/common/deps.f $(am__append_1) \ + $(am__append_2) $(am__append_3) $(am__append_4) \ + $(am__append_5) $(am__append_6) $(am__append_8) \ + $(am__append_10) $(am__append_12) metis_adapter.c +@COIN_HAS_METIS_TRUE@AM_FCFLAGS = $(FC_DEFINE)metis_nodend=coinmetis_nodend $(FCFLAGS_f90) +@COIN_HAS_METIS_TRUE@AM_FFLAGS = $(FC_DEFINE)METIS_NODEND=COINMETIS_NODEND $(FCFLAGS_f) +AM_CFLAGS = $(HSL_CFLAGS) +libcoinhsl_la_LIBADD = $(HSL_LFLAGS) +libcoinhsl_la_LDFLAGS = $(LT_LDFLAGS) + +# dependencies +# need to define dependencies in terms of variables, since automake does not allow multiple rules for the same target +ma77 = hsl_ma77d +ma86 = hsl_ma86d +ma97 = hsl_ma97d +mc68 = hsl_mc68i +pkgconfiglibdir = $(libdir)/pkgconfig +pkgconfiglib_DATA = coinhsl.pc + +######################################################################## +# Maintainer Stuff # +######################################################################## +CLEANFILES = *.mod +all: config.h CoinHslConfig.h + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .f .f90 .lo .o .obj +am--refresh: Makefile + @: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +config.h: stamp-h1 + @test -f $@ || rm -f stamp-h1 + @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 + +stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config.h +$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +CoinHslConfig.h: stamp-h2 + @test -f $@ || rm -f stamp-h2 + @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h2 + +stamp-h2: $(srcdir)/CoinHslConfig.h.in $(top_builddir)/config.status + @rm -f stamp-h2 + cd $(top_builddir) && $(SHELL) ./config.status CoinHslConfig.h + +distclean-hdr: + -rm -f config.h stamp-h1 CoinHslConfig.h stamp-h2 +coinhsl.pc: $(top_builddir)/config.status $(srcdir)/coinhsl.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ + +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } +coinhsl/common/$(am__dirstamp): + @$(MKDIR_P) coinhsl/common + @: > coinhsl/common/$(am__dirstamp) +coinhsl/common/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) coinhsl/common/$(DEPDIR) + @: > coinhsl/common/$(DEPDIR)/$(am__dirstamp) +coinhsl/common/deps.lo: coinhsl/common/$(am__dirstamp) \ + coinhsl/common/$(DEPDIR)/$(am__dirstamp) +coinhsl/mc19/$(am__dirstamp): + @$(MKDIR_P) coinhsl/mc19 + @: > coinhsl/mc19/$(am__dirstamp) +coinhsl/mc19/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) coinhsl/mc19/$(DEPDIR) + @: > coinhsl/mc19/$(DEPDIR)/$(am__dirstamp) +coinhsl/mc19/mc19d.lo: coinhsl/mc19/$(am__dirstamp) \ + coinhsl/mc19/$(DEPDIR)/$(am__dirstamp) +coinhsl/ma27/$(am__dirstamp): + @$(MKDIR_P) coinhsl/ma27 + @: > coinhsl/ma27/$(am__dirstamp) +coinhsl/ma27/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) coinhsl/ma27/$(DEPDIR) + @: > coinhsl/ma27/$(DEPDIR)/$(am__dirstamp) +coinhsl/ma27/ma27d.lo: coinhsl/ma27/$(am__dirstamp) \ + coinhsl/ma27/$(DEPDIR)/$(am__dirstamp) +coinhsl/ma28/$(am__dirstamp): + @$(MKDIR_P) coinhsl/ma28 + @: > coinhsl/ma28/$(am__dirstamp) +coinhsl/ma28/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) coinhsl/ma28/$(DEPDIR) + @: > coinhsl/ma28/$(DEPDIR)/$(am__dirstamp) +coinhsl/ma28/ma28d.lo: coinhsl/ma28/$(am__dirstamp) \ + coinhsl/ma28/$(DEPDIR)/$(am__dirstamp) +coinhsl/ma57/$(am__dirstamp): + @$(MKDIR_P) coinhsl/ma57 + @: > coinhsl/ma57/$(am__dirstamp) +coinhsl/ma57/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) coinhsl/ma57/$(DEPDIR) + @: > coinhsl/ma57/$(DEPDIR)/$(am__dirstamp) +coinhsl/ma57/ma57d.lo: coinhsl/ma57/$(am__dirstamp) \ + coinhsl/ma57/$(DEPDIR)/$(am__dirstamp) +coinhsl/common/deps90.lo: coinhsl/common/$(am__dirstamp) \ + coinhsl/common/$(DEPDIR)/$(am__dirstamp) +coinhsl/hsl_mc68/C/$(am__dirstamp): + @$(MKDIR_P) coinhsl/hsl_mc68/C + @: > coinhsl/hsl_mc68/C/$(am__dirstamp) +coinhsl/hsl_mc68/C/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) coinhsl/hsl_mc68/C/$(DEPDIR) + @: > coinhsl/hsl_mc68/C/$(DEPDIR)/$(am__dirstamp) +coinhsl/hsl_mc68/C/hsl_mc68i_ciface.lo: \ + coinhsl/hsl_mc68/C/$(am__dirstamp) \ + coinhsl/hsl_mc68/C/$(DEPDIR)/$(am__dirstamp) +coinhsl/hsl_ma77/$(am__dirstamp): + @$(MKDIR_P) coinhsl/hsl_ma77 + @: > coinhsl/hsl_ma77/$(am__dirstamp) +coinhsl/hsl_ma77/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) coinhsl/hsl_ma77/$(DEPDIR) + @: > coinhsl/hsl_ma77/$(DEPDIR)/$(am__dirstamp) +coinhsl/hsl_ma77/hsl_ma77d.lo: coinhsl/hsl_ma77/$(am__dirstamp) \ + coinhsl/hsl_ma77/$(DEPDIR)/$(am__dirstamp) +coinhsl/hsl_ma77/C/$(am__dirstamp): + @$(MKDIR_P) coinhsl/hsl_ma77/C + @: > coinhsl/hsl_ma77/C/$(am__dirstamp) +coinhsl/hsl_ma77/C/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) coinhsl/hsl_ma77/C/$(DEPDIR) + @: > coinhsl/hsl_ma77/C/$(DEPDIR)/$(am__dirstamp) +coinhsl/hsl_ma77/C/hsl_ma77d_ciface.lo: \ + coinhsl/hsl_ma77/C/$(am__dirstamp) \ + coinhsl/hsl_ma77/C/$(DEPDIR)/$(am__dirstamp) +coinhsl/hsl_ma86/$(am__dirstamp): + @$(MKDIR_P) coinhsl/hsl_ma86 + @: > coinhsl/hsl_ma86/$(am__dirstamp) +coinhsl/hsl_ma86/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) coinhsl/hsl_ma86/$(DEPDIR) + @: > coinhsl/hsl_ma86/$(DEPDIR)/$(am__dirstamp) +coinhsl/hsl_ma86/hsl_ma86d.lo: coinhsl/hsl_ma86/$(am__dirstamp) \ + coinhsl/hsl_ma86/$(DEPDIR)/$(am__dirstamp) +coinhsl/hsl_ma86/C/$(am__dirstamp): + @$(MKDIR_P) coinhsl/hsl_ma86/C + @: > coinhsl/hsl_ma86/C/$(am__dirstamp) +coinhsl/hsl_ma86/C/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) coinhsl/hsl_ma86/C/$(DEPDIR) + @: > coinhsl/hsl_ma86/C/$(DEPDIR)/$(am__dirstamp) +coinhsl/hsl_ma86/C/hsl_ma86d_ciface.lo: \ + coinhsl/hsl_ma86/C/$(am__dirstamp) \ + coinhsl/hsl_ma86/C/$(DEPDIR)/$(am__dirstamp) +coinhsl/hsl_ma97/$(am__dirstamp): + @$(MKDIR_P) coinhsl/hsl_ma97 + @: > coinhsl/hsl_ma97/$(am__dirstamp) +coinhsl/hsl_ma97/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) coinhsl/hsl_ma97/$(DEPDIR) + @: > coinhsl/hsl_ma97/$(DEPDIR)/$(am__dirstamp) +coinhsl/hsl_ma97/hsl_ma97d.lo: coinhsl/hsl_ma97/$(am__dirstamp) \ + coinhsl/hsl_ma97/$(DEPDIR)/$(am__dirstamp) +coinhsl/hsl_ma97/C/$(am__dirstamp): + @$(MKDIR_P) coinhsl/hsl_ma97/C + @: > coinhsl/hsl_ma97/C/$(am__dirstamp) +coinhsl/hsl_ma97/C/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) coinhsl/hsl_ma97/C/$(DEPDIR) + @: > coinhsl/hsl_ma97/C/$(DEPDIR)/$(am__dirstamp) +coinhsl/hsl_ma97/C/hsl_ma97d_ciface.lo: \ + coinhsl/hsl_ma97/C/$(am__dirstamp) \ + coinhsl/hsl_ma97/C/$(DEPDIR)/$(am__dirstamp) + +libcoinhsl.la: $(libcoinhsl_la_OBJECTS) $(libcoinhsl_la_DEPENDENCIES) $(EXTRA_libcoinhsl_la_DEPENDENCIES) + $(AM_V_F77LD)$(libcoinhsl_la_LINK) -rpath $(libdir) $(libcoinhsl_la_OBJECTS) $(libcoinhsl_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f coinhsl/common/*.$(OBJEXT) + -rm -f coinhsl/common/*.lo + -rm -f coinhsl/hsl_ma77/*.$(OBJEXT) + -rm -f coinhsl/hsl_ma77/*.lo + -rm -f coinhsl/hsl_ma77/C/*.$(OBJEXT) + -rm -f coinhsl/hsl_ma77/C/*.lo + -rm -f coinhsl/hsl_ma86/*.$(OBJEXT) + -rm -f coinhsl/hsl_ma86/*.lo + -rm -f coinhsl/hsl_ma86/C/*.$(OBJEXT) + -rm -f coinhsl/hsl_ma86/C/*.lo + -rm -f coinhsl/hsl_ma97/*.$(OBJEXT) + -rm -f coinhsl/hsl_ma97/*.lo + -rm -f coinhsl/hsl_ma97/C/*.$(OBJEXT) + -rm -f coinhsl/hsl_ma97/C/*.lo + -rm -f coinhsl/hsl_mc68/C/*.$(OBJEXT) + -rm -f coinhsl/hsl_mc68/C/*.lo + -rm -f coinhsl/ma27/*.$(OBJEXT) + -rm -f coinhsl/ma27/*.lo + -rm -f coinhsl/ma28/*.$(OBJEXT) + -rm -f coinhsl/ma28/*.lo + -rm -f coinhsl/ma57/*.$(OBJEXT) + -rm -f coinhsl/ma57/*.lo + -rm -f coinhsl/mc19/*.$(OBJEXT) + -rm -f coinhsl/mc19/*.lo + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/metis_adapter.Plo@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +.f.o: + $(AM_V_F77)$(F77COMPILE) -c -o $@ $< + +.f.obj: + $(AM_V_F77)$(F77COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.f.lo: + $(AM_V_F77)$(LTF77COMPILE) -c -o $@ $< + +.f90.o: + $(AM_V_FC)$(FCCOMPILE) -c -o $@ $< + +.f90.obj: + $(AM_V_FC)$(FCCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.f90.lo: + $(AM_V_FC)$(LTFCCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + -rm -rf coinhsl/common/.libs coinhsl/common/_libs + -rm -rf coinhsl/hsl_ma77/.libs coinhsl/hsl_ma77/_libs + -rm -rf coinhsl/hsl_ma77/C/.libs coinhsl/hsl_ma77/C/_libs + -rm -rf coinhsl/hsl_ma86/.libs coinhsl/hsl_ma86/_libs + -rm -rf coinhsl/hsl_ma86/C/.libs coinhsl/hsl_ma86/C/_libs + -rm -rf coinhsl/hsl_ma97/.libs coinhsl/hsl_ma97/_libs + -rm -rf coinhsl/hsl_ma97/C/.libs coinhsl/hsl_ma97/C/_libs + -rm -rf coinhsl/hsl_mc68/C/.libs coinhsl/hsl_mc68/C/_libs + -rm -rf coinhsl/ma27/.libs coinhsl/ma27/_libs + -rm -rf coinhsl/ma28/.libs coinhsl/ma28/_libs + -rm -rf coinhsl/ma57/.libs coinhsl/ma57/_libs + -rm -rf coinhsl/mc19/.libs coinhsl/mc19/_libs + +distclean-libtool: + -rm -f libtool config.lt +install-pkgconfiglibDATA: $(pkgconfiglib_DATA) + @$(NORMAL_INSTALL) + @list='$(pkgconfiglib_DATA)'; test -n "$(pkgconfiglibdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfiglibdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pkgconfiglibdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfiglibdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfiglibdir)" || exit $$?; \ + done + +uninstall-pkgconfiglibDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkgconfiglib_DATA)'; test -n "$(pkgconfiglibdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(pkgconfiglibdir)'; $(am__uninstall_files_from_dir) +install-includecoinHEADERS: $(includecoin_HEADERS) + @$(NORMAL_INSTALL) + @list='$(includecoin_HEADERS)'; test -n "$(includecoindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(includecoindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(includecoindir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includecoindir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(includecoindir)" || exit $$?; \ + done + +uninstall-includecoinHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(includecoin_HEADERS)'; test -n "$(includecoindir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(includecoindir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscope: cscope.files + test ! -s cscope.files \ + || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) +clean-cscope: + -rm -f cscope.files +cscope.files: clean-cscope cscopelist +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + -rm -f cscope.out cscope.in.out cscope.po.out cscope.files +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) config.h \ + CoinHslConfig.h +installdirs: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgconfiglibdir)" "$(DESTDIR)$(includecoindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f coinhsl/common/$(DEPDIR)/$(am__dirstamp) + -rm -f coinhsl/common/$(am__dirstamp) + -rm -f coinhsl/hsl_ma77/$(DEPDIR)/$(am__dirstamp) + -rm -f coinhsl/hsl_ma77/$(am__dirstamp) + -rm -f coinhsl/hsl_ma77/C/$(DEPDIR)/$(am__dirstamp) + -rm -f coinhsl/hsl_ma77/C/$(am__dirstamp) + -rm -f coinhsl/hsl_ma86/$(DEPDIR)/$(am__dirstamp) + -rm -f coinhsl/hsl_ma86/$(am__dirstamp) + -rm -f coinhsl/hsl_ma86/C/$(DEPDIR)/$(am__dirstamp) + -rm -f coinhsl/hsl_ma86/C/$(am__dirstamp) + -rm -f coinhsl/hsl_ma97/$(DEPDIR)/$(am__dirstamp) + -rm -f coinhsl/hsl_ma97/$(am__dirstamp) + -rm -f coinhsl/hsl_ma97/C/$(DEPDIR)/$(am__dirstamp) + -rm -f coinhsl/hsl_ma97/C/$(am__dirstamp) + -rm -f coinhsl/hsl_mc68/C/$(DEPDIR)/$(am__dirstamp) + -rm -f coinhsl/hsl_mc68/C/$(am__dirstamp) + -rm -f coinhsl/ma27/$(DEPDIR)/$(am__dirstamp) + -rm -f coinhsl/ma27/$(am__dirstamp) + -rm -f coinhsl/ma28/$(DEPDIR)/$(am__dirstamp) + -rm -f coinhsl/ma28/$(am__dirstamp) + -rm -f coinhsl/ma57/$(DEPDIR)/$(am__dirstamp) + -rm -f coinhsl/ma57/$(am__dirstamp) + -rm -f coinhsl/mc19/$(DEPDIR)/$(am__dirstamp) + -rm -f coinhsl/mc19/$(am__dirstamp) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -f ./$(DEPDIR)/metis_adapter.Plo + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-hdr distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-includecoinHEADERS install-pkgconfiglibDATA + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-libLTLIBRARIES + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -f ./$(DEPDIR)/metis_adapter.Plo + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-includecoinHEADERS uninstall-libLTLIBRARIES \ + uninstall-pkgconfiglibDATA + +.MAKE: all install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles am--refresh check \ + check-am clean clean-cscope clean-generic clean-libLTLIBRARIES \ + clean-libtool cscope cscopelist-am ctags ctags-am distclean \ + distclean-compile distclean-generic distclean-hdr \ + distclean-libtool distclean-tags dvi dvi-am html html-am info \ + info-am install install-am install-data install-data-am \ + install-dvi install-dvi-am install-exec install-exec-am \ + install-html install-html-am install-includecoinHEADERS \ + install-info install-info-am install-libLTLIBRARIES \ + install-man install-pdf install-pdf-am \ + install-pkgconfiglibDATA install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ + uninstall-includecoinHEADERS uninstall-libLTLIBRARIES \ + uninstall-pkgconfiglibDATA + +.PRECIOUS: Makefile + +@COIN_HAS_METIS_TRUE@ # call coinmetis_nodend from metis_adapter.c instead of metis_nodend in common/deps90.f90 +@COIN_HAS_METIS_TRUE@ # call COINMETIS_NODEND from metis_adapter.c instead of METIS_NODEND in ma57/ma57d.f +$(ma77).lo: deps90.lo +$(ma86).lo: deps90.lo +$(ma97).lo: deps90.lo +$(ma77)_ciface.lo: $(ma77).lo +$(ma86)_ciface.lo: $(ma86).lo +$(ma97)_ciface.lo: $(ma97).lo +$(mc68)_ciface.lo: deps90.lo + +test: + @echo "No test available for HSL." + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/README.md b/README.md new file mode 100644 index 0000000..361ec77 --- /dev/null +++ b/README.md @@ -0,0 +1,61 @@ +# ThirdParty-HSL + +This is an autotools-based build system to build and install routines from +the [Harwell Subroutine Library](http://www.hsl.rl.ac.uk/) (HSL). +This installation of HSL routines is used by some other COIN-OR projects, +in particular [Ipopt](https://github.com/coin-or/Ipopt). + +For use by COIN-OR, STFC provides special packages at + +http://www.hsl.rl.ac.uk/ipopt/ + +which can be build independently or within the buildsystem in this +directory. + +## Dependencies + +- HSL routines require a Fortran compiler. + Some of them are written in Fortran 77, others in Fortran 90. + +- MA57, HSL_MA77, and HSL_MA86 require BLAS, HSL_MA97 requires LAPACK. + `configure` will look for a LAPACK installation (and assume that it + includes BLAS), but if that does not succeed, the flags to link with LAPACK + should be specified with the `--with-lapack-lflags` argument of `configure`. + +- MA57, HSL_MA77, HSL_MA97, and MC68 can use METIS. `configure` will look + for a METIS library and header, but if that does not succeed, the + arguments `--with-metis-lflags` and `--with-metis-cflags` can be + specified for `configure`. + + Both Metis 4 and Metis 5 can be used with ThirdParty-HSL. + +## Installation steps + +1. Obtain an archive with HSL source code from http://www.hsl.rl.ac.uk/ipopt/. + + ********************************************************************** + Note: It is YOUR RESPONSIBILITY to ensure that you are entitled to + download and use this third party package. + ********************************************************************** + +2. Unpack this archive via + + gunzip coinhsl-x.y.z.tar.gz + tar xf coinhsl-x.y.z.tar + +3. Rename the directory `coinhsl-x.y.z` to `coinhsl`, or set a symbolic link: + + ln -s coinhsl-x.y.z coinhsl + +4. Run `./configure`. Use `./configure --help` to see available options. + + The `configure` script will detect which source files are available + in your `coinhsl` package and prepare the `Makefile` accordingly. + + Note, that in difference to previous versions of `ThirdParty-HSL`, the + `configure` script now checks for the HSL routines in subdirectories + as they are given in the `coinhsl-x.y.z.tar.gz` archive. + +5. Run `make` to build the HSL library (namestem `coinhsl`). + +6. Run `make install` to install the HSL library and header files. diff --git a/ar-lib b/ar-lib new file mode 100755 index 0000000..1e9388e --- /dev/null +++ b/ar-lib @@ -0,0 +1,271 @@ +#! /bin/sh +# Wrapper for Microsoft lib.exe + +me=ar-lib +scriptversion=2019-07-04.01; # UTC + +# Copyright (C) 2010-2020 Free Software Foundation, Inc. +# Written by Peter Rosin . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + + +# func_error message +func_error () +{ + echo "$me: $1" 1>&2 + exit 1 +} + +file_conv= + +# func_file_conv build_file +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN* | MSYS*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv in + mingw) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin | msys) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_at_file at_file operation archive +# Iterate over all members in AT_FILE performing OPERATION on ARCHIVE +# for each of them. +# When interpreting the content of the @FILE, do NOT use func_file_conv, +# since the user would need to supply preconverted file names to +# binutils ar, at least for MinGW. +func_at_file () +{ + operation=$2 + archive=$3 + at_file_contents=`cat "$1"` + eval set x "$at_file_contents" + shift + + for member + do + $AR -NOLOGO $operation:"$member" "$archive" || exit $? + done +} + +case $1 in + '') + func_error "no command. Try '$0 --help' for more information." + ;; + -h | --h*) + cat <&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@HAVE_MC19_TRUE@am__append_1 = mc19/mc19d.f +@HAVE_MA27_TRUE@am__append_2 = ma27/ma27d.f +@HAVE_MA28_TRUE@am__append_3 = ma28/ma28d.f +@HAVE_MA57_TRUE@am__append_4 = ma57/ma57d.f +@HAVE_MA77_TRUE@am__append_5 = hsl_ma77/C/hsl_ma77d.h +@HAVE_MA77_TRUE@am__append_6 = hsl_ma77/hsl_ma77d.f90 \ +@HAVE_MA77_TRUE@ hsl_ma77/C/hsl_ma77d_ciface.f90 + +@HAVE_MA86_TRUE@am__append_7 = hsl_ma86/C/hsl_ma86d.h +@HAVE_MA86_TRUE@am__append_8 = hsl_ma86/hsl_ma86d.f90 \ +@HAVE_MA86_TRUE@ hsl_ma86/C/hsl_ma86d_ciface.f90 + +@HAVE_MC68_TRUE@am__append_9 = hsl_mc68/C/hsl_mc68i.h +#libcoinhsl_la_SOURCES += hsl_mc68/hsl_mc68i.f90 \ +# hsl_mc68/C/hsl_mc68i_ciface.f90 +@HAVE_MC68_TRUE@am__append_10 = hsl_mc68/C/hsl_mc68i_ciface.f90 +@HAVE_MA97_TRUE@am__append_11 = hsl_ma97/C/hsl_ma97d.h +@HAVE_MA97_TRUE@am__append_12 = hsl_ma97/hsl_ma97d.f90 \ +@HAVE_MA97_TRUE@ hsl_ma97/C/hsl_ma97d_ciface.f90 + +@TARGET_DLL_TRUE@am__append_13 = -no-undefined +@HAVE_METIS_TRUE@am__append_14 = libmetis.la +@HAVE_METIS_TRUE@@TARGET_DLL_TRUE@am__append_15 = -D__VC__ +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_blas.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ + $(am__configure_deps) $(am__include_HEADERS_DIST) \ + $(am__DIST_COMMON) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = config.h CoinHslConfig.h +CONFIG_CLEAN_FILES = coinhsl.pc +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgconfigdir)" \ + "$(DESTDIR)$(includedir)" +LTLIBRARIES = $(lib_LTLIBRARIES) +am__DEPENDENCIES_1 = +@TARGET_DLL_TRUE@libcoinhsl_la_DEPENDENCIES = $(am__DEPENDENCIES_1) +am__libcoinhsl_la_SOURCES_DIST = common/deps90.f90 common/deps.f \ + common/dump.f90 mc19/mc19d.f ma27/ma27d.f ma28/ma28d.f \ + ma57/ma57d.f hsl_ma77/hsl_ma77d.f90 \ + hsl_ma77/C/hsl_ma77d_ciface.f90 hsl_ma86/hsl_ma86d.f90 \ + hsl_ma86/C/hsl_ma86d_ciface.f90 \ + hsl_mc68/C/hsl_mc68i_ciface.f90 hsl_ma97/hsl_ma97d.f90 \ + hsl_ma97/C/hsl_ma97d_ciface.f90 loadmetis/loadmetis.c +am__dirstamp = $(am__leading_dot)dirstamp +@HAVE_MC19_TRUE@am__objects_1 = mc19/mc19d.lo +@HAVE_MA27_TRUE@am__objects_2 = ma27/ma27d.lo +@HAVE_MA28_TRUE@am__objects_3 = ma28/ma28d.lo +@HAVE_MA57_TRUE@am__objects_4 = ma57/ma57d.lo +@HAVE_MA77_TRUE@am__objects_5 = hsl_ma77/hsl_ma77d.lo \ +@HAVE_MA77_TRUE@ hsl_ma77/C/hsl_ma77d_ciface.lo +@HAVE_MA86_TRUE@am__objects_6 = hsl_ma86/hsl_ma86d.lo \ +@HAVE_MA86_TRUE@ hsl_ma86/C/hsl_ma86d_ciface.lo +@HAVE_MC68_TRUE@am__objects_7 = hsl_mc68/C/hsl_mc68i_ciface.lo +@HAVE_MA97_TRUE@am__objects_8 = hsl_ma97/hsl_ma97d.lo \ +@HAVE_MA97_TRUE@ hsl_ma97/C/hsl_ma97d_ciface.lo +am_libcoinhsl_la_OBJECTS = common/deps90.lo common/deps.lo \ + common/dump.lo $(am__objects_1) $(am__objects_2) \ + $(am__objects_3) $(am__objects_4) $(am__objects_5) \ + $(am__objects_6) $(am__objects_7) $(am__objects_8) \ + loadmetis/loadmetis.lo +libcoinhsl_la_OBJECTS = $(am_libcoinhsl_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libcoinhsl_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ + $(AM_FFLAGS) $(FFLAGS) $(libcoinhsl_la_LDFLAGS) $(LDFLAGS) -o \ + $@ +libmetis_la_LIBADD = +@HAVE_METIS_TRUE@nodist_libmetis_la_OBJECTS = \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-balance.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-mfm.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-bucketsort.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-mincover.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-ccgraph.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-minitpart2.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-coarsen.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-minitpart.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-compress.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-mkmetis.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-debug.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-mkwayfmh.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-mkwayrefine.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-estmem.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-mmatch.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-fm.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-mmd.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-fortran.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-mpmetis.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-frename.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-mrefine2.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-graph.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-mrefine.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-initpart.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-mutil.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-kmetis.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-myqsort.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-kvmetis.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-ometis.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-kwayfm.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-parmetis.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-kwayrefine.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-pmetis.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-kwayvolfm.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-pqueue.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-kwayvolrefine.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-refine.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-match.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-mbalance2.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-separator.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-mbalance.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-sfm.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-mcoarsen.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-srefine.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-memory.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-stat.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-mesh.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-meshpart.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-subdomains.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-timing.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-mfm2.lo \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/libmetis_la-util.lo +libmetis_la_OBJECTS = $(nodist_libmetis_la_OBJECTS) +libmetis_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libmetis_la_CFLAGS) \ + $(CFLAGS) $(libmetis_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_METIS_TRUE@am_libmetis_la_rpath = -rpath $(libdir) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +F77COMPILE = $(F77) $(AM_FFLAGS) $(FFLAGS) +LTF77COMPILE = $(LIBTOOL) $(AM_V_lt) --tag=F77 $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(F77) $(AM_FFLAGS) $(FFLAGS) +AM_V_F77 = $(am__v_F77_@AM_V@) +am__v_F77_ = $(am__v_F77_@AM_DEFAULT_V@) +am__v_F77_0 = @echo " F77 " $@; +am__v_F77_1 = +F77LD = $(F77) +F77LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(F77LD) $(AM_FFLAGS) $(FFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_F77LD = $(am__v_F77LD_@AM_V@) +am__v_F77LD_ = $(am__v_F77LD_@AM_DEFAULT_V@) +am__v_F77LD_0 = @echo " F77LD " $@; +am__v_F77LD_1 = +FCCOMPILE = $(FC) $(AM_FCFLAGS) $(FCFLAGS) +LTFCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(FC) $(AM_FCFLAGS) $(FCFLAGS) +AM_V_FC = $(am__v_FC_@AM_V@) +am__v_FC_ = $(am__v_FC_@AM_DEFAULT_V@) +am__v_FC_0 = @echo " FC " $@; +am__v_FC_1 = +FCLD = $(FC) +FCLINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_FCLD = $(am__v_FCLD_@AM_V@) +am__v_FCLD_ = $(am__v_FCLD_@AM_DEFAULT_V@) +am__v_FCLD_0 = @echo " FCLD " $@; +am__v_FCLD_1 = +SOURCES = $(libcoinhsl_la_SOURCES) $(nodist_libmetis_la_SOURCES) +DIST_SOURCES = $(am__libcoinhsl_la_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +DATA = $(pkgconfig_DATA) +am__include_HEADERS_DIST = CoinHslConfig.h hsl_ma77/C/hsl_ma77d.h \ + hsl_ma86/C/hsl_ma86d.h hsl_mc68/C/hsl_mc68i.h \ + hsl_ma97/C/hsl_ma97d.h +HEADERS = $(include_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ + $(LISP)config.h.in CoinHslConfig.h.in +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +CSCOPE = cscope +AM_RECURSIVE_TARGETS = cscope +am__DIST_COMMON = $(srcdir)/CoinHslConfig.h.in $(srcdir)/Makefile.in \ + $(srcdir)/coinhsl.pc.in $(srcdir)/config.h.in ChangeLog README \ + compile config.guess config.sub depcomp install-sh ltmain.sh \ + missing +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + if test -d "$(distdir)"; then \ + find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -rf "$(distdir)" \ + || { sleep 5 && rm -rf "$(distdir)"; }; \ + else :; fi +am__post_remove_distdir = $(am__remove_distdir) +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +DIST_TARGETS = dist-gzip +distuninstallcheck_listfiles = find . -type f -print +am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ + | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BLAS_LIBS = @BLAS_LIBS@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FC = @FC@ +FCFLAGS = @FCFLAGS@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_FC = @ac_ct_FC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = foreign +ACLOCAL_AMFLAGS = -I m4 +lib_LTLIBRARIES = libcoinhsl.la $(am__append_14) +include_HEADERS = CoinHslConfig.h $(am__append_5) $(am__append_7) \ + $(am__append_9) $(am__append_11) +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = coinhsl.pc +libcoinhsl_la_LDFLAGS = -export-symbols $(srcdir)/libcoinhsl.sym \ + $(am__append_13) +libcoinhsl_la_SOURCES = common/deps90.f90 common/deps.f \ + common/dump.f90 $(am__append_1) $(am__append_2) \ + $(am__append_3) $(am__append_4) $(am__append_6) \ + $(am__append_8) $(am__append_10) $(am__append_12) \ + loadmetis/loadmetis.c +EXTRA_DIST = LICENCE libcoinhsl.sym +@TARGET_DLL_TRUE@libcoinhsl_la_LIBADD = ${BLAS_LIBS} +@HAVE_METIS_TRUE@libmetis_la_CFLAGS = -I $(srcdir)/metis-4.0.3/Lib \ +@HAVE_METIS_TRUE@ $(AM_CFLAGS) $(am__append_15) +@HAVE_METIS_TRUE@@TARGET_DLL_TRUE@libmetis_la_LDFLAGS = -no-undefined +@HAVE_METIS_TRUE@nodist_libmetis_la_SOURCES = metis-4.0.3/Lib/balance.c metis-4.0.3/Lib/mfm.c \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/bucketsort.c metis-4.0.3/Lib/mincover.c \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/ccgraph.c metis-4.0.3/Lib/minitpart2.c \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/coarsen.c metis-4.0.3/Lib/minitpart.c \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/compress.c metis-4.0.3/Lib/mkmetis.c \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/debug.c metis-4.0.3/Lib/mkwayfmh.c \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/defs.h metis-4.0.3/Lib/mkwayrefine.c \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/estmem.c metis-4.0.3/Lib/mmatch.c \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/fm.c metis-4.0.3/Lib/mmd.c \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/fortran.c metis-4.0.3/Lib/mpmetis.c \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/frename.c metis-4.0.3/Lib/mrefine2.c \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/graph.c metis-4.0.3/Lib/mrefine.c \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/initpart.c metis-4.0.3/Lib/mutil.c \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/kmetis.c metis-4.0.3/Lib/myqsort.c \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/kvmetis.c metis-4.0.3/Lib/ometis.c \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/kwayfm.c metis-4.0.3/Lib/parmetis.c \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/kwayrefine.c metis-4.0.3/Lib/pmetis.c \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/kwayvolfm.c metis-4.0.3/Lib/pqueue.c \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/kwayvolrefine.c metis-4.0.3/Lib/proto.h \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/macros.h metis-4.0.3/Lib/refine.c \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/match.c metis-4.0.3/Lib/rename.h \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/mbalance2.c metis-4.0.3/Lib/separator.c \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/mbalance.c metis-4.0.3/Lib/sfm.c \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/mcoarsen.c metis-4.0.3/Lib/srefine.c \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/memory.c metis-4.0.3/Lib/stat.c \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/mesh.c metis-4.0.3/Lib/struct.h \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/meshpart.c metis-4.0.3/Lib/subdomains.c \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/metis.h metis-4.0.3/Lib/timing.c \ +@HAVE_METIS_TRUE@ metis-4.0.3/Lib/mfm2.c metis-4.0.3/Lib/util.c + +all: config.h CoinHslConfig.h + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .f .f90 .lo .o .obj +am--refresh: Makefile + @: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +config.h: stamp-h1 + @test -f $@ || rm -f stamp-h1 + @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 + +stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config.h +$(srcdir)/config.h.in: $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +CoinHslConfig.h: stamp-h2 + @test -f $@ || rm -f stamp-h2 + @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h2 + +stamp-h2: $(srcdir)/CoinHslConfig.h.in $(top_builddir)/config.status + @rm -f stamp-h2 + cd $(top_builddir) && $(SHELL) ./config.status CoinHslConfig.h + +distclean-hdr: + -rm -f config.h stamp-h1 CoinHslConfig.h stamp-h2 +coinhsl.pc: $(top_builddir)/config.status $(srcdir)/coinhsl.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ + +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } +common/$(am__dirstamp): + @$(MKDIR_P) common + @: > common/$(am__dirstamp) +common/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) common/$(DEPDIR) + @: > common/$(DEPDIR)/$(am__dirstamp) +common/deps90.lo: common/$(am__dirstamp) \ + common/$(DEPDIR)/$(am__dirstamp) +common/deps.lo: common/$(am__dirstamp) \ + common/$(DEPDIR)/$(am__dirstamp) +common/dump.lo: common/$(am__dirstamp) \ + common/$(DEPDIR)/$(am__dirstamp) +mc19/$(am__dirstamp): + @$(MKDIR_P) mc19 + @: > mc19/$(am__dirstamp) +mc19/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) mc19/$(DEPDIR) + @: > mc19/$(DEPDIR)/$(am__dirstamp) +mc19/mc19d.lo: mc19/$(am__dirstamp) mc19/$(DEPDIR)/$(am__dirstamp) +ma27/$(am__dirstamp): + @$(MKDIR_P) ma27 + @: > ma27/$(am__dirstamp) +ma27/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ma27/$(DEPDIR) + @: > ma27/$(DEPDIR)/$(am__dirstamp) +ma27/ma27d.lo: ma27/$(am__dirstamp) ma27/$(DEPDIR)/$(am__dirstamp) +ma28/$(am__dirstamp): + @$(MKDIR_P) ma28 + @: > ma28/$(am__dirstamp) +ma28/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ma28/$(DEPDIR) + @: > ma28/$(DEPDIR)/$(am__dirstamp) +ma28/ma28d.lo: ma28/$(am__dirstamp) ma28/$(DEPDIR)/$(am__dirstamp) +ma57/$(am__dirstamp): + @$(MKDIR_P) ma57 + @: > ma57/$(am__dirstamp) +ma57/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ma57/$(DEPDIR) + @: > ma57/$(DEPDIR)/$(am__dirstamp) +ma57/ma57d.lo: ma57/$(am__dirstamp) ma57/$(DEPDIR)/$(am__dirstamp) +hsl_ma77/$(am__dirstamp): + @$(MKDIR_P) hsl_ma77 + @: > hsl_ma77/$(am__dirstamp) +hsl_ma77/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) hsl_ma77/$(DEPDIR) + @: > hsl_ma77/$(DEPDIR)/$(am__dirstamp) +hsl_ma77/hsl_ma77d.lo: hsl_ma77/$(am__dirstamp) \ + hsl_ma77/$(DEPDIR)/$(am__dirstamp) +hsl_ma77/C/$(am__dirstamp): + @$(MKDIR_P) hsl_ma77/C + @: > hsl_ma77/C/$(am__dirstamp) +hsl_ma77/C/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) hsl_ma77/C/$(DEPDIR) + @: > hsl_ma77/C/$(DEPDIR)/$(am__dirstamp) +hsl_ma77/C/hsl_ma77d_ciface.lo: hsl_ma77/C/$(am__dirstamp) \ + hsl_ma77/C/$(DEPDIR)/$(am__dirstamp) +hsl_ma86/$(am__dirstamp): + @$(MKDIR_P) hsl_ma86 + @: > hsl_ma86/$(am__dirstamp) +hsl_ma86/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) hsl_ma86/$(DEPDIR) + @: > hsl_ma86/$(DEPDIR)/$(am__dirstamp) +hsl_ma86/hsl_ma86d.lo: hsl_ma86/$(am__dirstamp) \ + hsl_ma86/$(DEPDIR)/$(am__dirstamp) +hsl_ma86/C/$(am__dirstamp): + @$(MKDIR_P) hsl_ma86/C + @: > hsl_ma86/C/$(am__dirstamp) +hsl_ma86/C/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) hsl_ma86/C/$(DEPDIR) + @: > hsl_ma86/C/$(DEPDIR)/$(am__dirstamp) +hsl_ma86/C/hsl_ma86d_ciface.lo: hsl_ma86/C/$(am__dirstamp) \ + hsl_ma86/C/$(DEPDIR)/$(am__dirstamp) +hsl_mc68/C/$(am__dirstamp): + @$(MKDIR_P) hsl_mc68/C + @: > hsl_mc68/C/$(am__dirstamp) +hsl_mc68/C/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) hsl_mc68/C/$(DEPDIR) + @: > hsl_mc68/C/$(DEPDIR)/$(am__dirstamp) +hsl_mc68/C/hsl_mc68i_ciface.lo: hsl_mc68/C/$(am__dirstamp) \ + hsl_mc68/C/$(DEPDIR)/$(am__dirstamp) +hsl_ma97/$(am__dirstamp): + @$(MKDIR_P) hsl_ma97 + @: > hsl_ma97/$(am__dirstamp) +hsl_ma97/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) hsl_ma97/$(DEPDIR) + @: > hsl_ma97/$(DEPDIR)/$(am__dirstamp) +hsl_ma97/hsl_ma97d.lo: hsl_ma97/$(am__dirstamp) \ + hsl_ma97/$(DEPDIR)/$(am__dirstamp) +hsl_ma97/C/$(am__dirstamp): + @$(MKDIR_P) hsl_ma97/C + @: > hsl_ma97/C/$(am__dirstamp) +hsl_ma97/C/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) hsl_ma97/C/$(DEPDIR) + @: > hsl_ma97/C/$(DEPDIR)/$(am__dirstamp) +hsl_ma97/C/hsl_ma97d_ciface.lo: hsl_ma97/C/$(am__dirstamp) \ + hsl_ma97/C/$(DEPDIR)/$(am__dirstamp) +loadmetis/$(am__dirstamp): + @$(MKDIR_P) loadmetis + @: > loadmetis/$(am__dirstamp) +loadmetis/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) loadmetis/$(DEPDIR) + @: > loadmetis/$(DEPDIR)/$(am__dirstamp) +loadmetis/loadmetis.lo: loadmetis/$(am__dirstamp) \ + loadmetis/$(DEPDIR)/$(am__dirstamp) + +libcoinhsl.la: $(libcoinhsl_la_OBJECTS) $(libcoinhsl_la_DEPENDENCIES) $(EXTRA_libcoinhsl_la_DEPENDENCIES) + $(AM_V_F77LD)$(libcoinhsl_la_LINK) -rpath $(libdir) $(libcoinhsl_la_OBJECTS) $(libcoinhsl_la_LIBADD) $(LIBS) +metis-4.0.3/Lib/$(am__dirstamp): + @$(MKDIR_P) metis-4.0.3/Lib + @: > metis-4.0.3/Lib/$(am__dirstamp) +metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) metis-4.0.3/Lib/$(DEPDIR) + @: > metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-balance.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-mfm.lo: metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-bucketsort.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-mincover.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-ccgraph.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-minitpart2.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-coarsen.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-minitpart.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-compress.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-mkmetis.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-debug.lo: metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-mkwayfmh.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-mkwayrefine.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-estmem.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-mmatch.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-fm.lo: metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-mmd.lo: metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-fortran.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-mpmetis.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-frename.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-mrefine2.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-graph.lo: metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-mrefine.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-initpart.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-mutil.lo: metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-kmetis.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-myqsort.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-kvmetis.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-ometis.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-kwayfm.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-parmetis.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-kwayrefine.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-pmetis.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-kwayvolfm.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-pqueue.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-kwayvolrefine.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-refine.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-match.lo: metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-mbalance2.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-separator.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-mbalance.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-sfm.lo: metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-mcoarsen.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-srefine.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-memory.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-stat.lo: metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-mesh.lo: metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-meshpart.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-subdomains.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-timing.lo: \ + metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-mfm2.lo: metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) +metis-4.0.3/Lib/libmetis_la-util.lo: metis-4.0.3/Lib/$(am__dirstamp) \ + metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) + +libmetis.la: $(libmetis_la_OBJECTS) $(libmetis_la_DEPENDENCIES) $(EXTRA_libmetis_la_DEPENDENCIES) + $(AM_V_CCLD)$(libmetis_la_LINK) $(am_libmetis_la_rpath) $(libmetis_la_OBJECTS) $(libmetis_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f common/*.$(OBJEXT) + -rm -f common/*.lo + -rm -f hsl_ma77/*.$(OBJEXT) + -rm -f hsl_ma77/*.lo + -rm -f hsl_ma77/C/*.$(OBJEXT) + -rm -f hsl_ma77/C/*.lo + -rm -f hsl_ma86/*.$(OBJEXT) + -rm -f hsl_ma86/*.lo + -rm -f hsl_ma86/C/*.$(OBJEXT) + -rm -f hsl_ma86/C/*.lo + -rm -f hsl_ma97/*.$(OBJEXT) + -rm -f hsl_ma97/*.lo + -rm -f hsl_ma97/C/*.$(OBJEXT) + -rm -f hsl_ma97/C/*.lo + -rm -f hsl_mc68/C/*.$(OBJEXT) + -rm -f hsl_mc68/C/*.lo + -rm -f loadmetis/*.$(OBJEXT) + -rm -f loadmetis/*.lo + -rm -f ma27/*.$(OBJEXT) + -rm -f ma27/*.lo + -rm -f ma28/*.$(OBJEXT) + -rm -f ma28/*.lo + -rm -f ma57/*.$(OBJEXT) + -rm -f ma57/*.lo + -rm -f mc19/*.$(OBJEXT) + -rm -f mc19/*.lo + -rm -f metis-4.0.3/Lib/*.$(OBJEXT) + -rm -f metis-4.0.3/Lib/*.lo + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@loadmetis/$(DEPDIR)/loadmetis.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-balance.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-bucketsort.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-ccgraph.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-coarsen.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-compress.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-debug.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-estmem.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-fm.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-fortran.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-frename.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-graph.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-initpart.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-kmetis.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-kvmetis.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-kwayfm.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-kwayrefine.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-kwayvolfm.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-kwayvolrefine.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-match.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mbalance.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mbalance2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mcoarsen.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-memory.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mesh.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-meshpart.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mfm.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mfm2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mincover.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-minitpart.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-minitpart2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mkmetis.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mkwayfmh.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mkwayrefine.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mmatch.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mmd.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mpmetis.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mrefine.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mrefine2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mutil.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-myqsort.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-ometis.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-parmetis.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-pmetis.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-pqueue.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-refine.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-separator.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-sfm.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-srefine.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-stat.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-subdomains.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-timing.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-util.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +metis-4.0.3/Lib/libmetis_la-balance.lo: metis-4.0.3/Lib/balance.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-balance.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-balance.Tpo -c -o metis-4.0.3/Lib/libmetis_la-balance.lo `test -f 'metis-4.0.3/Lib/balance.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/balance.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-balance.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-balance.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/balance.c' object='metis-4.0.3/Lib/libmetis_la-balance.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-balance.lo `test -f 'metis-4.0.3/Lib/balance.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/balance.c + +metis-4.0.3/Lib/libmetis_la-mfm.lo: metis-4.0.3/Lib/mfm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-mfm.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mfm.Tpo -c -o metis-4.0.3/Lib/libmetis_la-mfm.lo `test -f 'metis-4.0.3/Lib/mfm.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/mfm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mfm.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mfm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/mfm.c' object='metis-4.0.3/Lib/libmetis_la-mfm.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-mfm.lo `test -f 'metis-4.0.3/Lib/mfm.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/mfm.c + +metis-4.0.3/Lib/libmetis_la-bucketsort.lo: metis-4.0.3/Lib/bucketsort.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-bucketsort.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-bucketsort.Tpo -c -o metis-4.0.3/Lib/libmetis_la-bucketsort.lo `test -f 'metis-4.0.3/Lib/bucketsort.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/bucketsort.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-bucketsort.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-bucketsort.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/bucketsort.c' object='metis-4.0.3/Lib/libmetis_la-bucketsort.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-bucketsort.lo `test -f 'metis-4.0.3/Lib/bucketsort.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/bucketsort.c + +metis-4.0.3/Lib/libmetis_la-mincover.lo: metis-4.0.3/Lib/mincover.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-mincover.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mincover.Tpo -c -o metis-4.0.3/Lib/libmetis_la-mincover.lo `test -f 'metis-4.0.3/Lib/mincover.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/mincover.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mincover.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mincover.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/mincover.c' object='metis-4.0.3/Lib/libmetis_la-mincover.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-mincover.lo `test -f 'metis-4.0.3/Lib/mincover.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/mincover.c + +metis-4.0.3/Lib/libmetis_la-ccgraph.lo: metis-4.0.3/Lib/ccgraph.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-ccgraph.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-ccgraph.Tpo -c -o metis-4.0.3/Lib/libmetis_la-ccgraph.lo `test -f 'metis-4.0.3/Lib/ccgraph.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/ccgraph.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-ccgraph.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-ccgraph.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/ccgraph.c' object='metis-4.0.3/Lib/libmetis_la-ccgraph.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-ccgraph.lo `test -f 'metis-4.0.3/Lib/ccgraph.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/ccgraph.c + +metis-4.0.3/Lib/libmetis_la-minitpart2.lo: metis-4.0.3/Lib/minitpart2.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-minitpart2.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-minitpart2.Tpo -c -o metis-4.0.3/Lib/libmetis_la-minitpart2.lo `test -f 'metis-4.0.3/Lib/minitpart2.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/minitpart2.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-minitpart2.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-minitpart2.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/minitpart2.c' object='metis-4.0.3/Lib/libmetis_la-minitpart2.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-minitpart2.lo `test -f 'metis-4.0.3/Lib/minitpart2.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/minitpart2.c + +metis-4.0.3/Lib/libmetis_la-coarsen.lo: metis-4.0.3/Lib/coarsen.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-coarsen.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-coarsen.Tpo -c -o metis-4.0.3/Lib/libmetis_la-coarsen.lo `test -f 'metis-4.0.3/Lib/coarsen.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/coarsen.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-coarsen.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-coarsen.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/coarsen.c' object='metis-4.0.3/Lib/libmetis_la-coarsen.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-coarsen.lo `test -f 'metis-4.0.3/Lib/coarsen.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/coarsen.c + +metis-4.0.3/Lib/libmetis_la-minitpart.lo: metis-4.0.3/Lib/minitpart.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-minitpart.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-minitpart.Tpo -c -o metis-4.0.3/Lib/libmetis_la-minitpart.lo `test -f 'metis-4.0.3/Lib/minitpart.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/minitpart.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-minitpart.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-minitpart.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/minitpart.c' object='metis-4.0.3/Lib/libmetis_la-minitpart.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-minitpart.lo `test -f 'metis-4.0.3/Lib/minitpart.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/minitpart.c + +metis-4.0.3/Lib/libmetis_la-compress.lo: metis-4.0.3/Lib/compress.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-compress.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-compress.Tpo -c -o metis-4.0.3/Lib/libmetis_la-compress.lo `test -f 'metis-4.0.3/Lib/compress.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/compress.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-compress.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-compress.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/compress.c' object='metis-4.0.3/Lib/libmetis_la-compress.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-compress.lo `test -f 'metis-4.0.3/Lib/compress.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/compress.c + +metis-4.0.3/Lib/libmetis_la-mkmetis.lo: metis-4.0.3/Lib/mkmetis.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-mkmetis.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mkmetis.Tpo -c -o metis-4.0.3/Lib/libmetis_la-mkmetis.lo `test -f 'metis-4.0.3/Lib/mkmetis.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/mkmetis.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mkmetis.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mkmetis.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/mkmetis.c' object='metis-4.0.3/Lib/libmetis_la-mkmetis.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-mkmetis.lo `test -f 'metis-4.0.3/Lib/mkmetis.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/mkmetis.c + +metis-4.0.3/Lib/libmetis_la-debug.lo: metis-4.0.3/Lib/debug.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-debug.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-debug.Tpo -c -o metis-4.0.3/Lib/libmetis_la-debug.lo `test -f 'metis-4.0.3/Lib/debug.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/debug.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-debug.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-debug.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/debug.c' object='metis-4.0.3/Lib/libmetis_la-debug.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-debug.lo `test -f 'metis-4.0.3/Lib/debug.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/debug.c + +metis-4.0.3/Lib/libmetis_la-mkwayfmh.lo: metis-4.0.3/Lib/mkwayfmh.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-mkwayfmh.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mkwayfmh.Tpo -c -o metis-4.0.3/Lib/libmetis_la-mkwayfmh.lo `test -f 'metis-4.0.3/Lib/mkwayfmh.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/mkwayfmh.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mkwayfmh.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mkwayfmh.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/mkwayfmh.c' object='metis-4.0.3/Lib/libmetis_la-mkwayfmh.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-mkwayfmh.lo `test -f 'metis-4.0.3/Lib/mkwayfmh.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/mkwayfmh.c + +metis-4.0.3/Lib/libmetis_la-mkwayrefine.lo: metis-4.0.3/Lib/mkwayrefine.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-mkwayrefine.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mkwayrefine.Tpo -c -o metis-4.0.3/Lib/libmetis_la-mkwayrefine.lo `test -f 'metis-4.0.3/Lib/mkwayrefine.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/mkwayrefine.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mkwayrefine.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mkwayrefine.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/mkwayrefine.c' object='metis-4.0.3/Lib/libmetis_la-mkwayrefine.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-mkwayrefine.lo `test -f 'metis-4.0.3/Lib/mkwayrefine.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/mkwayrefine.c + +metis-4.0.3/Lib/libmetis_la-estmem.lo: metis-4.0.3/Lib/estmem.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-estmem.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-estmem.Tpo -c -o metis-4.0.3/Lib/libmetis_la-estmem.lo `test -f 'metis-4.0.3/Lib/estmem.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/estmem.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-estmem.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-estmem.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/estmem.c' object='metis-4.0.3/Lib/libmetis_la-estmem.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-estmem.lo `test -f 'metis-4.0.3/Lib/estmem.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/estmem.c + +metis-4.0.3/Lib/libmetis_la-mmatch.lo: metis-4.0.3/Lib/mmatch.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-mmatch.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mmatch.Tpo -c -o metis-4.0.3/Lib/libmetis_la-mmatch.lo `test -f 'metis-4.0.3/Lib/mmatch.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/mmatch.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mmatch.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mmatch.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/mmatch.c' object='metis-4.0.3/Lib/libmetis_la-mmatch.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-mmatch.lo `test -f 'metis-4.0.3/Lib/mmatch.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/mmatch.c + +metis-4.0.3/Lib/libmetis_la-fm.lo: metis-4.0.3/Lib/fm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-fm.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-fm.Tpo -c -o metis-4.0.3/Lib/libmetis_la-fm.lo `test -f 'metis-4.0.3/Lib/fm.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/fm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-fm.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-fm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/fm.c' object='metis-4.0.3/Lib/libmetis_la-fm.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-fm.lo `test -f 'metis-4.0.3/Lib/fm.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/fm.c + +metis-4.0.3/Lib/libmetis_la-mmd.lo: metis-4.0.3/Lib/mmd.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-mmd.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mmd.Tpo -c -o metis-4.0.3/Lib/libmetis_la-mmd.lo `test -f 'metis-4.0.3/Lib/mmd.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/mmd.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mmd.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mmd.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/mmd.c' object='metis-4.0.3/Lib/libmetis_la-mmd.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-mmd.lo `test -f 'metis-4.0.3/Lib/mmd.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/mmd.c + +metis-4.0.3/Lib/libmetis_la-fortran.lo: metis-4.0.3/Lib/fortran.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-fortran.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-fortran.Tpo -c -o metis-4.0.3/Lib/libmetis_la-fortran.lo `test -f 'metis-4.0.3/Lib/fortran.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/fortran.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-fortran.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-fortran.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/fortran.c' object='metis-4.0.3/Lib/libmetis_la-fortran.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-fortran.lo `test -f 'metis-4.0.3/Lib/fortran.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/fortran.c + +metis-4.0.3/Lib/libmetis_la-mpmetis.lo: metis-4.0.3/Lib/mpmetis.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-mpmetis.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mpmetis.Tpo -c -o metis-4.0.3/Lib/libmetis_la-mpmetis.lo `test -f 'metis-4.0.3/Lib/mpmetis.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/mpmetis.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mpmetis.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mpmetis.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/mpmetis.c' object='metis-4.0.3/Lib/libmetis_la-mpmetis.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-mpmetis.lo `test -f 'metis-4.0.3/Lib/mpmetis.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/mpmetis.c + +metis-4.0.3/Lib/libmetis_la-frename.lo: metis-4.0.3/Lib/frename.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-frename.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-frename.Tpo -c -o metis-4.0.3/Lib/libmetis_la-frename.lo `test -f 'metis-4.0.3/Lib/frename.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/frename.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-frename.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-frename.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/frename.c' object='metis-4.0.3/Lib/libmetis_la-frename.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-frename.lo `test -f 'metis-4.0.3/Lib/frename.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/frename.c + +metis-4.0.3/Lib/libmetis_la-mrefine2.lo: metis-4.0.3/Lib/mrefine2.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-mrefine2.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mrefine2.Tpo -c -o metis-4.0.3/Lib/libmetis_la-mrefine2.lo `test -f 'metis-4.0.3/Lib/mrefine2.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/mrefine2.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mrefine2.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mrefine2.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/mrefine2.c' object='metis-4.0.3/Lib/libmetis_la-mrefine2.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-mrefine2.lo `test -f 'metis-4.0.3/Lib/mrefine2.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/mrefine2.c + +metis-4.0.3/Lib/libmetis_la-graph.lo: metis-4.0.3/Lib/graph.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-graph.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-graph.Tpo -c -o metis-4.0.3/Lib/libmetis_la-graph.lo `test -f 'metis-4.0.3/Lib/graph.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/graph.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-graph.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-graph.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/graph.c' object='metis-4.0.3/Lib/libmetis_la-graph.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-graph.lo `test -f 'metis-4.0.3/Lib/graph.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/graph.c + +metis-4.0.3/Lib/libmetis_la-mrefine.lo: metis-4.0.3/Lib/mrefine.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-mrefine.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mrefine.Tpo -c -o metis-4.0.3/Lib/libmetis_la-mrefine.lo `test -f 'metis-4.0.3/Lib/mrefine.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/mrefine.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mrefine.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mrefine.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/mrefine.c' object='metis-4.0.3/Lib/libmetis_la-mrefine.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-mrefine.lo `test -f 'metis-4.0.3/Lib/mrefine.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/mrefine.c + +metis-4.0.3/Lib/libmetis_la-initpart.lo: metis-4.0.3/Lib/initpart.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-initpart.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-initpart.Tpo -c -o metis-4.0.3/Lib/libmetis_la-initpart.lo `test -f 'metis-4.0.3/Lib/initpart.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/initpart.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-initpart.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-initpart.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/initpart.c' object='metis-4.0.3/Lib/libmetis_la-initpart.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-initpart.lo `test -f 'metis-4.0.3/Lib/initpart.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/initpart.c + +metis-4.0.3/Lib/libmetis_la-mutil.lo: metis-4.0.3/Lib/mutil.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-mutil.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mutil.Tpo -c -o metis-4.0.3/Lib/libmetis_la-mutil.lo `test -f 'metis-4.0.3/Lib/mutil.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/mutil.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mutil.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mutil.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/mutil.c' object='metis-4.0.3/Lib/libmetis_la-mutil.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-mutil.lo `test -f 'metis-4.0.3/Lib/mutil.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/mutil.c + +metis-4.0.3/Lib/libmetis_la-kmetis.lo: metis-4.0.3/Lib/kmetis.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-kmetis.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-kmetis.Tpo -c -o metis-4.0.3/Lib/libmetis_la-kmetis.lo `test -f 'metis-4.0.3/Lib/kmetis.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/kmetis.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-kmetis.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-kmetis.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/kmetis.c' object='metis-4.0.3/Lib/libmetis_la-kmetis.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-kmetis.lo `test -f 'metis-4.0.3/Lib/kmetis.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/kmetis.c + +metis-4.0.3/Lib/libmetis_la-myqsort.lo: metis-4.0.3/Lib/myqsort.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-myqsort.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-myqsort.Tpo -c -o metis-4.0.3/Lib/libmetis_la-myqsort.lo `test -f 'metis-4.0.3/Lib/myqsort.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/myqsort.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-myqsort.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-myqsort.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/myqsort.c' object='metis-4.0.3/Lib/libmetis_la-myqsort.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-myqsort.lo `test -f 'metis-4.0.3/Lib/myqsort.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/myqsort.c + +metis-4.0.3/Lib/libmetis_la-kvmetis.lo: metis-4.0.3/Lib/kvmetis.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-kvmetis.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-kvmetis.Tpo -c -o metis-4.0.3/Lib/libmetis_la-kvmetis.lo `test -f 'metis-4.0.3/Lib/kvmetis.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/kvmetis.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-kvmetis.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-kvmetis.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/kvmetis.c' object='metis-4.0.3/Lib/libmetis_la-kvmetis.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-kvmetis.lo `test -f 'metis-4.0.3/Lib/kvmetis.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/kvmetis.c + +metis-4.0.3/Lib/libmetis_la-ometis.lo: metis-4.0.3/Lib/ometis.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-ometis.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-ometis.Tpo -c -o metis-4.0.3/Lib/libmetis_la-ometis.lo `test -f 'metis-4.0.3/Lib/ometis.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/ometis.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-ometis.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-ometis.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/ometis.c' object='metis-4.0.3/Lib/libmetis_la-ometis.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-ometis.lo `test -f 'metis-4.0.3/Lib/ometis.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/ometis.c + +metis-4.0.3/Lib/libmetis_la-kwayfm.lo: metis-4.0.3/Lib/kwayfm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-kwayfm.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-kwayfm.Tpo -c -o metis-4.0.3/Lib/libmetis_la-kwayfm.lo `test -f 'metis-4.0.3/Lib/kwayfm.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/kwayfm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-kwayfm.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-kwayfm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/kwayfm.c' object='metis-4.0.3/Lib/libmetis_la-kwayfm.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-kwayfm.lo `test -f 'metis-4.0.3/Lib/kwayfm.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/kwayfm.c + +metis-4.0.3/Lib/libmetis_la-parmetis.lo: metis-4.0.3/Lib/parmetis.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-parmetis.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-parmetis.Tpo -c -o metis-4.0.3/Lib/libmetis_la-parmetis.lo `test -f 'metis-4.0.3/Lib/parmetis.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/parmetis.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-parmetis.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-parmetis.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/parmetis.c' object='metis-4.0.3/Lib/libmetis_la-parmetis.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-parmetis.lo `test -f 'metis-4.0.3/Lib/parmetis.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/parmetis.c + +metis-4.0.3/Lib/libmetis_la-kwayrefine.lo: metis-4.0.3/Lib/kwayrefine.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-kwayrefine.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-kwayrefine.Tpo -c -o metis-4.0.3/Lib/libmetis_la-kwayrefine.lo `test -f 'metis-4.0.3/Lib/kwayrefine.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/kwayrefine.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-kwayrefine.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-kwayrefine.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/kwayrefine.c' object='metis-4.0.3/Lib/libmetis_la-kwayrefine.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-kwayrefine.lo `test -f 'metis-4.0.3/Lib/kwayrefine.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/kwayrefine.c + +metis-4.0.3/Lib/libmetis_la-pmetis.lo: metis-4.0.3/Lib/pmetis.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-pmetis.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-pmetis.Tpo -c -o metis-4.0.3/Lib/libmetis_la-pmetis.lo `test -f 'metis-4.0.3/Lib/pmetis.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/pmetis.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-pmetis.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-pmetis.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/pmetis.c' object='metis-4.0.3/Lib/libmetis_la-pmetis.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-pmetis.lo `test -f 'metis-4.0.3/Lib/pmetis.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/pmetis.c + +metis-4.0.3/Lib/libmetis_la-kwayvolfm.lo: metis-4.0.3/Lib/kwayvolfm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-kwayvolfm.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-kwayvolfm.Tpo -c -o metis-4.0.3/Lib/libmetis_la-kwayvolfm.lo `test -f 'metis-4.0.3/Lib/kwayvolfm.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/kwayvolfm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-kwayvolfm.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-kwayvolfm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/kwayvolfm.c' object='metis-4.0.3/Lib/libmetis_la-kwayvolfm.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-kwayvolfm.lo `test -f 'metis-4.0.3/Lib/kwayvolfm.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/kwayvolfm.c + +metis-4.0.3/Lib/libmetis_la-pqueue.lo: metis-4.0.3/Lib/pqueue.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-pqueue.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-pqueue.Tpo -c -o metis-4.0.3/Lib/libmetis_la-pqueue.lo `test -f 'metis-4.0.3/Lib/pqueue.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/pqueue.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-pqueue.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-pqueue.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/pqueue.c' object='metis-4.0.3/Lib/libmetis_la-pqueue.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-pqueue.lo `test -f 'metis-4.0.3/Lib/pqueue.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/pqueue.c + +metis-4.0.3/Lib/libmetis_la-kwayvolrefine.lo: metis-4.0.3/Lib/kwayvolrefine.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-kwayvolrefine.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-kwayvolrefine.Tpo -c -o metis-4.0.3/Lib/libmetis_la-kwayvolrefine.lo `test -f 'metis-4.0.3/Lib/kwayvolrefine.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/kwayvolrefine.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-kwayvolrefine.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-kwayvolrefine.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/kwayvolrefine.c' object='metis-4.0.3/Lib/libmetis_la-kwayvolrefine.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-kwayvolrefine.lo `test -f 'metis-4.0.3/Lib/kwayvolrefine.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/kwayvolrefine.c + +metis-4.0.3/Lib/libmetis_la-refine.lo: metis-4.0.3/Lib/refine.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-refine.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-refine.Tpo -c -o metis-4.0.3/Lib/libmetis_la-refine.lo `test -f 'metis-4.0.3/Lib/refine.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/refine.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-refine.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-refine.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/refine.c' object='metis-4.0.3/Lib/libmetis_la-refine.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-refine.lo `test -f 'metis-4.0.3/Lib/refine.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/refine.c + +metis-4.0.3/Lib/libmetis_la-match.lo: metis-4.0.3/Lib/match.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-match.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-match.Tpo -c -o metis-4.0.3/Lib/libmetis_la-match.lo `test -f 'metis-4.0.3/Lib/match.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/match.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-match.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-match.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/match.c' object='metis-4.0.3/Lib/libmetis_la-match.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-match.lo `test -f 'metis-4.0.3/Lib/match.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/match.c + +metis-4.0.3/Lib/libmetis_la-mbalance2.lo: metis-4.0.3/Lib/mbalance2.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-mbalance2.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mbalance2.Tpo -c -o metis-4.0.3/Lib/libmetis_la-mbalance2.lo `test -f 'metis-4.0.3/Lib/mbalance2.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/mbalance2.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mbalance2.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mbalance2.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/mbalance2.c' object='metis-4.0.3/Lib/libmetis_la-mbalance2.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-mbalance2.lo `test -f 'metis-4.0.3/Lib/mbalance2.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/mbalance2.c + +metis-4.0.3/Lib/libmetis_la-separator.lo: metis-4.0.3/Lib/separator.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-separator.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-separator.Tpo -c -o metis-4.0.3/Lib/libmetis_la-separator.lo `test -f 'metis-4.0.3/Lib/separator.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/separator.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-separator.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-separator.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/separator.c' object='metis-4.0.3/Lib/libmetis_la-separator.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-separator.lo `test -f 'metis-4.0.3/Lib/separator.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/separator.c + +metis-4.0.3/Lib/libmetis_la-mbalance.lo: metis-4.0.3/Lib/mbalance.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-mbalance.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mbalance.Tpo -c -o metis-4.0.3/Lib/libmetis_la-mbalance.lo `test -f 'metis-4.0.3/Lib/mbalance.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/mbalance.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mbalance.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mbalance.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/mbalance.c' object='metis-4.0.3/Lib/libmetis_la-mbalance.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-mbalance.lo `test -f 'metis-4.0.3/Lib/mbalance.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/mbalance.c + +metis-4.0.3/Lib/libmetis_la-sfm.lo: metis-4.0.3/Lib/sfm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-sfm.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-sfm.Tpo -c -o metis-4.0.3/Lib/libmetis_la-sfm.lo `test -f 'metis-4.0.3/Lib/sfm.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/sfm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-sfm.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-sfm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/sfm.c' object='metis-4.0.3/Lib/libmetis_la-sfm.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-sfm.lo `test -f 'metis-4.0.3/Lib/sfm.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/sfm.c + +metis-4.0.3/Lib/libmetis_la-mcoarsen.lo: metis-4.0.3/Lib/mcoarsen.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-mcoarsen.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mcoarsen.Tpo -c -o metis-4.0.3/Lib/libmetis_la-mcoarsen.lo `test -f 'metis-4.0.3/Lib/mcoarsen.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/mcoarsen.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mcoarsen.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mcoarsen.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/mcoarsen.c' object='metis-4.0.3/Lib/libmetis_la-mcoarsen.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-mcoarsen.lo `test -f 'metis-4.0.3/Lib/mcoarsen.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/mcoarsen.c + +metis-4.0.3/Lib/libmetis_la-srefine.lo: metis-4.0.3/Lib/srefine.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-srefine.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-srefine.Tpo -c -o metis-4.0.3/Lib/libmetis_la-srefine.lo `test -f 'metis-4.0.3/Lib/srefine.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/srefine.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-srefine.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-srefine.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/srefine.c' object='metis-4.0.3/Lib/libmetis_la-srefine.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-srefine.lo `test -f 'metis-4.0.3/Lib/srefine.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/srefine.c + +metis-4.0.3/Lib/libmetis_la-memory.lo: metis-4.0.3/Lib/memory.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-memory.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-memory.Tpo -c -o metis-4.0.3/Lib/libmetis_la-memory.lo `test -f 'metis-4.0.3/Lib/memory.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/memory.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-memory.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-memory.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/memory.c' object='metis-4.0.3/Lib/libmetis_la-memory.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-memory.lo `test -f 'metis-4.0.3/Lib/memory.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/memory.c + +metis-4.0.3/Lib/libmetis_la-stat.lo: metis-4.0.3/Lib/stat.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-stat.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-stat.Tpo -c -o metis-4.0.3/Lib/libmetis_la-stat.lo `test -f 'metis-4.0.3/Lib/stat.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/stat.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-stat.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-stat.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/stat.c' object='metis-4.0.3/Lib/libmetis_la-stat.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-stat.lo `test -f 'metis-4.0.3/Lib/stat.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/stat.c + +metis-4.0.3/Lib/libmetis_la-mesh.lo: metis-4.0.3/Lib/mesh.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-mesh.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mesh.Tpo -c -o metis-4.0.3/Lib/libmetis_la-mesh.lo `test -f 'metis-4.0.3/Lib/mesh.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/mesh.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mesh.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mesh.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/mesh.c' object='metis-4.0.3/Lib/libmetis_la-mesh.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-mesh.lo `test -f 'metis-4.0.3/Lib/mesh.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/mesh.c + +metis-4.0.3/Lib/libmetis_la-meshpart.lo: metis-4.0.3/Lib/meshpart.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-meshpart.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-meshpart.Tpo -c -o metis-4.0.3/Lib/libmetis_la-meshpart.lo `test -f 'metis-4.0.3/Lib/meshpart.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/meshpart.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-meshpart.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-meshpart.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/meshpart.c' object='metis-4.0.3/Lib/libmetis_la-meshpart.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-meshpart.lo `test -f 'metis-4.0.3/Lib/meshpart.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/meshpart.c + +metis-4.0.3/Lib/libmetis_la-subdomains.lo: metis-4.0.3/Lib/subdomains.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-subdomains.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-subdomains.Tpo -c -o metis-4.0.3/Lib/libmetis_la-subdomains.lo `test -f 'metis-4.0.3/Lib/subdomains.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/subdomains.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-subdomains.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-subdomains.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/subdomains.c' object='metis-4.0.3/Lib/libmetis_la-subdomains.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-subdomains.lo `test -f 'metis-4.0.3/Lib/subdomains.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/subdomains.c + +metis-4.0.3/Lib/libmetis_la-timing.lo: metis-4.0.3/Lib/timing.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-timing.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-timing.Tpo -c -o metis-4.0.3/Lib/libmetis_la-timing.lo `test -f 'metis-4.0.3/Lib/timing.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/timing.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-timing.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-timing.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/timing.c' object='metis-4.0.3/Lib/libmetis_la-timing.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-timing.lo `test -f 'metis-4.0.3/Lib/timing.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/timing.c + +metis-4.0.3/Lib/libmetis_la-mfm2.lo: metis-4.0.3/Lib/mfm2.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-mfm2.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mfm2.Tpo -c -o metis-4.0.3/Lib/libmetis_la-mfm2.lo `test -f 'metis-4.0.3/Lib/mfm2.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/mfm2.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mfm2.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-mfm2.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/mfm2.c' object='metis-4.0.3/Lib/libmetis_la-mfm2.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-mfm2.lo `test -f 'metis-4.0.3/Lib/mfm2.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/mfm2.c + +metis-4.0.3/Lib/libmetis_la-util.lo: metis-4.0.3/Lib/util.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -MT metis-4.0.3/Lib/libmetis_la-util.lo -MD -MP -MF metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-util.Tpo -c -o metis-4.0.3/Lib/libmetis_la-util.lo `test -f 'metis-4.0.3/Lib/util.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/util.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-util.Tpo metis-4.0.3/Lib/$(DEPDIR)/libmetis_la-util.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metis-4.0.3/Lib/util.c' object='metis-4.0.3/Lib/libmetis_la-util.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetis_la_CFLAGS) $(CFLAGS) -c -o metis-4.0.3/Lib/libmetis_la-util.lo `test -f 'metis-4.0.3/Lib/util.c' || echo '$(srcdir)/'`metis-4.0.3/Lib/util.c + +.f.o: + $(AM_V_F77)$(F77COMPILE) -c -o $@ $< + +.f.obj: + $(AM_V_F77)$(F77COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.f.lo: + $(AM_V_F77)$(LTF77COMPILE) -c -o $@ $< + +.f90.o: + $(AM_V_FC)$(FCCOMPILE) -c -o $@ $< + +.f90.obj: + $(AM_V_FC)$(FCCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.f90.lo: + $(AM_V_FC)$(LTFCCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + -rm -rf common/.libs common/_libs + -rm -rf hsl_ma77/.libs hsl_ma77/_libs + -rm -rf hsl_ma77/C/.libs hsl_ma77/C/_libs + -rm -rf hsl_ma86/.libs hsl_ma86/_libs + -rm -rf hsl_ma86/C/.libs hsl_ma86/C/_libs + -rm -rf hsl_ma97/.libs hsl_ma97/_libs + -rm -rf hsl_ma97/C/.libs hsl_ma97/C/_libs + -rm -rf hsl_mc68/C/.libs hsl_mc68/C/_libs + -rm -rf loadmetis/.libs loadmetis/_libs + -rm -rf ma27/.libs ma27/_libs + -rm -rf ma28/.libs ma28/_libs + -rm -rf ma57/.libs ma57/_libs + -rm -rf mc19/.libs mc19/_libs + -rm -rf metis-4.0.3/Lib/.libs metis-4.0.3/Lib/_libs + +distclean-libtool: + -rm -f libtool config.lt +install-pkgconfigDATA: $(pkgconfig_DATA) + @$(NORMAL_INSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ + done + +uninstall-pkgconfigDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) +install-includeHEADERS: $(include_HEADERS) + @$(NORMAL_INSTALL) + @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ + done + +uninstall-includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscope: cscope.files + test ! -s cscope.files \ + || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) +clean-cscope: + -rm -f cscope.files +cscope.files: clean-cscope cscopelist +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + -rm -f cscope.out cscope.in.out cscope.po.out cscope.files + +distdir: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz + $(am__post_remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__post_remove_distdir) + +dist-lzip: distdir + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz + $(am__post_remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__post_remove_distdir) + +dist-tarZ: distdir + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__post_remove_distdir) + +dist-shar: distdir + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz + $(am__post_remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__post_remove_distdir) + +dist dist-all: + $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' + $(am__post_remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lz*) \ + lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir) + chmod u+w $(distdir) + mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build/sub \ + && ../../configure \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + --srcdir=../.. --prefix="$$dc_install_base" \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__post_remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @test -n '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: trying to run $@ with an empty' \ + '$$(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + $(am__cd) '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) config.h \ + CoinHslConfig.h +installdirs: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(includedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f common/$(DEPDIR)/$(am__dirstamp) + -rm -f common/$(am__dirstamp) + -rm -f hsl_ma77/$(DEPDIR)/$(am__dirstamp) + -rm -f hsl_ma77/$(am__dirstamp) + -rm -f hsl_ma77/C/$(DEPDIR)/$(am__dirstamp) + -rm -f hsl_ma77/C/$(am__dirstamp) + -rm -f hsl_ma86/$(DEPDIR)/$(am__dirstamp) + -rm -f hsl_ma86/$(am__dirstamp) + -rm -f hsl_ma86/C/$(DEPDIR)/$(am__dirstamp) + -rm -f hsl_ma86/C/$(am__dirstamp) + -rm -f hsl_ma97/$(DEPDIR)/$(am__dirstamp) + -rm -f hsl_ma97/$(am__dirstamp) + -rm -f hsl_ma97/C/$(DEPDIR)/$(am__dirstamp) + -rm -f hsl_ma97/C/$(am__dirstamp) + -rm -f hsl_mc68/C/$(DEPDIR)/$(am__dirstamp) + -rm -f hsl_mc68/C/$(am__dirstamp) + -rm -f loadmetis/$(DEPDIR)/$(am__dirstamp) + -rm -f loadmetis/$(am__dirstamp) + -rm -f ma27/$(DEPDIR)/$(am__dirstamp) + -rm -f ma27/$(am__dirstamp) + -rm -f ma28/$(DEPDIR)/$(am__dirstamp) + -rm -f ma28/$(am__dirstamp) + -rm -f ma57/$(DEPDIR)/$(am__dirstamp) + -rm -f ma57/$(am__dirstamp) + -rm -f mc19/$(DEPDIR)/$(am__dirstamp) + -rm -f mc19/$(am__dirstamp) + -rm -f metis-4.0.3/Lib/$(DEPDIR)/$(am__dirstamp) + -rm -f metis-4.0.3/Lib/$(am__dirstamp) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool clean-local \ + mostlyclean-am + +distclean: distclean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf loadmetis/$(DEPDIR) metis-4.0.3/Lib/$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-hdr distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-includeHEADERS install-pkgconfigDATA + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-libLTLIBRARIES + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -rf loadmetis/$(DEPDIR) metis-4.0.3/Lib/$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-includeHEADERS uninstall-libLTLIBRARIES \ + uninstall-pkgconfigDATA + +.MAKE: all install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am am--refresh check check-am clean \ + clean-cscope clean-generic clean-libLTLIBRARIES clean-libtool \ + clean-local cscope cscopelist-am ctags ctags-am dist dist-all \ + dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ dist-xz \ + dist-zip distcheck distclean distclean-compile \ + distclean-generic distclean-hdr distclean-libtool \ + distclean-tags distcleancheck distdir distuninstallcheck dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-includeHEADERS install-info install-info-am \ + install-libLTLIBRARIES install-man install-pdf install-pdf-am \ + install-pkgconfigDATA install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am uninstall-includeHEADERS \ + uninstall-libLTLIBRARIES uninstall-pkgconfigDATA + +.PRECIOUS: Makefile + + +# Automake doesn't know much about modules, so get rid of them ourself +clean-local: + -rm *.mod + +hsl_ma86d_ciface.$(OBJEXT): hsl_ma86d.$(OBJEXT) +hsl_ma97d_ciface.$(OBJEXT): hsl_ma97d.$(OBJEXT) +hsl_mc68i_ciface.$(OBJEXT): hsl_mc68i.$(OBJEXT) + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/coinhsl/README b/coinhsl/README new file mode 100644 index 0000000..d410b83 --- /dev/null +++ b/coinhsl/README @@ -0,0 +1,121 @@ +Legal Notice +============ +ALL USAGE OF HSL IS SUBJECT TO LICENCE. PLEASE REFER TO THE FILE 'LICENCE' +DISTRIBUTED WITH THIS SOFTWARE. THIS LICENCE APPLIES TO ALL FILES UNLESS +OTHERWISE INDICATED. IF YOU OBTAINED A COPY OF THIS SOFTWARE WITHOUT THIS FILE, +PLEASE CONTACT HSL@STFC.AC.UK TO OBTAIN ONE. + +In particular: +1) You are obliged to cite HSL in any publication or report as: + "HSL, a collection of Fortran codes for large-scale scientific computation. + See http://www.hsl.rl.ac.uk/" +2) You may not make available to others the software in any form, either as + source or as a precompiled object. + +Introduction +============ +Thanks for downloading HSL software. You can find out more information about +HSL by visiting our website: http://www.hsl.rl.ac.uk/ + +This package is intended to be used exclusively with IPOPT. To obtain the full +version of the packages please download them from the HSL web address above. + +Installation +============ + +For installation under Windows, either use the "WITH IPOPT" option described +below, or refer to the more complicated instructions in the section +"Building Windows DLLs" + +You have three options for installation: +BEFORE IPOPT: Follow the instructions below. Ensure that the Ipopt configure + script can find the resulting library. +WITH IPOPT: To compile this code at the same time as Ipopt, you will need to + rename this directory to 'coinhsl' and place it in the ThirdParty/HSL + subdirectory of your Ipopt source directory before configuring Ipopt. +AFTER IPOPT: For this to work, Ipopt's shared library loading functionality + must be enabled. Compile this code using the instructions below to generate + a shared library and place it in Ipopt's shared library search path. + +Note: Using this code is not compatible with older versions of Ipopt that were +configured to build seperate HSL sources. + +Compilation follows the standard process: + ./configure + make + +To install the library, module and header files into /usr/local you may +use the following command (this may require root permissions): + make install + +To use the library, ensure that the library libcoinhsl.so can be found +by both the linker and the dynamic library loader. You can either add the +path to the ldconfig configuration, or explicitly set the environment +variable LD_LIBRARY_PATH. + +For further options, including installation in locations other than +/usr/local and specifying the use of particular Fortran compilers and +compile flags please run + ./configure --help + +The file INSTALL contains more detailed information. + +Other libraries +=============== + +To use libcoinhsl.so you MUST ensure that: +* Both HSL and IPOPT are compiled with compatible C++ and Fortran compilers, + for example g++ and gfortran. +* A BLAS library is available. This library is usually supplied by your + computer processor vendor (eg Intel MKL), and using a good one is critical + to performance. + If you are unable to locate a vendor BLAS then you should use either + the Goto or ATLAS BLAS (the latter is often available as part of + your linux distribution). + Using the reference BLAS from netlib can often be ten times slower. + +It is RECOMMENDED that: +* The METIS matrix ordering routines are available. This can be achieved by + compiling them as part of IPOPT, see the IPOPT documentation for futher + details. +* Both HSL and IPOPT are compiled using the compiler's OpenMP flags (normally + some variant of -openmp or -fopenmp). The easiest way to do this is to + specify at configure time ./configure CXXFLAGS=-openmp FCFLAGS=-openmp + +Building Windows DLLs +===================== + +Summary: +0) tar -zxvpf /path/to/metis-4.0.3.tar.gz +1) ./configure --with-blas="-L/path/to/blas/dir -lblas" +2) make +3a) cp .libs/libcoinhsl-0.dll /install/path/libhsl.dll +3b) cp .libs/libmetis-0.dll /install/path/libmetis.dll + +These instructions have only been tested under MinGW. Your mileage may vary +with cygwin or other build tools. + +Notes on steps: + +0) By placing the metis-4.0.3 directory in the root of this package, the build +scripts will compile it to a DLL for you. The libhsl.dll produced can then call metis (or any libmetis.dll produced in another way). + +1) As Windows DLLs require all symbols to be defined internally, the build +process requires a BLAS library DLL to be available. It can be supplied using +the --with-blas= option to configure. The library must be specified in the form +"-L/path -lblas" and not "/path/blas.dll" as only the former is supported by +libtool for shared library dependencies. Note that the BLAS library DLL is +merged with the HSL objects to create the new self contained libhsl.dll. + +2) The make command will compile static and DLL versions of the code and +place them in the hidden .libs directory. + +3) Rather than make install, copy and rename the files to their desired +locations. Ipopt explicitly searches for "libhsl.dll" while this package +explicitly searches for "libmetis.dll". + +You may also need to copy the following MinGW DLLs to run outside of a MinGW +environment: +libgcc_s_dw2-1.dll +libgfortran-3.dll +libquadmath-0.dll diff --git a/coinhsl/aclocal.m4 b/coinhsl/aclocal.m4 new file mode 100644 index 0000000..e0e12ab --- /dev/null +++ b/coinhsl/aclocal.m4 @@ -0,0 +1,1158 @@ +# generated automatically by aclocal 1.15.1 -*- Autoconf -*- + +# Copyright (C) 1996-2017 Free Software Foundation, Inc. + +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, +[m4_warning([this file was generated for autoconf 2.69. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically 'autoreconf'.])]) + +# Copyright (C) 2002-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.15' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.15.1], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.15.1])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to +# '$srcdir', '$srcdir/..', or '$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is '.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ([2.52])dnl + m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], + [$1], [CXX], [depcc="$CXX" am_compiler_list=], + [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], + [$1], [UPC], [depcc="$UPC" am_compiler_list=], + [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES. +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE([dependency-tracking], [dnl +AS_HELP_STRING( + [--enable-dependency-tracking], + [do not reject slow dependency extractors]) +AS_HELP_STRING( + [--disable-dependency-tracking], + [speeds up one-time build])]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "$am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each '.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. +m4_define([AC_PROG_CC], +m4_defn([AC_PROG_CC]) +[_AM_PROG_CC_C_O +]) + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.65])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[AC_DIAGNOSE([obsolete], + [$0: two- and three-arguments forms are deprecated.]) +m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if( + m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), + [ok:ok],, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) + AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +AM_MISSING_PROG([AUTOCONF], [autoconf]) +AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +AM_MISSING_PROG([AUTOHEADER], [autoheader]) +AM_MISSING_PROG([MAKEINFO], [makeinfo]) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +AC_SUBST([mkdir_p], ['$(MKDIR_P)']) +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES([CC])], + [m4_define([AC_PROG_CC], + m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES([CXX])], + [m4_define([AC_PROG_CXX], + m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES([OBJC])], + [m4_define([AC_PROG_OBJC], + m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], + [_AM_DEPENDENCIES([OBJCXX])], + [m4_define([AC_PROG_OBJCXX], + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl +]) +AC_REQUIRE([AM_SILENT_RULES])dnl +dnl The testsuite driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This +dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) + fi +fi +dnl The trailing newline in this macro's definition is deliberate, for +dnl backward compatibility and to allow trailing 'dnl'-style comments +dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. +]) + +dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST([install_sh])]) + +# Copyright (C) 2003-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it is modern enough. +# If it is, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + AC_MSG_WARN(['missing' script is too old or missing]) +fi +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# -------------------- +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) + +# _AM_SET_OPTIONS(OPTIONS) +# ------------------------ +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Copyright (C) 1999-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_CC_C_O +# --------------- +# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC +# to automatically call this. +AC_DEFUN([_AM_PROG_CC_C_O], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +AC_LANG_PUSH([C])dnl +AC_CACHE_CHECK( + [whether $CC understands -c and -o together], + [am_cv_prog_cc_c_o], + [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i]) +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +AC_LANG_POP([C])]) + +# For backward compatibility. +AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) + +# Copyright (C) 2001-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_RUN_LOG(COMMAND) +# ------------------- +# Run COMMAND, save the exit status in ac_status, and log it. +# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) +AC_DEFUN([AM_RUN_LOG], +[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken + alias in your environment]) + fi + if test "$[2]" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT([yes]) +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi +AC_CONFIG_COMMANDS_PRE( + [AC_MSG_CHECKING([that generated files are newer than configure]) + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + AC_MSG_RESULT([done])]) +rm -f conftest.file +]) + +# Copyright (C) 2009-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# ("yes" being less verbose, "no" or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], [dnl +AS_HELP_STRING( + [--enable-silent-rules], + [less verbose build output (undo: "make V=1")]) +AS_HELP_STRING( + [--disable-silent-rules], + [verbose build output (undo: "make V=0")])dnl +]) +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) + +# Copyright (C) 2001-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor 'install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in "make install-strip", and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# -------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of 'v7', 'ustar', or 'pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +# +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' + +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + + [m4_case([$1], + [ustar], + [# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) + if test $am_uid -le $am_max_uid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi + AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) + if test $am_gid -le $am_max_gid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi], + + [pax], + [], + + [m4_fatal([Unknown tar format])]) + + AC_MSG_CHECKING([how to create a $1 tar archive]) + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_$1-$_am_tools} + + for _am_tool in $_am_tools; do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works. + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi + done + rm -rf conftest.dir + + AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) + AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + +m4_include([m4/ax_blas.m4]) +m4_include([m4/libtool.m4]) +m4_include([m4/ltoptions.m4]) +m4_include([m4/ltsugar.m4]) +m4_include([m4/ltversion.m4]) +m4_include([m4/lt~obsolete.m4]) diff --git a/coinhsl/coinhsl.pc.in b/coinhsl/coinhsl.pc.in new file mode 100644 index 0000000..6aa5c97 --- /dev/null +++ b/coinhsl/coinhsl.pc.in @@ -0,0 +1,11 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: HSL +Description: HSL Mathematical Software Library compiled for COIN-OR +Version: @PACKAGE_VERSION@ +Libs: -L${libdir} -lcoinhsl +Cflags: -I${includedir} +Requires: diff --git a/coinhsl/common/.deps/.dirstamp b/coinhsl/common/.deps/.dirstamp new file mode 100644 index 0000000..e69de29 diff --git a/coinhsl/common/.dirstamp b/coinhsl/common/.dirstamp new file mode 100644 index 0000000..e69de29 diff --git a/coinhsl/common/.libs/deps.o b/coinhsl/common/.libs/deps.o new file mode 100644 index 0000000000000000000000000000000000000000..ba87fe6e1e25bd859c5231374d68a2bc7e659c2e GIT binary patch literal 170632 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 z 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 z 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 S==e``m$Nl=y#vk}s7E|MI_mSTQC@5p>t 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 msv>`Za?>;MVmRlK>6V>^cjvZQ_#X>m7nsgc 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

    9PAi>JQ;lKXbO&)y2z<1w=|@XSWqa6TatN< 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 literal 0 HcmV?d00001 diff --git a/coinhsl/common/deps.f b/coinhsl/common/deps.f new file mode 100644 index 0000000..28a375d --- /dev/null +++ b/coinhsl/common/deps.f @@ -0,0 +1,12479 @@ +! F77 dependencies +* COPYRIGHT (c) 1988 AEA Technology +* Original date 17 Feb 2005 + +C 17th February 2005 Version 1.0.0. Replacement for FD05. + + DOUBLE PRECISION FUNCTION FD15AD(T) +C---------------------------------------------------------------- +C Fortran 77 implementation of the Fortran 90 intrinsic +C functions: EPSILON, TINY, HUGE and RADIX. Note that +C the RADIX result is returned as DOUBLE PRECISION. +C +C The CHARACTER argument specifies the type of result: +C +C 'E' smallest positive real number: 1.0 + DC(1) > 1.0, i.e. +C EPSILON(DOUBLE PRECISION) +C 'T' smallest full precision positive real number, i.e. +C TINY(DOUBLE PRECISION) +C 'H' largest finite positive real number, i.e. +C HUGE(DOUBLE PRECISION) +C 'R' the base of the floating point arithematic, i.e. +C RADIX(DOUBLE PRECISION) +C +C any other value gives a result of zero. +C---------------------------------------------------------------- + CHARACTER T + + IF ( T.EQ.'E' ) THEN + FD15AD = EPSILON(1.0D0) + ELSE IF ( T.EQ.'T' ) THEN + FD15AD = TINY(1.0D0) + ELSE IF ( T.EQ.'H' ) THEN + FD15AD = HUGE(1.0D0) + ELSE IF ( T.EQ.'R' ) THEN + FD15AD = DBLE(RADIX(1.0D0)) + ELSE + FD15AD = 0.0D0 + ENDIF + RETURN + END +* COPYRIGHT (c) 1980 AEA Technology +* Original date 1 December 1993 +C Toolpack tool decs employed. +C Arg dimensions changed to *. +C 1/4/99 Size of MARK increased to 100. +C 13/3/02 Cosmetic changes applied to reduce single/double differences +C +C 12th July 2004 Version 1.0.0. Version numbering added. + + SUBROUTINE KB07AI(COUNT,N,INDEX) +C +C KB07AI HANDLES INTEGER VARIABLES +C THE WORK-SPACE 'MARK' OF LENGTH 100 PERMITS UP TO 2**50 NUMBERS +C TO BE SORTED. + +C .. Scalar Arguments .. + INTEGER N +C .. +C .. Array Arguments .. + INTEGER COUNT(*) + INTEGER INDEX(*) +C .. +C .. Local Scalars .. + INTEGER AV,X + INTEGER I,IF,IFK,IFKA,INT,INTEST,IP,IS,IS1,IY,J,K,K1,LA,LNGTH,M, + + MLOOP +C .. +C .. Local Arrays .. + INTEGER MARK(100) +C .. +C .. Executable Statements .. +C SET INDEX ARRAY TO ORIGINAL ORDER . + DO 10 I = 1,N + INDEX(I) = I + 10 CONTINUE +C CHECK THAT A TRIVIAL CASE HAS NOT BEEN ENTERED . + IF (N.EQ.1) GO TO 200 + IF (N.GE.1) GO TO 30 + WRITE (6,FMT=20) + + 20 FORMAT (/,/,/,20X,' ***KB07AI** NO NUMBERS TO BE SORTED ** ', + + 'RETURN TO CALLING PROGRAM') + + GO TO 200 +C 'M' IS THE LENGTH OF SEGMENT WHICH IS SHORT ENOUGH TO ENTER +C THE FINAL SORTING ROUTINE. IT MAY BE EASILY CHANGED. + 30 M = 12 +C SET UP INITIAL VALUES. + LA = 2 + IS = 1 + IF = N + DO 190 MLOOP = 1,N +C IF SEGMENT IS SHORT ENOUGH SORT WITH FINAL SORTING ROUTINE . + IFKA = IF - IS + IF ((IFKA+1).GT.M) GO TO 70 +C********* FINAL SORTING *** +C ( A SIMPLE BUBBLE SORT ) + IS1 = IS + 1 + DO 60 J = IS1,IF + I = J + 40 IF (COUNT(I-1).LT.COUNT(I)) GO TO 60 + IF (COUNT(I-1).GT.COUNT(I)) GO TO 50 + IF (INDEX(I-1).LT.INDEX(I)) GO TO 60 + 50 AV = COUNT(I-1) + COUNT(I-1) = COUNT(I) + COUNT(I) = AV + INT = INDEX(I-1) + INDEX(I-1) = INDEX(I) + INDEX(I) = INT + I = I - 1 + IF (I.GT.IS) GO TO 40 + 60 CONTINUE + LA = LA - 2 + GO TO 170 +C ******* QUICKSORT ******** +C SELECT THE NUMBER IN THE CENTRAL POSITION IN THE SEGMENT AS +C THE TEST NUMBER.REPLACE IT WITH THE NUMBER FROM THE SEGMENT'S +C HIGHEST ADDRESS. + 70 IY = (IS+IF)/2 + X = COUNT(IY) + INTEST = INDEX(IY) + COUNT(IY) = COUNT(IF) + INDEX(IY) = INDEX(IF) +C THE MARKERS 'I' AND 'IFK' ARE USED FOR THE BEGINNING AND END +C OF THE SECTION NOT SO FAR TESTED AGAINST THE PRESENT VALUE +C OF X . + K = 1 + IFK = IF +C WE ALTERNATE BETWEEN THE OUTER LOOP THAT INCREASES I AND THE +C INNER LOOP THAT REDUCES IFK, MOVING NUMBERS AND INDICES AS +C NECESSARY, UNTIL THEY MEET . + DO 110 I = IS,IF + IF (X.GT.COUNT(I)) GO TO 110 + IF (X.LT.COUNT(I)) GO TO 80 + IF (INTEST.GT.INDEX(I)) GO TO 110 + 80 IF (I.GE.IFK) GO TO 120 + COUNT(IFK) = COUNT(I) + INDEX(IFK) = INDEX(I) + K1 = K + DO 100 K = K1,IFKA + IFK = IF - K + IF (COUNT(IFK).GT.X) GO TO 100 + IF (COUNT(IFK).LT.X) GO TO 90 + IF (INTEST.LE.INDEX(IFK)) GO TO 100 + 90 IF (I.GE.IFK) GO TO 130 + COUNT(I) = COUNT(IFK) + INDEX(I) = INDEX(IFK) + GO TO 110 + + 100 CONTINUE + GO TO 120 + + 110 CONTINUE +C RETURN THE TEST NUMBER TO THE POSITION MARKED BY THE MARKER +C WHICH DID NOT MOVE LAST. IT DIVIDES THE INITIAL SEGMENT INTO +C 2 PARTS. ANY ELEMENT IN THE FIRST PART IS LESS THAN OR EQUAL +C TO ANY ELEMENT IN THE SECOND PART, AND THEY MAY NOW BE SORTED +C INDEPENDENTLY . + 120 COUNT(IFK) = X + INDEX(IFK) = INTEST + IP = IFK + GO TO 140 + + 130 COUNT(I) = X + INDEX(I) = INTEST + IP = I +C STORE THE LONGER SUBDIVISION IN WORKSPACE. + 140 IF ((IP-IS).GT. (IF-IP)) GO TO 150 + MARK(LA) = IF + MARK(LA-1) = IP + 1 + IF = IP - 1 + GO TO 160 + + 150 MARK(LA) = IP - 1 + MARK(LA-1) = IS + IS = IP + 1 +C FIND THE LENGTH OF THE SHORTER SUBDIVISION. + 160 LNGTH = IF - IS + IF (LNGTH.LE.0) GO TO 180 +C IF IT CONTAINS MORE THAN ONE ELEMENT SUPPLY IT WITH WORKSPACE . + LA = LA + 2 + GO TO 190 + + 170 IF (LA.LE.0) GO TO 200 +C OBTAIN THE ADDRESS OF THE SHORTEST SEGMENT AWAITING QUICKSORT + 180 IF = MARK(LA) + IS = MARK(LA-1) + 190 CONTINUE + 200 RETURN + + END +* COPYRIGHT (c) 1977 AEA Technology +*######DATE 14 Jan 1993 +C Toolpack tool decs employed. +C Reference MA30JD removed. +C SAVE statements added. +C ZERO, ONE and UMAX made PARAMETER. +C +C EAT 21/6/93 EXTERNAL statement put in for block data on VAXs. +C 3/1/96. LENOFF made into an assumed-size array. +C +C JKR 18/1/11 N*N replaced by HUGE(N) to avoid integer overflow. +C + SUBROUTINE MA30AD(NN,ICN,A,LICN,LENR,LENRL,IDISP,IP,IQ,IRN,LIRN, + + LENC,IFIRST,LASTR,NEXTR,LASTC,NEXTC,IPTR,IPC,U, + + IFLAG) +C IF THE USER REQUIRES A MORE CONVENIENT DATA INTERFACE THEN THE MA28 +C PACKAGE SHOULD BE USED. THE MA28 SUBROUTINES CALL THE MA30 +C SUBROUTINES AFTER CHECKING THE USER'S INPUT DATA AND OPTIONALLY +C USING MC23A/AD TO PERMUTE THE MATRIX TO BLOCK TRIANGULAR FORM. +C THIS PACKAGE OF SUBROUTINES (MA30A/AD, MA30B/BD, MA30C/CD AND +C MA30D/DD) PERFORMS OPERATIONS PERTINENT TO THE SOLUTION OF A +C GENERAL SPARSE N BY N SYSTEM OF LINEAR EQUATIONS (I.E. SOLVE +C AX=B). STRUCTUALLY SINGULAR MATRICES ARE PERMITTED INCLUDING +C THOSE WITH ROW OR COLUMNS CONSISTING ENTIRELY OF ZEROS (I.E. +C INCLUDING RECTANGULAR MATRICES). IT IS ASSUMED THAT THE +C NON-ZEROS OF THE MATRIX A DO NOT DIFFER WIDELY IN SIZE. IF +C NECESSARY A PRIOR CALL OF THE SCALING SUBROUTINE MC19A/AD MAY BE +C MADE. +C A DISCUSSION OF THE DESIGN OF THESE SUBROUTINES IS GIVEN BY DUFF AND +C REID (ACM TRANS MATH SOFTWARE 5 PP 18-35,1979 (CSS 48)) WHILE +C FULLER DETAILS OF THE IMPLEMENTATION ARE GIVEN IN DUFF (HARWELL +C REPORT AERE-R 8730,1977). THE ADDITIONAL PIVOTING OPTION IN +C MA30A/AD AND THE USE OF DROP TOLERANCES (SEE COMMON BLOCK +C MA30I/ID) WERE ADDED TO THE PACKAGE AFTER JOINT WORK WITH REID, +C SCHAUMBURG, WASNIEWSKI AND ZLATEV (DUFF, REID, SCHAUMBURG, +C WASNIEWSKI AND ZLATEV, HARWELL REPORT CSS 135, 1983). +C +C MA30A/AD PERFORMS THE LU DECOMPOSITION OF THE DIAGONAL BLOCKS OF THE +C PERMUTATION PAQ OF A SPARSE MATRIX A, WHERE INPUT PERMUTATIONS +C P1 AND Q1 ARE USED TO DEFINE THE DIAGONAL BLOCKS. THERE MAY BE +C NON-ZEROS IN THE OFF-DIAGONAL BLOCKS BUT THEY ARE UNAFFECTED BY +C MA30A/AD. P AND P1 DIFFER ONLY WITHIN BLOCKS AS DO Q AND Q1. THE +C PERMUTATIONS P1 AND Q1 MAY BE FOUND BY CALLING MC23A/AD OR THE +C MATRIX MAY BE TREATED AS A SINGLE BLOCK BY USING P1=Q1=I. THE +C MATRIX NON-ZEROS SHOULD BE HELD COMPACTLY BY ROWS, ALTHOUGH IT +C SHOULD BE NOTED THAT THE USER CAN SUPPLY THE MATRIX BY COLUMNS +C TO GET THE LU DECOMPOSITION OF A TRANSPOSE. +C +C THE PARAMETERS ARE... +C THIS DESCRIPTION SHOULD ALSO BE CONSULTED FOR FURTHER INFORMATION ON +C MOST OF THE PARAMETERS OF MA30B/BD AND MA30C/CD. +C +C N IS AN INTEGER VARIABLE WHICH MUST BE SET BY THE USER TO THE ORDER +C OF THE MATRIX. IT IS NOT ALTERED BY MA30A/AD. +C ICN IS AN INTEGER ARRAY OF LENGTH LICN. POSITIONS IDISP(2) TO +C LICN MUST BE SET BY THE USER TO CONTAIN THE COLUMN INDICES OF +C THE NON-ZEROS IN THE DIAGONAL BLOCKS OF P1*A*Q1. THOSE BELONGING +C TO A SINGLE ROW MUST BE CONTIGUOUS BUT THE ORDERING OF COLUMN +C INDICES WITH EACH ROW IS UNIMPORTANT. THE NON-ZEROS OF ROW I +C PRECEDE THOSE OF ROW I+1,I=1,...,N-1 AND NO WASTED SPACE IS +C ALLOWED BETWEEN THE ROWS. ON OUTPUT THE COLUMN INDICES OF THE +C LU DECOMPOSITION OF PAQ ARE HELD IN POSITIONS IDISP(1) TO +C IDISP(2), THE ROWS ARE IN PIVOTAL ORDER, AND THE COLUMN INDICES +C OF THE L PART OF EACH ROW ARE IN PIVOTAL ORDER AND PRECEDE THOSE +C OF U. AGAIN THERE IS NO WASTED SPACE EITHER WITHIN A ROW OR +C BETWEEN THE ROWS. ICN(1) TO ICN(IDISP(1)-1), ARE NEITHER +C REQUIRED NOR ALTERED. IF MC23A/AD BEEN CALLED, THESE WILL HOLD +C INFORMATION ABOUT THE OFF-DIAGONAL BLOCKS. +C A IS A REAL/DOUBLE PRECISION ARRAY OF LENGTH LICN WHOSE ENTRIES +C IDISP(2) TO LICN MUST BE SET BY THE USER TO THE VALUES OF THE +C NON-ZERO ENTRIES OF THE MATRIX IN THE ORDER INDICATED BY ICN. +C ON OUTPUT A WILL HOLD THE LU FACTORS OF THE MATRIX WHERE AGAIN +C THE POSITION IN THE MATRIX IS DETERMINED BY THE CORRESPONDING +C VALUES IN ICN. A(1) TO A(IDISP(1)-1) ARE NEITHER REQUIRED NOR +C ALTERED. +C LICN IS AN INTEGER VARIABLE WHICH MUST BE SET BY THE USER TO THE +C LENGTH OF ARRAYS ICN AND A. IT MUST BE BIG ENOUGH FOR A AND ICN +C TO HOLD ALL THE NON-ZEROS OF L AND U AND LEAVE SOME "ELBOW +C ROOM". IT IS POSSIBLE TO CALCULATE A MINIMUM VALUE FOR LICN BY +C A PRELIMINARY RUN OF MA30A/AD. THE ADEQUACY OF THE ELBOW ROOM +C CAN BE JUDGED BY THE SIZE OF THE COMMON BLOCK VARIABLE ICNCP. IT +C IS NOT ALTERED BY MA30A/AD. +C LENR IS AN INTEGER ARRAY OF LENGTH N. ON INPUT, LENR(I) SHOULD +C EQUAL THE NUMBER OF NON-ZEROS IN ROW I, I=1,...,N OF THE +C DIAGONAL BLOCKS OF P1*A*Q1. ON OUTPUT, LENR(I) WILL EQUAL THE +C TOTAL NUMBER OF NON-ZEROS IN ROW I OF L AND ROW I OF U. +C LENRL IS AN INTEGER ARRAY OF LENGTH N. ON OUTPUT FROM MA30A/AD, +C LENRL(I) WILL HOLD THE NUMBER OF NON-ZEROS IN ROW I OF L. +C IDISP IS AN INTEGER ARRAY OF LENGTH 2. THE USER SHOULD SET IDISP(1) +C TO BE THE FIRST AVAILABLE POSITION IN A/ICN FOR THE LU +C DECOMPOSITION WHILE IDISP(2) IS SET TO THE POSITION IN A/ICN OF +C THE FIRST NON-ZERO IN THE DIAGONAL BLOCKS OF P1*A*Q1. ON OUTPUT, +C IDISP(1) WILL BE UNALTERED WHILE IDISP(2) WILL BE SET TO THE +C POSITION IN A/ICN OF THE LAST NON-ZERO OF THE LU DECOMPOSITION. +C IP IS AN INTEGER ARRAY OF LENGTH N WHICH HOLDS A PERMUTATION OF +C THE INTEGERS 1 TO N. ON INPUT TO MA30A/AD, THE ABSOLUTE VALUE OF +C IP(I) MUST BE SET TO THE ROW OF A WHICH IS ROW I OF P1*A*Q1. A +C NEGATIVE VALUE FOR IP(I) INDICATES THAT ROW I IS AT THE END OF A +C DIAGONAL BLOCK. ON OUTPUT FROM MA30A/AD, IP(I) INDICATES THE ROW +C OF A WHICH IS THE I TH ROW IN PAQ. IP(I) WILL STILL BE NEGATIVE +C FOR THE LAST ROW OF EACH BLOCK (EXCEPT THE LAST). +C IQ IS AN INTEGER ARRAY OF LENGTH N WHICH AGAIN HOLDS A +C PERMUTATION OF THE INTEGERS 1 TO N. ON INPUT TO MA30A/AD, IQ(J) +C MUST BE SET TO THE COLUMN OF A WHICH IS COLUMN J OF P1*A*Q1. ON +C OUTPUT FROM MA30A/AD, THE ABSOLUTE VALUE OF IQ(J) INDICATES THE +C COLUMN OF A WHICH IS THE J TH IN PAQ. FOR ROWS, I SAY, IN WHICH +C STRUCTURAL OR NUMERICAL SINGULARITY IS DETECTED IQ(I) IS +C NEGATED. +C IRN IS AN INTEGER ARRAY OF LENGTH LIRN USED AS WORKSPACE BY +C MA30A/AD. +C LIRN IS AN INTEGER VARIABLE. IT SHOULD BE GREATER THAN THE +C LARGEST NUMBER OF NON-ZEROS IN A DIAGONAL BLOCK OF P1*A*Q1 BUT +C NEED NOT BE AS LARGE AS LICN. IT IS THE LENGTH OF ARRAY IRN AND +C SHOULD BE LARGE ENOUGH TO HOLD THE ACTIVE PART OF ANY BLOCK, +C PLUS SOME "ELBOW ROOM", THE A POSTERIORI ADEQUACY OF WHICH CAN +C BE ESTIMATED BY EXAMINING THE SIZE OF COMMON BLOCK VARIABLE +C IRNCP. +C LENC,IFIRST,LASTR,NEXTR,LASTC,NEXTC ARE ALL INTEGER ARRAYS OF +C LENGTH N WHICH ARE USED AS WORKSPACE BY MA30A/AD. IF NSRCH IS +C SET TO A VALUE LESS THAN OR EQUAL TO N, THEN ARRAYS LASTC AND +C NEXTC ARE NOT REFERENCED BY MA30A/AD AND SO CAN BE DUMMIED IN +C THE CALL TO MA30A/AD. +C IPTR,IPC ARE INTEGER ARRAYS OF LENGTH N WHICH ARE USED AS WORKSPACE +C BY MA30A/AD. +C U IS A REAL/DOUBLE PRECISION VARIABLE WHICH SHOULD BE SET BY THE +C USER TO A VALUE BETWEEN 0. AND 1.0. IF LESS THAN ZERO IT IS +C RESET TO ZERO AND IF ITS VALUE IS 1.0 OR GREATER IT IS RESET TO +C 0.9999 (0.999999999 IN D VERSION). IT DETERMINES THE BALANCE +C BETWEEN PIVOTING FOR SPARSITY AND FOR STABILITY, VALUES NEAR +C ZERO EMPHASIZING SPARSITY AND VALUES NEAR ONE EMPHASIZING +C STABILITY. WE RECOMMEND U=0.1 AS A POSIBLE FIRST TRIAL VALUE. +C THE STABILITY CAN BE JUDGED BY A LATER CALL TO MC24A/AD OR BY +C SETTING LBIG TO .TRUE. +C IFLAG IS AN INTEGER VARIABLE. IT WILL HAVE A NON-NEGATIVE VALUE IF +C MA30A/AD IS SUCCESSFUL. NEGATIVE VALUES INDICATE ERROR +C CONDITIONS WHILE POSITIVE VALUES INDICATE THAT THE MATRIX HAS +C BEEN SUCCESSFULLY DECOMPOSED BUT IS SINGULAR. FOR EACH NON-ZERO +C VALUE, AN APPROPRIATE MESSAGE IS OUTPUT ON UNIT LP. POSSIBLE +C NON-ZERO VALUES FOR IFLAG ARE ... +C +C -1 THE MATRIX IS STRUCTUALLY SINGULAR WITH RANK GIVEN BY IRANK IN +C COMMON BLOCK MA30F/FD. +C +1 IF, HOWEVER, THE USER WANTS THE LU DECOMPOSITION OF A +C STRUCTURALLY SINGULAR MATRIX AND SETS THE COMMON BLOCK VARIABLE +C ABORT1 TO .FALSE., THEN, IN THE EVENT OF SINGULARITY AND A +C SUCCESSFUL DECOMPOSITION, IFLAG IS RETURNED WITH THE VALUE +1 +C AND NO MESSAGE IS OUTPUT. +C -2 THE MATRIX IS NUMERICALLY SINGULAR (IT MAY ALSO BE STRUCTUALLY +C SINGULAR) WITH ESTIMATED RANK GIVEN BY IRANK IN COMMON BLOCK +C MA30F/FD. +C +2 THE USER CAN CHOOSE TO CONTINUE THE DECOMPOSITION EVEN WHEN A +C ZERO PIVOT IS ENCOUNTERED BY SETTING COMMON BLOCK VARIABLE +C ABORT2 TO .FALSE. IF A SINGULARITY IS ENCOUNTERED, IFLAG WILL +C THEN RETURN WITH A VALUE OF +2, AND NO MESSAGE IS OUTPUT IF THE +C DECOMPOSITION HAS BEEN COMPLETED SUCCESSFULLY. +C -3 LIRN HAS NOT BEEN LARGE ENOUGH TO CONTINUE WITH THE +C DECOMPOSITION. IF THE STAGE WAS ZERO THEN COMMON BLOCK VARIABLE +C MINIRN GIVES THE LENGTH SUFFICIENT TO START THE DECOMPOSITION ON +C THIS BLOCK. FOR A SUCCESSFUL DECOMPOSITION ON THIS BLOCK THE +C USER SHOULD MAKE LIRN SLIGHTLY (SAY ABOUT N/2) GREATER THAN THIS +C VALUE. +C -4 LICN NOT LARGE ENOUGH TO CONTINUE WITH THE DECOMPOSITION. +C -5 THE DECOMPOSITION HAS BEEN COMPLETED BUT SOME OF THE LU FACTORS +C HAVE BEEN DISCARDED TO CREATE ENOUGH ROOM IN A/ICN TO CONTINUE +C THE DECOMPOSITION. THE VARIABLE MINICN IN COMMON BLOCK MA30F/FD +C THEN GIVES THE SIZE THAT LICN SHOULD BE TO ENABLE THE +C FACTORIZATION TO BE SUCCESSFUL. IF THE USER SETS COMMON BLOCK +C VARIABLE ABORT3 TO .TRUE., THEN THE SUBROUTINE WILL EXIT +C IMMEDIATELY INSTEAD OF DESTROYING ANY FACTORS AND CONTINUING. +C -6 BOTH LICN AND LIRN ARE TOO SMALL. TERMINATION HAS BEEN CAUSED BY +C LACK OF SPACE IN IRN (SEE ERROR IFLAG= -3), BUT ALREADY SOME OF +C THE LU FACTORS IN A/ICN HAVE BEEN LOST (SEE ERROR IFLAG= -5). +C MINICN GIVES THE MINIMUM AMOUNT OF SPACE REQUIRED IN A/ICN FOR +C DECOMPOSITION UP TO THIS POINT. +C +C FOR COMMENTS OF COMMON BLOCK VARIABLES SEE BLOCK DATA SUBPROGRAM. +C .. Parameters .. + DOUBLE PRECISION ZERO,UMAX + PARAMETER (ZERO=0.0D0,UMAX=.999999999D0) +C .. +C .. Scalar Arguments .. + DOUBLE PRECISION U + INTEGER IFLAG,LICN,LIRN,NN +C .. +C .. Array Arguments .. + DOUBLE PRECISION A(LICN) + INTEGER ICN(LICN),IDISP(2),IFIRST(NN),IP(NN),IPC(NN),IPTR(NN), + + IQ(NN),IRN(LIRN),LASTC(NN),LASTR(NN),LENC(NN),LENR(NN), + + LENRL(NN),NEXTC(NN),NEXTR(NN) +C .. +C .. Local Scalars .. + DOUBLE PRECISION AANEW,AMAX,ANEW,AU,PIVR,PIVRAT,SCALE + INTEGER COLUPD,DISPC,I,I1,I2,IACTIV,IBEG,IDISPC,IDROP,IDUMMY,IEND, + + IFILL,IFIR,II,III,IJFIR,IJP1,IJPOS,ILAST,INDROW,IOP,IPIV, + + IPOS,IROWS,ISING,ISRCH,ISTART,ISW,ISW1,ITOP,J,J1,J2,JBEG, + + JCOST,JCOUNT,JDIFF,JDUMMY,JEND,JJ,JMORE,JNEW,JNPOS,JOLD, + + JPIV,JPOS,JROOM,JVAL,JZER,JZERO,K,KCOST,KDROP,L,LC,LENPIV, + + LL,LR,MOREI,MSRCH,N,NBLOCK,NC,NNM1,NR,NUM,NZ,NZ2,NZCOL, + + NZMIN,NZPC,NZROW,OLDEND,OLDPIV,PIVEND,PIVOT,PIVROW,ROWI +C .. +C .. External Subroutines .. + EXTERNAL MA30DD +C .. +C .. Data block external statement + EXTERNAL MA30JD +C .. +C .. Intrinsic Functions .. + INTRINSIC DABS,DMAX1,DMIN1,IABS,MAX0,MIN0 +C .. +C .. Common blocks .. + COMMON /MA30ED/LP,ABORT1,ABORT2,ABORT3 + COMMON /MA30FD/IRNCP,ICNCP,IRANK,MINIRN,MINICN + COMMON /MA30ID/TOL,BIG,NDROP,NSRCH,LBIG + DOUBLE PRECISION BIG,TOL + INTEGER ICNCP,IRANK,IRNCP,LP,MINICN,MINIRN,NDROP,NSRCH + LOGICAL ABORT1,ABORT2,ABORT3,LBIG +C .. +C .. Save statement .. + SAVE /MA30ED/,/MA30FD/,/MA30ID/ +C .. +C .. Executable Statements .. + MSRCH = NSRCH + NDROP = 0 + MINIRN = 0 + MINICN = IDISP(1) - 1 + MOREI = 0 + IRANK = NN + IRNCP = 0 + ICNCP = 0 + IFLAG = 0 +C RESET U IF NECESSARY. + U = DMIN1(U,UMAX) +C IBEG IS THE POSITION OF THE NEXT PIVOT ROW AFTER ELIMINATION STEP +C USING IT. + U = DMAX1(U,ZERO) + IBEG = IDISP(1) +C IACTIV IS THE POSITION OF THE FIRST ENTRY IN THE ACTIVE PART OF A/ICN. + IACTIV = IDISP(2) +C NZROW IS CURRENT NUMBER OF NON-ZEROS IN ACTIVE AND UNPROCESSED PART +C OF ROW FILE ICN. + NZROW = LICN - IACTIV + 1 + MINICN = NZROW + MINICN +C +C COUNT THE NUMBER OF DIAGONAL BLOCKS AND SET UP POINTERS TO THE +C BEGINNINGS OF THE ROWS. +C NUM IS THE NUMBER OF DIAGONAL BLOCKS. + NUM = 1 + IPTR(1) = IACTIV + IF (NN.EQ.1) GO TO 20 + NNM1 = NN - 1 + DO 10 I = 1,NNM1 + IF (IP(I).LT.0) NUM = NUM + 1 + IPTR(I+1) = IPTR(I) + LENR(I) + 10 CONTINUE +C ILAST IS THE LAST ROW IN THE PREVIOUS BLOCK. + 20 ILAST = 0 +C +C *********************************************** +C **** LU DECOMPOSITION OF BLOCK NBLOCK **** +C *********************************************** +C +C EACH PASS THROUGH THIS LOOP PERFORMS LU DECOMPOSITION ON ONE +C OF THE DIAGONAL BLOCKS. + DO 1000 NBLOCK = 1,NUM + ISTART = ILAST + 1 + DO 30 IROWS = ISTART,NN + IF (IP(IROWS).LT.0) GO TO 40 + 30 CONTINUE + IROWS = NN + 40 ILAST = IROWS +C N IS THE NUMBER OF ROWS IN THE CURRENT BLOCK. +C ISTART IS THE INDEX OF THE FIRST ROW IN THE CURRENT BLOCK. +C ILAST IS THE INDEX OF THE LAST ROW IN THE CURRENT BLOCK. +C IACTIV IS THE POSITION OF THE FIRST ENTRY IN THE BLOCK. +C ITOP IS THE POSITION OF THE LAST ENTRY IN THE BLOCK. + N = ILAST - ISTART + 1 + IF (N.NE.1) GO TO 90 +C +C CODE FOR DEALING WITH 1X1 BLOCK. + LENRL(ILAST) = 0 + ISING = ISTART + IF (LENR(ILAST).NE.0) GO TO 50 +C BLOCK IS STRUCTURALLY SINGULAR. + IRANK = IRANK - 1 + ISING = -ISING + IF (IFLAG.NE.2 .AND. IFLAG.NE.-5) IFLAG = 1 + IF (.NOT.ABORT1) GO TO 80 + IDISP(2) = IACTIV + IFLAG = -1 + IF (LP.NE.0) WRITE (LP,FMT=99999) +C RETURN + GO TO 1120 + + 50 SCALE = DABS(A(IACTIV)) + IF (SCALE.EQ.ZERO) GO TO 60 + IF (LBIG) BIG = DMAX1(BIG,SCALE) + GO TO 70 + + 60 ISING = -ISING + IRANK = IRANK - 1 + IPTR(ILAST) = 0 + IF (IFLAG.NE.-5) IFLAG = 2 + IF (.NOT.ABORT2) GO TO 70 + IDISP(2) = IACTIV + IFLAG = -2 + IF (LP.NE.0) WRITE (LP,FMT=99998) + GO TO 1120 + + 70 A(IBEG) = A(IACTIV) + ICN(IBEG) = ICN(IACTIV) + IACTIV = IACTIV + 1 + IPTR(ISTART) = 0 + IBEG = IBEG + 1 + NZROW = NZROW - 1 + 80 LASTR(ISTART) = ISTART + IPC(ISTART) = -ISING + GO TO 1000 +C +C NON-TRIVIAL BLOCK. + 90 ITOP = LICN + IF (ILAST.NE.NN) ITOP = IPTR(ILAST+1) - 1 +C +C SET UP COLUMN ORIENTED STORAGE. + DO 100 I = ISTART,ILAST + LENRL(I) = 0 + LENC(I) = 0 + 100 CONTINUE + IF (ITOP-IACTIV.LT.LIRN) GO TO 110 + MINIRN = ITOP - IACTIV + 1 + PIVOT = ISTART - 1 + GO TO 1100 +C +C CALCULATE COLUMN COUNTS. + 110 DO 120 II = IACTIV,ITOP + I = ICN(II) + LENC(I) = LENC(I) + 1 + 120 CONTINUE +C SET UP COLUMN POINTERS SO THAT IPC(J) POINTS TO POSITION AFTER END +C OF COLUMN J IN COLUMN FILE. + IPC(ILAST) = LIRN + 1 + J1 = ISTART + 1 + DO 130 JJ = J1,ILAST + J = ILAST - JJ + J1 - 1 + IPC(J) = IPC(J+1) - LENC(J+1) + 130 CONTINUE + DO 150 INDROW = ISTART,ILAST + J1 = IPTR(INDROW) + J2 = J1 + LENR(INDROW) - 1 + IF (J1.GT.J2) GO TO 150 + DO 140 JJ = J1,J2 + J = ICN(JJ) + IPOS = IPC(J) - 1 + IRN(IPOS) = INDROW + IPC(J) = IPOS + 140 CONTINUE + 150 CONTINUE +C DISPC IS THE LOWEST INDEXED ACTIVE LOCATION IN THE COLUMN FILE. + DISPC = IPC(ISTART) + NZCOL = LIRN - DISPC + 1 + MINIRN = MAX0(NZCOL,MINIRN) + NZMIN = 1 +C +C INITIALIZE ARRAY IFIRST. IFIRST(I) = +/- K INDICATES THAT ROW/COL +C K HAS I NON-ZEROS. IF IFIRST(I) = 0, THERE IS NO ROW OR COLUMN +C WITH I NON ZEROS. + DO 160 I = 1,N + IFIRST(I) = 0 + 160 CONTINUE +C +C COMPUTE ORDERING OF ROW AND COLUMN COUNTS. +C FIRST RUN THROUGH COLUMNS (FROM COLUMN N TO COLUMN 1). + DO 180 JJ = ISTART,ILAST + J = ILAST - JJ + ISTART + NZ = LENC(J) + IF (NZ.NE.0) GO TO 170 + IPC(J) = 0 + GO TO 180 + + 170 IF (NSRCH.LE.NN) GO TO 180 + ISW = IFIRST(NZ) + IFIRST(NZ) = -J + LASTC(J) = 0 + NEXTC(J) = -ISW + ISW1 = IABS(ISW) + IF (ISW.NE.0) LASTC(ISW1) = J + 180 CONTINUE +C NOW RUN THROUGH ROWS (AGAIN FROM N TO 1). + DO 210 II = ISTART,ILAST + I = ILAST - II + ISTART + NZ = LENR(I) + IF (NZ.NE.0) GO TO 190 + IPTR(I) = 0 + LASTR(I) = 0 + GO TO 210 + + 190 ISW = IFIRST(NZ) + IFIRST(NZ) = I + IF (ISW.GT.0) GO TO 200 + NEXTR(I) = 0 + LASTR(I) = ISW + GO TO 210 + + 200 NEXTR(I) = ISW + LASTR(I) = LASTR(ISW) + LASTR(ISW) = I + 210 CONTINUE +C +C +C ********************************************** +C **** START OF MAIN ELIMINATION LOOP **** +C ********************************************** + DO 980 PIVOT = ISTART,ILAST +C +C FIRST FIND THE PIVOT USING MARKOWITZ CRITERION WITH STABILITY +C CONTROL. +C JCOST IS THE MARKOWITZ COST OF THE BEST PIVOT SO FAR,.. THIS +C PIVOT IS IN ROW IPIV AND COLUMN JPIV. + NZ2 = NZMIN +C HUGE IS THE FORTRAN 90 INTRINSIC FOR THE LARGEST INTEGER + JCOST = HUGE(N) + +C +C EXAMINE ROWS/COLUMNS IN ORDER OF ASCENDING COUNT. + DO 340 L = 1,2 + PIVRAT = ZERO + ISRCH = 1 + LL = L +C A PASS WITH L EQUAL TO 2 IS ONLY PERFORMED IN THE CASE OF SINGULARITY. + DO 330 NZ = NZ2,N + IF (JCOST.LE. (NZ-1)**2) GO TO 420 + IJFIR = IFIRST(NZ) + IF (IJFIR) 230,220,240 + 220 IF (LL.EQ.1) NZMIN = NZ + 1 + GO TO 330 + + 230 LL = 2 + IJFIR = -IJFIR + GO TO 290 + + 240 LL = 2 +C SCAN ROWS WITH NZ NON-ZEROS. + DO 270 IDUMMY = 1,N + IF (JCOST.LE. (NZ-1)**2) GO TO 420 + IF (ISRCH.GT.MSRCH) GO TO 420 + IF (IJFIR.EQ.0) GO TO 280 +C ROW IJFIR IS NOW EXAMINED. + I = IJFIR + IJFIR = NEXTR(I) +C FIRST CALCULATE MULTIPLIER THRESHOLD LEVEL. + AMAX = ZERO + J1 = IPTR(I) + LENRL(I) + J2 = IPTR(I) + LENR(I) - 1 + DO 250 JJ = J1,J2 + AMAX = DMAX1(AMAX,DABS(A(JJ))) + 250 CONTINUE + AU = AMAX*U + ISRCH = ISRCH + 1 +C SCAN ROW FOR POSSIBLE PIVOTS + DO 260 JJ = J1,J2 + IF (DABS(A(JJ)).LE.AU .AND. L.EQ.1) GO TO 260 + J = ICN(JJ) + KCOST = (NZ-1)* (LENC(J)-1) + IF (KCOST.GT.JCOST) GO TO 260 + PIVR = ZERO + IF (AMAX.NE.ZERO) PIVR = DABS(A(JJ))/AMAX + IF (KCOST.EQ.JCOST .AND. (PIVR.LE.PIVRAT.OR. + + NSRCH.GT.NN+1)) GO TO 260 +C BEST PIVOT SO FAR IS FOUND. + JCOST = KCOST + IJPOS = JJ + IPIV = I + JPIV = J + IF (MSRCH.GT.NN+1 .AND. JCOST.LE. (NZ-1)**2) GO TO 420 + PIVRAT = PIVR + 260 CONTINUE + 270 CONTINUE +C +C COLUMNS WITH NZ NON-ZEROS NOW EXAMINED. + 280 IJFIR = IFIRST(NZ) + IJFIR = -LASTR(IJFIR) + 290 IF (JCOST.LE.NZ* (NZ-1)) GO TO 420 + IF (MSRCH.LE.NN) GO TO 330 + DO 320 IDUMMY = 1,N + IF (IJFIR.EQ.0) GO TO 330 + J = IJFIR + IJFIR = NEXTC(IJFIR) + I1 = IPC(J) + I2 = I1 + NZ - 1 +C SCAN COLUMN J. + DO 310 II = I1,I2 + I = IRN(II) + KCOST = (NZ-1)* (LENR(I)-LENRL(I)-1) + IF (KCOST.GE.JCOST) GO TO 310 +C PIVOT HAS BEST MARKOWITZ COUNT SO FAR ... NOW CHECK ITS +C SUITABILITY ON NUMERIC GROUNDS BY EXAMINING THE OTHER NON-ZEROS +C IN ITS ROW. + J1 = IPTR(I) + LENRL(I) + J2 = IPTR(I) + LENR(I) - 1 +C WE NEED A STABILITY CHECK ON SINGLETON COLUMNS BECAUSE OF POSSIBLE +C PROBLEMS WITH UNDERDETERMINED SYSTEMS. + AMAX = ZERO + DO 300 JJ = J1,J2 + AMAX = DMAX1(AMAX,DABS(A(JJ))) + IF (ICN(JJ).EQ.J) JPOS = JJ + 300 CONTINUE + IF (DABS(A(JPOS)).LE.AMAX*U .AND. L.EQ.1) GO TO 310 + JCOST = KCOST + IPIV = I + JPIV = J + IJPOS = JPOS + IF (AMAX.NE.ZERO) PIVRAT = DABS(A(JPOS))/AMAX + IF (JCOST.LE.NZ* (NZ-1)) GO TO 420 + 310 CONTINUE +C + 320 CONTINUE +C + 330 CONTINUE +C IN THE EVENT OF SINGULARITY, WE MUST MAKE SURE ALL ROWS AND COLUMNS +C ARE TESTED. + MSRCH = N +C +C MATRIX IS NUMERICALLY OR STRUCTURALLY SINGULAR ... WHICH IT IS WILL +C BE DIAGNOSED LATER. + IRANK = IRANK - 1 + 340 CONTINUE +C ASSIGN REST OF ROWS AND COLUMNS TO ORDERING ARRAY. +C MATRIX IS STRUCTURALLY SINGULAR. + IF (IFLAG.NE.2 .AND. IFLAG.NE.-5) IFLAG = 1 + IRANK = IRANK - ILAST + PIVOT + 1 + IF (.NOT.ABORT1) GO TO 350 + IDISP(2) = IACTIV + IFLAG = -1 + IF (LP.NE.0) WRITE (LP,FMT=99999) + GO TO 1120 + + 350 K = PIVOT - 1 + DO 390 I = ISTART,ILAST + IF (LASTR(I).NE.0) GO TO 390 + K = K + 1 + LASTR(I) = K + IF (LENRL(I).EQ.0) GO TO 380 + MINICN = MAX0(MINICN,NZROW+IBEG-1+MOREI+LENRL(I)) + IF (IACTIV-IBEG.GE.LENRL(I)) GO TO 360 + CALL MA30DD(A,ICN,IPTR(ISTART),N,IACTIV,ITOP,.TRUE.) +C CHECK NOW TO SEE IF MA30D/DD HAS CREATED ENOUGH AVAILABLE SPACE. + IF (IACTIV-IBEG.GE.LENRL(I)) GO TO 360 +C CREATE MORE SPACE BY DESTROYING PREVIOUSLY CREATED LU FACTORS. + MOREI = MOREI + IBEG - IDISP(1) + IBEG = IDISP(1) + IF (LP.NE.0) WRITE (LP,FMT=99997) + IFLAG = -5 + IF (ABORT3) GO TO 1090 + 360 J1 = IPTR(I) + J2 = J1 + LENRL(I) - 1 + IPTR(I) = 0 + DO 370 JJ = J1,J2 + A(IBEG) = A(JJ) + ICN(IBEG) = ICN(JJ) + ICN(JJ) = 0 + IBEG = IBEG + 1 + 370 CONTINUE + NZROW = NZROW - LENRL(I) + 380 IF (K.EQ.ILAST) GO TO 400 + 390 CONTINUE + 400 K = PIVOT - 1 + DO 410 I = ISTART,ILAST + IF (IPC(I).NE.0) GO TO 410 + K = K + 1 + IPC(I) = K + IF (K.EQ.ILAST) GO TO 990 + 410 CONTINUE +C +C THE PIVOT HAS NOW BEEN FOUND IN POSITION (IPIV,JPIV) IN LOCATION +C IJPOS IN ROW FILE. +C UPDATE COLUMN AND ROW ORDERING ARRAYS TO CORRESPOND WITH REMOVAL +C OF THE ACTIVE PART OF THE MATRIX. + 420 ISING = PIVOT + IF (A(IJPOS).NE.ZERO) GO TO 430 +C NUMERICAL SINGULARITY IS RECORDED HERE. + ISING = -ISING + IF (IFLAG.NE.-5) IFLAG = 2 + IF (.NOT.ABORT2) GO TO 430 + IDISP(2) = IACTIV + IFLAG = -2 + IF (LP.NE.0) WRITE (LP,FMT=99998) + GO TO 1120 + + 430 OLDPIV = IPTR(IPIV) + LENRL(IPIV) + OLDEND = IPTR(IPIV) + LENR(IPIV) - 1 +C CHANGES TO COLUMN ORDERING. + IF (NSRCH.LE.NN) GO TO 460 + COLUPD = NN + 1 + DO 450 JJ = OLDPIV,OLDEND + J = ICN(JJ) + LC = LASTC(J) + NC = NEXTC(J) + NEXTC(J) = -COLUPD + IF (JJ.NE.IJPOS) COLUPD = J + IF (NC.NE.0) LASTC(NC) = LC + IF (LC.EQ.0) GO TO 440 + NEXTC(LC) = NC + GO TO 450 + + 440 NZ = LENC(J) + ISW = IFIRST(NZ) + IF (ISW.GT.0) LASTR(ISW) = -NC + IF (ISW.LT.0) IFIRST(NZ) = -NC + 450 CONTINUE +C CHANGES TO ROW ORDERING. + 460 I1 = IPC(JPIV) + I2 = I1 + LENC(JPIV) - 1 + DO 480 II = I1,I2 + I = IRN(II) + LR = LASTR(I) + NR = NEXTR(I) + IF (NR.NE.0) LASTR(NR) = LR + IF (LR.LE.0) GO TO 470 + NEXTR(LR) = NR + GO TO 480 + + 470 NZ = LENR(I) - LENRL(I) + IF (NR.NE.0) IFIRST(NZ) = NR + IF (NR.EQ.0) IFIRST(NZ) = LR + 480 CONTINUE +C +C MOVE PIVOT TO POSITION LENRL+1 IN PIVOT ROW AND MOVE PIVOT ROW +C TO THE BEGINNING OF THE AVAILABLE STORAGE. +C THE L PART AND THE PIVOT IN THE OLD COPY OF THE PIVOT ROW IS +C NULLIFIED WHILE, IN THE STRICTLY UPPER TRIANGULAR PART, THE +C COLUMN INDICES, J SAY, ARE OVERWRITTEN BY THE CORRESPONDING +C ENTRY OF IQ (IQ(J)) AND IQ(J) IS SET TO THE NEGATIVE OF THE +C DISPLACEMENT OF THE COLUMN INDEX FROM THE PIVOT ENTRY. + IF (OLDPIV.EQ.IJPOS) GO TO 490 + AU = A(OLDPIV) + A(OLDPIV) = A(IJPOS) + A(IJPOS) = AU + ICN(IJPOS) = ICN(OLDPIV) + ICN(OLDPIV) = JPIV +C CHECK TO SEE IF THERE IS SPACE IMMEDIATELY AVAILABLE IN A/ICN TO +C HOLD NEW COPY OF PIVOT ROW. + 490 MINICN = MAX0(MINICN,NZROW+IBEG-1+MOREI+LENR(IPIV)) + IF (IACTIV-IBEG.GE.LENR(IPIV)) GO TO 500 + CALL MA30DD(A,ICN,IPTR(ISTART),N,IACTIV,ITOP,.TRUE.) + OLDPIV = IPTR(IPIV) + LENRL(IPIV) + OLDEND = IPTR(IPIV) + LENR(IPIV) - 1 +C CHECK NOW TO SEE IF MA30D/DD HAS CREATED ENOUGH AVAILABLE SPACE. + IF (IACTIV-IBEG.GE.LENR(IPIV)) GO TO 500 +C CREATE MORE SPACE BY DESTROYING PREVIOUSLY CREATED LU FACTORS. + MOREI = MOREI + IBEG - IDISP(1) + IBEG = IDISP(1) + IF (LP.NE.0) WRITE (LP,FMT=99997) + IFLAG = -5 + IF (ABORT3) GO TO 1090 + IF (IACTIV-IBEG.GE.LENR(IPIV)) GO TO 500 +C THERE IS STILL NOT ENOUGH ROOM IN A/ICN. + IFLAG = -4 + GO TO 1090 +C COPY PIVOT ROW AND SET UP IQ ARRAY. + 500 IJPOS = 0 + J1 = IPTR(IPIV) +C + DO 530 JJ = J1,OLDEND + A(IBEG) = A(JJ) + ICN(IBEG) = ICN(JJ) + IF (IJPOS.NE.0) GO TO 510 + IF (ICN(JJ).EQ.JPIV) IJPOS = IBEG + ICN(JJ) = 0 + GO TO 520 + + 510 K = IBEG - IJPOS + J = ICN(JJ) + ICN(JJ) = IQ(J) + IQ(J) = -K + 520 IBEG = IBEG + 1 + 530 CONTINUE +C + IJP1 = IJPOS + 1 + PIVEND = IBEG - 1 + LENPIV = PIVEND - IJPOS + NZROW = NZROW - LENRL(IPIV) - 1 + IPTR(IPIV) = OLDPIV + 1 + IF (LENPIV.EQ.0) IPTR(IPIV) = 0 +C +C REMOVE PIVOT ROW (INCLUDING PIVOT) FROM COLUMN ORIENTED FILE. + DO 560 JJ = IJPOS,PIVEND + J = ICN(JJ) + I1 = IPC(J) + LENC(J) = LENC(J) - 1 +C I2 IS LAST POSITION IN NEW COLUMN. + I2 = IPC(J) + LENC(J) - 1 + IF (I2.LT.I1) GO TO 550 + DO 540 II = I1,I2 + IF (IRN(II).NE.IPIV) GO TO 540 + IRN(II) = IRN(I2+1) + GO TO 550 + + 540 CONTINUE + 550 IRN(I2+1) = 0 + 560 CONTINUE + NZCOL = NZCOL - LENPIV - 1 +C +C GO DOWN THE PIVOT COLUMN AND FOR EACH ROW WITH A NON-ZERO ADD +C THE APPROPRIATE MULTIPLE OF THE PIVOT ROW TO IT. +C WE LOOP ON THE NUMBER OF NON-ZEROS IN THE PIVOT COLUMN SINCE +C MA30D/DD MAY CHANGE ITS ACTUAL POSITION. +C + NZPC = LENC(JPIV) + IF (NZPC.EQ.0) GO TO 900 + DO 840 III = 1,NZPC + II = IPC(JPIV) + III - 1 + I = IRN(II) +C SEARCH ROW I FOR NON-ZERO TO BE ELIMINATED, CALCULATE MULTIPLIER, +C AND PLACE IT IN POSITION LENRL+1 IN ITS ROW. +C IDROP IS THE NUMBER OF NON-ZERO ENTRIES DROPPED FROM ROW I +C BECAUSE THESE FALL BENEATH TOLERANCE LEVEL. +C + IDROP = 0 + J1 = IPTR(I) + LENRL(I) + IEND = IPTR(I) + LENR(I) - 1 + DO 570 JJ = J1,IEND + IF (ICN(JJ).NE.JPIV) GO TO 570 +C IF PIVOT IS ZERO, REST OF COLUMN IS AND SO MULTIPLIER IS ZERO. + AU = ZERO + IF (A(IJPOS).NE.ZERO) AU = -A(JJ)/A(IJPOS) + IF (LBIG) BIG = DMAX1(BIG,DABS(AU)) + A(JJ) = A(J1) + A(J1) = AU + ICN(JJ) = ICN(J1) + ICN(J1) = JPIV + LENRL(I) = LENRL(I) + 1 + GO TO 580 + + 570 CONTINUE +C JUMP IF PIVOT ROW IS A SINGLETON. + 580 IF (LENPIV.EQ.0) GO TO 840 +C NOW PERFORM NECESSARY OPERATIONS ON REST OF NON-PIVOT ROW I. + ROWI = J1 + 1 + IOP = 0 +C JUMP IF ALL THE PIVOT ROW CAUSES FILL-IN. + IF (ROWI.GT.IEND) GO TO 650 +C PERFORM OPERATIONS ON CURRENT NON-ZEROS IN ROW I. +C INNERMOST LOOP. + DO 590 JJ = ROWI,IEND + J = ICN(JJ) + IF (IQ(J).GT.0) GO TO 590 + IOP = IOP + 1 + PIVROW = IJPOS - IQ(J) + A(JJ) = A(JJ) + AU*A(PIVROW) + IF (LBIG) BIG = DMAX1(DABS(A(JJ)),BIG) + ICN(PIVROW) = -ICN(PIVROW) + IF (DABS(A(JJ)).LT.TOL) IDROP = IDROP + 1 + 590 CONTINUE +C +C JUMP IF NO NON-ZEROS IN NON-PIVOT ROW HAVE BEEN REMOVED +C BECAUSE THESE ARE BENEATH THE DROP-TOLERANCE TOL. +C + IF (IDROP.EQ.0) GO TO 650 +C +C RUN THROUGH NON-PIVOT ROW COMPRESSING ROW SO THAT ONLY +C NON-ZEROS GREATER THAN TOL ARE STORED. ALL NON-ZEROS +C LESS THAN TOL ARE ALSO REMOVED FROM THE COLUMN STRUCTURE. +C + JNEW = ROWI + DO 630 JJ = ROWI,IEND + IF (DABS(A(JJ)).LT.TOL) GO TO 600 + A(JNEW) = A(JJ) + ICN(JNEW) = ICN(JJ) + JNEW = JNEW + 1 + GO TO 630 +C +C REMOVE NON-ZERO ENTRY FROM COLUMN STRUCTURE. +C + 600 J = ICN(JJ) + I1 = IPC(J) + I2 = I1 + LENC(J) - 1 + DO 610 II = I1,I2 + IF (IRN(II).EQ.I) GO TO 620 + 610 CONTINUE + 620 IRN(II) = IRN(I2) + IRN(I2) = 0 + LENC(J) = LENC(J) - 1 + IF (NSRCH.LE.NN) GO TO 630 +C REMOVE COLUMN FROM COLUMN CHAIN AND PLACE IN UPDATE CHAIN. + IF (NEXTC(J).LT.0) GO TO 630 +C JUMP IF COLUMN ALREADY IN UPDATE CHAIN. + LC = LASTC(J) + NC = NEXTC(J) + NEXTC(J) = -COLUPD + COLUPD = J + IF (NC.NE.0) LASTC(NC) = LC + IF (LC.EQ.0) GO TO 622 + NEXTC(LC) = NC + GO TO 630 + + 622 NZ = LENC(J) + 1 + ISW = IFIRST(NZ) + IF (ISW.GT.0) LASTR(ISW) = -NC + IF (ISW.LT.0) IFIRST(NZ) = -NC + 630 CONTINUE + DO 640 JJ = JNEW,IEND + ICN(JJ) = 0 + 640 CONTINUE +C THE VALUE OF IDROP MIGHT BE DIFFERENT FROM THAT CALCULATED EARLIER +C BECAUSE, WE MAY NOW HAVE DROPPED SOME NON-ZEROS WHICH WERE NOT +C MODIFIED BY THE PIVOT ROW. + IDROP = IEND + 1 - JNEW + IEND = JNEW - 1 + LENR(I) = LENR(I) - IDROP + NZROW = NZROW - IDROP + NZCOL = NZCOL - IDROP + NDROP = NDROP + IDROP + 650 IFILL = LENPIV - IOP +C JUMP IS IF THERE IS NO FILL-IN. + IF (IFILL.EQ.0) GO TO 750 +C NOW FOR THE FILL-IN. + MINICN = MAX0(MINICN,MOREI+IBEG-1+NZROW+IFILL+LENR(I)) +C SEE IF THERE IS ROOM FOR FILL-IN. +C GET MAXIMUM SPACE FOR ROW I IN SITU. + DO 660 JDIFF = 1,IFILL + JNPOS = IEND + JDIFF + IF (JNPOS.GT.LICN) GO TO 670 + IF (ICN(JNPOS).NE.0) GO TO 670 + 660 CONTINUE +C THERE IS ROOM FOR ALL THE FILL-IN AFTER THE END OF THE ROW SO IT +C CAN BE LEFT IN SITU. +C NEXT AVAILABLE SPACE FOR FILL-IN. + IEND = IEND + 1 + GO TO 750 +C JMORE SPACES FOR FILL-IN ARE REQUIRED IN FRONT OF ROW. + 670 JMORE = IFILL - JDIFF + 1 + I1 = IPTR(I) +C WE NOW LOOK IN FRONT OF THE ROW TO SEE IF THERE IS SPACE FOR +C THE REST OF THE FILL-IN. + DO 680 JDIFF = 1,JMORE + JNPOS = I1 - JDIFF + IF (JNPOS.LT.IACTIV) GO TO 690 + IF (ICN(JNPOS).NE.0) GO TO 700 + 680 CONTINUE + 690 JNPOS = I1 - JMORE + GO TO 710 +C WHOLE ROW MUST BE MOVED TO THE BEGINNING OF AVAILABLE STORAGE. + 700 JNPOS = IACTIV - LENR(I) - IFILL +C JUMP IF THERE IS SPACE IMMEDIATELY AVAILABLE FOR THE SHIFTED ROW. + 710 IF (JNPOS.GE.IBEG) GO TO 730 + CALL MA30DD(A,ICN,IPTR(ISTART),N,IACTIV,ITOP,.TRUE.) + I1 = IPTR(I) + IEND = I1 + LENR(I) - 1 + JNPOS = IACTIV - LENR(I) - IFILL + IF (JNPOS.GE.IBEG) GO TO 730 +C NO SPACE AVAILABLE SO TRY TO CREATE SOME BY THROWING AWAY PREVIOUS +C LU DECOMPOSITION. + MOREI = MOREI + IBEG - IDISP(1) - LENPIV - 1 + IF (LP.NE.0) WRITE (LP,FMT=99997) + IFLAG = -5 + IF (ABORT3) GO TO 1090 +C KEEP RECORD OF CURRENT PIVOT ROW. + IBEG = IDISP(1) + ICN(IBEG) = JPIV + A(IBEG) = A(IJPOS) + IJPOS = IBEG + DO 720 JJ = IJP1,PIVEND + IBEG = IBEG + 1 + A(IBEG) = A(JJ) + ICN(IBEG) = ICN(JJ) + 720 CONTINUE + IJP1 = IJPOS + 1 + PIVEND = IBEG + IBEG = IBEG + 1 + IF (JNPOS.GE.IBEG) GO TO 730 +C THIS STILL DOES NOT GIVE ENOUGH ROOM. + IFLAG = -4 + GO TO 1090 + + 730 IACTIV = MIN0(IACTIV,JNPOS) +C MOVE NON-PIVOT ROW I. + IPTR(I) = JNPOS + DO 740 JJ = I1,IEND + A(JNPOS) = A(JJ) + ICN(JNPOS) = ICN(JJ) + JNPOS = JNPOS + 1 + ICN(JJ) = 0 + 740 CONTINUE +C FIRST NEW AVAILABLE SPACE. + IEND = JNPOS + 750 NZROW = NZROW + IFILL +C INNERMOST FILL-IN LOOP WHICH ALSO RESETS ICN. + IDROP = 0 + DO 830 JJ = IJP1,PIVEND + J = ICN(JJ) + IF (J.LT.0) GO TO 820 + ANEW = AU*A(JJ) + AANEW = DABS(ANEW) + IF (AANEW.GE.TOL) GO TO 760 + IDROP = IDROP + 1 + NDROP = NDROP + 1 + NZROW = NZROW - 1 + MINICN = MINICN - 1 + IFILL = IFILL - 1 + GO TO 830 + + 760 IF (LBIG) BIG = DMAX1(AANEW,BIG) + A(IEND) = ANEW + ICN(IEND) = J + IEND = IEND + 1 +C +C PUT NEW ENTRY IN COLUMN FILE. + MINIRN = MAX0(MINIRN,NZCOL+LENC(J)+1) + JEND = IPC(J) + LENC(J) + JROOM = NZPC - III + 1 + LENC(J) + IF (JEND.GT.LIRN) GO TO 770 + IF (IRN(JEND).EQ.0) GO TO 810 + 770 IF (JROOM.LT.DISPC) GO TO 780 +C COMPRESS COLUMN FILE TO OBTAIN SPACE FOR NEW COPY OF COLUMN. + CALL MA30DD(A,IRN,IPC(ISTART),N,DISPC,LIRN,.FALSE.) + IF (JROOM.LT.DISPC) GO TO 780 + JROOM = DISPC - 1 + IF (JROOM.GE.LENC(J)+1) GO TO 780 +C COLUMN FILE IS NOT LARGE ENOUGH. + GO TO 1100 +C COPY COLUMN TO BEGINNING OF FILE. + 780 JBEG = IPC(J) + JEND = IPC(J) + LENC(J) - 1 + JZERO = DISPC - 1 + DISPC = DISPC - JROOM + IDISPC = DISPC + DO 790 II = JBEG,JEND + IRN(IDISPC) = IRN(II) + IRN(II) = 0 + IDISPC = IDISPC + 1 + 790 CONTINUE + IPC(J) = DISPC + JEND = IDISPC + DO 800 II = JEND,JZERO + IRN(II) = 0 + 800 CONTINUE + 810 IRN(JEND) = I + NZCOL = NZCOL + 1 + LENC(J) = LENC(J) + 1 +C END OF ADJUSTMENT TO COLUMN FILE. + GO TO 830 +C + 820 ICN(JJ) = -J + 830 CONTINUE + IF (IDROP.EQ.0) GO TO 834 + DO 832 KDROP = 1,IDROP + ICN(IEND) = 0 + IEND = IEND + 1 + 832 CONTINUE + 834 LENR(I) = LENR(I) + IFILL +C END OF SCAN OF PIVOT COLUMN. + 840 CONTINUE +C +C +C REMOVE PIVOT COLUMN FROM COLUMN ORIENTED STORAGE AND UPDATE ROW +C ORDERING ARRAYS. + I1 = IPC(JPIV) + I2 = IPC(JPIV) + LENC(JPIV) - 1 + NZCOL = NZCOL - LENC(JPIV) + DO 890 II = I1,I2 + I = IRN(II) + IRN(II) = 0 + NZ = LENR(I) - LENRL(I) + IF (NZ.NE.0) GO TO 850 + LASTR(I) = 0 + GO TO 890 + + 850 IFIR = IFIRST(NZ) + IFIRST(NZ) = I + IF (IFIR) 860,880,870 + 860 LASTR(I) = IFIR + NEXTR(I) = 0 + GO TO 890 + + 870 LASTR(I) = LASTR(IFIR) + NEXTR(I) = IFIR + LASTR(IFIR) = I + GO TO 890 + + 880 LASTR(I) = 0 + NEXTR(I) = 0 + NZMIN = MIN0(NZMIN,NZ) + 890 CONTINUE +C RESTORE IQ AND NULLIFY U PART OF OLD PIVOT ROW. +C RECORD THE COLUMN PERMUTATION IN LASTC(JPIV) AND THE ROW +C PERMUTATION IN LASTR(IPIV). + 900 IPC(JPIV) = -ISING + LASTR(IPIV) = PIVOT + IF (LENPIV.EQ.0) GO TO 980 + NZROW = NZROW - LENPIV + JVAL = IJP1 + JZER = IPTR(IPIV) + IPTR(IPIV) = 0 + DO 910 JCOUNT = 1,LENPIV + J = ICN(JVAL) + IQ(J) = ICN(JZER) + ICN(JZER) = 0 + JVAL = JVAL + 1 + JZER = JZER + 1 + 910 CONTINUE +C ADJUST COLUMN ORDERING ARRAYS. + IF (NSRCH.GT.NN) GO TO 920 + DO 916 JJ = IJP1,PIVEND + J = ICN(JJ) + NZ = LENC(J) + IF (NZ.NE.0) GO TO 914 + IPC(J) = 0 + GO TO 916 + + 914 NZMIN = MIN0(NZMIN,NZ) + 916 CONTINUE + GO TO 980 + + 920 JJ = COLUPD + DO 970 JDUMMY = 1,NN + J = JJ + IF (J.EQ.NN+1) GO TO 980 + JJ = -NEXTC(J) + NZ = LENC(J) + IF (NZ.NE.0) GO TO 924 + IPC(J) = 0 + GO TO 970 + + 924 IFIR = IFIRST(NZ) + LASTC(J) = 0 + IF (IFIR) 930,940,950 + 930 IFIRST(NZ) = -J + IFIR = -IFIR + LASTC(IFIR) = J + NEXTC(J) = IFIR + GO TO 970 + + 940 IFIRST(NZ) = -J + NEXTC(J) = 0 + GO TO 960 + + 950 LC = -LASTR(IFIR) + LASTR(IFIR) = -J + NEXTC(J) = LC + IF (LC.NE.0) LASTC(LC) = J + 960 NZMIN = MIN0(NZMIN,NZ) + 970 CONTINUE + 980 CONTINUE +C ******************************************** +C **** END OF MAIN ELIMINATION LOOP **** +C ******************************************** +C +C RESET IACTIV TO POINT TO THE BEGINNING OF THE NEXT BLOCK. + 990 IF (ILAST.NE.NN) IACTIV = IPTR(ILAST+1) + 1000 CONTINUE +C +C ******************************************** +C **** END OF DEOMPOSITION OF BLOCK **** +C ******************************************** +C +C RECORD SINGULARITY (IF ANY) IN IQ ARRAY. + IF (IRANK.EQ.NN) GO TO 1020 + DO 1010 I = 1,NN + IF (IPC(I).LT.0) GO TO 1010 + ISING = IPC(I) + IQ(ISING) = -IQ(ISING) + IPC(I) = -ISING + 1010 CONTINUE +C +C RUN THROUGH LU DECOMPOSITION CHANGING COLUMN INDICES TO THAT OF NEW +C ORDER AND PERMUTING LENR AND LENRL ARRAYS ACCORDING TO PIVOT +C PERMUTATIONS. + 1020 ISTART = IDISP(1) + IEND = IBEG - 1 + IF (IEND.LT.ISTART) GO TO 1040 + DO 1030 JJ = ISTART,IEND + JOLD = ICN(JJ) + ICN(JJ) = -IPC(JOLD) + 1030 CONTINUE + 1040 DO 1050 II = 1,NN + I = LASTR(II) + NEXTR(I) = LENR(II) + IPTR(I) = LENRL(II) + 1050 CONTINUE + DO 1060 I = 1,NN + LENRL(I) = IPTR(I) + LENR(I) = NEXTR(I) + 1060 CONTINUE +C +C UPDATE PERMUTATION ARRAYS IP AND IQ. + DO 1070 II = 1,NN + I = LASTR(II) + J = -IPC(II) + NEXTR(I) = IABS(IP(II)+0) + IPTR(J) = IABS(IQ(II)+0) + 1070 CONTINUE + DO 1080 I = 1,NN + IF (IP(I).LT.0) NEXTR(I) = -NEXTR(I) + IP(I) = NEXTR(I) + IF (IQ(I).LT.0) IPTR(I) = -IPTR(I) + IQ(I) = IPTR(I) + 1080 CONTINUE + IP(NN) = IABS(IP(NN)+0) + IDISP(2) = IEND + GO TO 1120 +C +C *** ERROR RETURNS *** + 1090 IDISP(2) = IACTIV + IF (LP.EQ.0) GO TO 1120 + WRITE (LP,FMT=99996) + GO TO 1110 + + 1100 IF (IFLAG.EQ.-5) IFLAG = -6 + IF (IFLAG.NE.-6) IFLAG = -3 + IDISP(2) = IACTIV + IF (LP.EQ.0) GO TO 1120 + IF (IFLAG.EQ.-3) WRITE (LP,FMT=99995) + IF (IFLAG.EQ.-6) WRITE (LP,FMT=99994) + 1110 PIVOT = PIVOT - ISTART + 1 + WRITE (LP,FMT=99993) PIVOT,NBLOCK,ISTART,ILAST + IF (PIVOT.EQ.0) WRITE (LP,FMT=99992) MINIRN +C +C + 1120 RETURN + +99999 FORMAT (' ERROR RETURN FROM MA30A/AD BECAUSE MATRIX IS STRUCTUR', + + 'ALLY SINGULAR') +99998 FORMAT (' ERROR RETURN FROM MA30A/AD BECAUSE MATRIX IS NUMERICA', + + 'LLY SINGULAR') +99997 FORMAT (' LU DECOMPOSITION DESTROYED TO CREATE MORE SPACE') +99996 FORMAT (' ERROR RETURN FROM MA30A/AD BECAUSE LICN NOT BIG ENOUG', + + 'H') +99995 FORMAT (' ERROR RETURN FROM MA30A/AD BECAUSE LIRN NOT BIG ENOUG', + + 'H') +99994 FORMAT (' ERROR RETURN FROM MA30A/AD LIRN AND LICN TOO SMALL') +99993 FORMAT (' AT STAGE ',I5,' IN BLOCK ',I5,' WITH FIRST ROW ',I5, + + ' AND LAST ROW ',I5) +99992 FORMAT (' TO CONTINUE SET LIRN TO AT LEAST ',I8) + + END + SUBROUTINE MA30BD(N,ICN,A,LICN,LENR,LENRL,IDISP,IP,IQ,W,IW,IFLAG) +C MA30B/BD PERFORMS THE LU DECOMPOSITION OF THE DIAGONAL BLOCKS OF A +C NEW MATRIX PAQ OF THE SAME SPARSITY PATTERN, USING INFORMATION +C FROM A PREVIOUS CALL TO MA30A/AD. THE ENTRIES OF THE INPUT +C MATRIX MUST ALREADY BE IN THEIR FINAL POSITIONS IN THE LU +C DECOMPOSITION STRUCTURE. THIS ROUTINE EXECUTES ABOUT FIVE TIMES +C FASTER THAN MA30A/AD. +C +C WE NOW DESCRIBE THE ARGUMENT LIST FOR MA30B/BD. CONSULT MA30A/AD FOR +C FURTHER INFORMATION ON THESE PARAMETERS. +C N IS AN INTEGER VARIABLE SET TO THE ORDER OF THE MATRIX. +C ICN IS AN INTEGER ARRAY OF LENGTH LICN. IT SHOULD BE UNCHANGED +C SINCE THE LAST CALL TO MA30A/AD. IT IS NOT ALTERED BY MA30B/BD. +C A IS A REAL/DOUBLE PRECISION ARRAY OF LENGTH LICN THE USER MUST SET +C ENTRIES IDISP(1) TO IDISP(2) TO CONTAIN THE ENTRIES IN THE +C DIAGONAL BLOCKS OF THE MATRIX PAQ WHOSE COLUMN NUMBERS ARE HELD +C IN ICN, USING CORRESPONDING POSITIONS. NOTE THAT SOME ZEROS MAY +C NEED TO BE HELD EXPLICITLY. ON OUTPUT ENTRIES IDISP(1) TO +C IDISP(2) OF ARRAY A CONTAIN THE LU DECOMPOSITION OF THE DIAGONAL +C BLOCKS OF PAQ. ENTRIES A(1) TO A(IDISP(1)-1) ARE NEITHER +C REQUIRED NOR ALTERED BY MA30B/BD. +C LICN IS AN INTEGER VARIABLE WHICH MUST BE SET BY THE USER TO THE +C LENGTH OF ARRAYS A AND ICN. IT IS NOT ALTERED BY MA30B/BD. +C LENR,LENRL ARE INTEGER ARRAYS OF LENGTH N. THEY SHOULD BE +C UNCHANGED SINCE THE LAST CALL TO MA30A/AD. THEY ARE NOT ALTERED +C BY MA30B/BD. +C IDISP IS AN INTEGER ARRAY OF LENGTH 2. IT SHOULD BE UNCHANGED SINCE +C THE LAST CALL TO MA30A/AD. IT IS NOT ALTERED BY MA30B/BD. +C IP,IQ ARE INTEGER ARRAYS OF LENGTH N. THEY SHOULD BE UNCHANGED +C SINCE THE LAST CALL TO MA30A/AD. THEY ARE NOT ALTERED BY +C MA30B/BD. +C W IS A REAL/DOUBLE PRECISION ARRAY OF LENGTH N WHICH IS USED AS +C WORKSPACE BY MA30B/BD. +C IW IS AN INTEGER ARRAY OF LENGTH N WHICH IS USED AS WORKSPACE BY +C MA30B/BD. +C IFLAG IS AN INTEGER VARIABLE. ON OUTPUT FROM MA30B/BD, IFLAG HAS +C THE VALUE ZERO IF THE FACTORIZATION WAS SUCCESSFUL, HAS THE +C VALUE I IF PIVOT I WAS VERY SMALL AND HAS THE VALUE -I IF AN +C UNEXPECTED SINGULARITY WAS DETECTED AT STAGE I OF THE +C DECOMPOSITION. +C +C SEE BLOCK DATA FOR COMMENTS ON VARIABLES IN COMMON. +C .. Parameters .. + DOUBLE PRECISION ZERO,ONE + PARAMETER (ZERO=0.0D0,ONE=1.0D0) +C .. +C .. Scalar Arguments .. + INTEGER IFLAG,LICN,N +C .. +C .. Array Arguments .. + DOUBLE PRECISION A(LICN),W(N) + INTEGER ICN(LICN),IDISP(2),IP(N),IQ(N),IW(N),LENR(N),LENRL(N) +C .. +C .. Local Scalars .. + DOUBLE PRECISION AU,ROWMAX + INTEGER I,IFIN,ILEND,IPIVJ,ISING,ISTART,J,JAY,JAYJAY,JFIN,JJ, + + PIVPOS + LOGICAL STAB +C .. +C .. Intrinsic Functions .. + INTRINSIC DABS,DMAX1 +C .. +C .. Common blocks .. + COMMON /MA30ED/LP,ABORT1,ABORT2,ABORT3 + COMMON /MA30GD/EPS,RMIN + COMMON /MA30ID/TOL,BIG,NDROP,NSRCH,LBIG + DOUBLE PRECISION BIG,EPS,RMIN,TOL + INTEGER LP,NDROP,NSRCH + LOGICAL ABORT1,ABORT2,ABORT3,LBIG +C .. +C .. Save statement .. + SAVE /MA30ED/,/MA30GD/,/MA30ID/ +C .. +C .. Executable Statements .. + STAB = EPS .LE. ONE + RMIN = EPS + ISING = 0 + IFLAG = 0 + DO 10 I = 1,N + W(I) = ZERO + 10 CONTINUE +C SET UP POINTERS TO THE BEGINNING OF THE ROWS. + IW(1) = IDISP(1) + IF (N.EQ.1) GO TO 25 + DO 20 I = 2,N + IW(I) = IW(I-1) + LENR(I-1) + 20 CONTINUE +C +C **** START OF MAIN LOOP **** +C AT STEP I, ROW I OF A IS TRANSFORMED TO ROW I OF L/U BY ADDING +C APPROPRIATE MULTIPLES OF ROWS 1 TO I-1. +C .... USING ROW-GAUSS ELIMINATION. + 25 DO 160 I = 1,N +C ISTART IS BEGINNING OF ROW I OF A AND ROW I OF L. + ISTART = IW(I) +C IFIN IS END OF ROW I OF A AND ROW I OF U. + IFIN = ISTART + LENR(I) - 1 +C ILEND IS END OF ROW I OF L. + ILEND = ISTART + LENRL(I) - 1 + IF (ISTART.GT.ILEND) GO TO 90 +C LOAD ROW I OF A INTO VECTOR W. + DO 30 JJ = ISTART,IFIN + J = ICN(JJ) + W(J) = A(JJ) + 30 CONTINUE +C +C ADD MULTIPLES OF APPROPRIATE ROWS OF I TO I-1 TO ROW I. + DO 70 JJ = ISTART,ILEND + J = ICN(JJ) +C IPIVJ IS POSITION OF PIVOT IN ROW J. + IPIVJ = IW(J) + LENRL(J) +C FORM MULTIPLIER AU. + AU = -W(J)/A(IPIVJ) + IF (LBIG) BIG = DMAX1(DABS(AU),BIG) + W(J) = AU +C AU * ROW J (U PART) IS ADDED TO ROW I. + IPIVJ = IPIVJ + 1 + JFIN = IW(J) + LENR(J) - 1 + IF (IPIVJ.GT.JFIN) GO TO 70 +C INNERMOST LOOP. + IF (LBIG) GO TO 50 + DO 40 JAYJAY = IPIVJ,JFIN + JAY = ICN(JAYJAY) + W(JAY) = W(JAY) + AU*A(JAYJAY) + 40 CONTINUE + GO TO 70 + + 50 DO 60 JAYJAY = IPIVJ,JFIN + JAY = ICN(JAYJAY) + W(JAY) = W(JAY) + AU*A(JAYJAY) + BIG = DMAX1(DABS(W(JAY)),BIG) + 60 CONTINUE + 70 CONTINUE +C +C RELOAD W BACK INTO A (NOW L/U) + DO 80 JJ = ISTART,IFIN + J = ICN(JJ) + A(JJ) = W(J) + W(J) = ZERO + 80 CONTINUE +C WE NOW PERFORM THE STABILITY CHECKS. + 90 PIVPOS = ILEND + 1 + IF (IQ(I).GT.0) GO TO 140 +C MATRIX HAD SINGULARITY AT THIS POINT IN MA30A/AD. +C IS IT THE FIRST SUCH PIVOT IN CURRENT BLOCK ? + IF (ISING.EQ.0) ISING = I +C DOES CURRENT MATRIX HAVE A SINGULARITY IN THE SAME PLACE ? + IF (PIVPOS.GT.IFIN) GO TO 100 + IF (A(PIVPOS).NE.ZERO) GO TO 170 +C IT DOES .. SO SET ISING IF IT IS NOT THE END OF THE CURRENT BLOCK +C CHECK TO SEE THAT APPROPRIATE PART OF L/U IS ZERO OR NULL. + 100 IF (ISTART.GT.IFIN) GO TO 120 + DO 110 JJ = ISTART,IFIN + IF (ICN(JJ).LT.ISING) GO TO 110 + IF (A(JJ).NE.ZERO) GO TO 170 + 110 CONTINUE + 120 IF (PIVPOS.LE.IFIN) A(PIVPOS) = ONE + IF (IP(I).GT.0 .AND. I.NE.N) GO TO 160 +C END OF CURRENT BLOCK ... RESET ZERO PIVOTS AND ISING. + DO 130 J = ISING,I + IF ((LENR(J)-LENRL(J)).EQ.0) GO TO 130 + JJ = IW(J) + LENRL(J) + A(JJ) = ZERO + 130 CONTINUE + ISING = 0 + GO TO 160 +C MATRIX HAD NON-ZERO PIVOT IN MA30A/AD AT THIS STAGE. + 140 IF (PIVPOS.GT.IFIN) GO TO 170 + IF (A(PIVPOS).EQ.ZERO) GO TO 170 + IF (.NOT.STAB) GO TO 160 + ROWMAX = ZERO + DO 150 JJ = PIVPOS,IFIN + ROWMAX = DMAX1(ROWMAX,DABS(A(JJ))) + 150 CONTINUE + IF (DABS(A(PIVPOS))/ROWMAX.GE.RMIN) GO TO 160 + IFLAG = I + RMIN = DABS(A(PIVPOS))/ROWMAX +C **** END OF MAIN LOOP **** + 160 CONTINUE +C + GO TO 180 +C *** ERROR RETURN *** + 170 IF (LP.NE.0) WRITE (LP,FMT=99999) I + IFLAG = -I +C + 180 RETURN + +99999 FORMAT (' ERROR RETURN FROM MA30B/BD SINGULARITY DETECTED IN RO', + + 'W',I8) + + END + SUBROUTINE MA30CD(N,ICN,A,LICN,LENR,LENRL,LENOFF,IDISP,IP,IQ,X,W, + + MTYPE) +C MA30C/CD USES THE FACTORS PRODUCED BY MA30A/AD OR MA30B/BD TO SOLVE +C AX=B OR A TRANSPOSE X=B WHEN THE MATRIX P1*A*Q1 (PAQ) IS BLOCK +C LOWER TRIANGULAR (INCLUDING THE CASE OF ONLY ONE DIAGONAL +C BLOCK). +C +C WE NOW DESCRIBE THE ARGUMENT LIST FOR MA30C/CD. +C N IS AN INTEGER VARIABLE SET TO THE ORDER OF THE MATRIX. IT IS NOT +C ALTERED BY THE SUBROUTINE. +C ICN IS AN INTEGER ARRAY OF LENGTH LICN. ENTRIES IDISP(1) TO +C IDISP(2) SHOULD BE UNCHANGED SINCE THE LAST CALL TO MA30A/AD. IF +C THE MATRIX HAS MORE THAN ONE DIAGONAL BLOCK, THEN COLUMN INDICES +C CORRESPONDING TO NON-ZEROS IN SUB-DIAGONAL BLOCKS OF PAQ MUST +C APPEAR IN POSITIONS 1 TO IDISP(1)-1. FOR THE SAME ROW THOSE +C ENTRIES MUST BE CONTIGUOUS, WITH THOSE IN ROW I PRECEDING THOSE +C IN ROW I+1 (I=1,...,N-1) AND NO WASTED SPACE BETWEEN ROWS. +C ENTRIES MAY BE IN ANY ORDER WITHIN EACH ROW. IT IS NOT ALTERED +C BY MA30C/CD. +C A IS A REAL/DOUBLE PRECISION ARRAY OF LENGTH LICN. ENTRIES +C IDISP(1) TO IDISP(2) SHOULD BE UNCHANGED SINCE THE LAST CALL TO +C MA30A/AD OR MA30B/BD. IF THE MATRIX HAS MORE THAN ONE DIAGONAL +C BLOCK, THEN THE VALUES OF THE NON-ZEROS IN SUB-DIAGONAL BLOCKS +C MUST BE IN POSITIONS 1 TO IDISP(1)-1 IN THE ORDER GIVEN BY ICN. +C IT IS NOT ALTERED BY MA30C/CD. +C LICN IS AN INTEGER VARIABLE SET TO THE SIZE OF ARRAYS ICN AND A. +C IT IS NOT ALTERED BY MA30C/CD. +C LENR,LENRL ARE INTEGER ARRAYS OF LENGTH N WHICH SHOULD BE +C UNCHANGED SINCE THE LAST CALL TO MA30A/AD. THEY ARE NOT ALTERED +C BY MA30C/CD. +C LENOFF IS AN INTEGER ARRAY OF LENGTH N. IF THE MATRIX PAQ (OR +C P1*A*Q1) HAS MORE THAN ONE DIAGONAL BLOCK, THEN LENOFF(I), +C I=1,...,N SHOULD BE SET TO THE NUMBER OF NON-ZEROS IN ROW I OF +C THE MATRIX PAQ WHICH ARE IN SUB-DIAGONAL BLOCKS. IF THERE IS +C ONLY ONE DIAGONAL BLOCK THEN LENOFF(1) MAY BE SET TO -1, IN +C WHICH CASE THE OTHER ENTRIES OF LENOFF ARE NEVER ACCESSED. IT IS +C NOT ALTERED BY MA30C/CD. +C IDISP IS AN INTEGER ARRAY OF LENGTH 2 WHICH SHOULD BE UNCHANGED +C SINCE THE LAST CALL TO MA30A/AD. IT IS NOT ALTERED BY MA30C/CD. +C IP,IQ ARE INTEGER ARRAYS OF LENGTH N WHICH SHOULD BE UNCHANGED +C SINCE THE LAST CALL TO MA30A/AD. THEY ARE NOT ALTERED BY +C MA30C/CD. +C X IS A REAL/DOUBLE PRECISION ARRAY OF LENGTH N. IT MUST BE SET BY +C THE USER TO THE VALUES OF THE RIGHT HAND SIDE VECTOR B FOR THE +C EQUATIONS BEING SOLVED. ON EXIT FROM MA30C/CD IT WILL BE EQUAL +C TO THE SOLUTION X REQUIRED. +C W IS A REAL/DOUBLE PRECISION ARRAY OF LENGTH N WHICH IS USED AS +C WORKSPACE BY MA30C/CD. +C MTYPE IS AN INTEGER VARIABLE WHICH MUST BE SET BY THE USER. IF +C MTYPE=1, THEN THE SOLUTION TO THE SYSTEM AX=B IS RETURNED; ANY +C OTHER VALUE FOR MTYPE WILL RETURN THE SOLUTION TO THE SYSTEM A +C TRANSPOSE X=B. IT IS NOT ALTERED BY MA30C/CD. +C +C SEE BLOCK DATA FOR COMMENTS ON VARIABLES IN COMMON. +C .. Parameters .. + DOUBLE PRECISION ZERO + PARAMETER (ZERO=0.0D0) +C .. +C .. Scalar Arguments .. + INTEGER LICN,MTYPE,N +C .. +C .. Array Arguments .. + DOUBLE PRECISION A(LICN),W(N),X(N) + INTEGER ICN(LICN),IDISP(2),IP(N),IQ(N),LENOFF(*),LENR(N),LENRL(N) +C .. +C .. Local Scalars .. + DOUBLE PRECISION WI,WII + INTEGER I,IB,IBACK,IBLEND,IBLOCK,IEND,IFIRST,II,III,ILAST,J,J1,J2, + + J3,JJ,JPIV,JPIVP1,K,LJ1,LJ2,LT,LTEND,NUMBLK + LOGICAL NEG,NOBLOC +C .. +C .. Intrinsic Functions .. + INTRINSIC DABS,DMAX1,IABS +C .. +C .. Common blocks .. + COMMON /MA30HD/RESID + DOUBLE PRECISION RESID +C .. +C .. Save statement .. + SAVE /MA30HD/ +C .. +C .. Executable Statements .. +C +C THE FINAL VALUE OF RESID IS THE MAXIMUM RESIDUAL FOR AN INCONSISTENT +C SET OF EQUATIONS. + RESID = ZERO +C NOBLOC IS .TRUE. IF SUBROUTINE BLOCK HAS BEEN USED PREVIOUSLY AND +C IS .FALSE. OTHERWISE. THE VALUE .FALSE. MEANS THAT LENOFF +C WILL NOT BE SUBSEQUENTLY ACCESSED. + NOBLOC = LENOFF(1) .LT. 0 + IF (MTYPE.NE.1) GO TO 140 +C +C WE NOW SOLVE A * X = B. +C NEG IS USED TO INDICATE WHEN THE LAST ROW IN A BLOCK HAS BEEN +C REACHED. IT IS THEN SET TO TRUE WHEREAFTER BACKSUBSTITUTION IS +C PERFORMED ON THE BLOCK. + NEG = .FALSE. +C IP(N) IS NEGATED SO THAT THE LAST ROW OF THE LAST BLOCK CAN BE +C RECOGNISED. IT IS RESET TO ITS POSITIVE VALUE ON EXIT. + IP(N) = -IP(N) +C PREORDER VECTOR ... W(I) = X(IP(I)) + DO 10 II = 1,N + I = IP(II) + I = IABS(I) + W(II) = X(I) + 10 CONTINUE +C LT HOLDS THE POSITION OF THE FIRST NON-ZERO IN THE CURRENT ROW OF THE +C OFF-DIAGONAL BLOCKS. + LT = 1 +C IFIRST HOLDS THE INDEX OF THE FIRST ROW IN THE CURRENT BLOCK. + IFIRST = 1 +C IBLOCK HOLDS THE POSITION OF THE FIRST NON-ZERO IN THE CURRENT ROW +C OF THE LU DECOMPOSITION OF THE DIAGONAL BLOCKS. + IBLOCK = IDISP(1) +C IF I IS NOT THE LAST ROW OF A BLOCK, THEN A PASS THROUGH THIS LOOP +C ADDS THE INNER PRODUCT OF ROW I OF THE OFF-DIAGONAL BLOCKS AND W +C TO W AND PERFORMS FORWARD ELIMINATION USING ROW I OF THE LU +C DECOMPOSITION. IF I IS THE LAST ROW OF A BLOCK THEN, AFTER +C PERFORMING THESE AFOREMENTIONED OPERATIONS, BACKSUBSTITUTION IS +C PERFORMED USING THE ROWS OF THE BLOCK. + DO 120 I = 1,N + WI = W(I) + IF (NOBLOC) GO TO 30 + IF (LENOFF(I).EQ.0) GO TO 30 +C OPERATIONS USING LOWER TRIANGULAR BLOCKS. +C LTEND IS THE END OF ROW I IN THE OFF-DIAGONAL BLOCKS. + LTEND = LT + LENOFF(I) - 1 + DO 20 JJ = LT,LTEND + J = ICN(JJ) + WI = WI - A(JJ)*W(J) + 20 CONTINUE +C LT IS SET THE BEGINNING OF THE NEXT OFF-DIAGONAL ROW. + LT = LTEND + 1 +C SET NEG TO .TRUE. IF WE ARE ON THE LAST ROW OF THE BLOCK. + 30 IF (IP(I).LT.0) NEG = .TRUE. + IF (LENRL(I).EQ.0) GO TO 50 +C FORWARD ELIMINATION PHASE. +C IEND IS THE END OF THE L PART OF ROW I IN THE LU DECOMPOSITION. + IEND = IBLOCK + LENRL(I) - 1 + DO 40 JJ = IBLOCK,IEND + J = ICN(JJ) + WI = WI + A(JJ)*W(J) + 40 CONTINUE +C IBLOCK IS ADJUSTED TO POINT TO THE START OF THE NEXT ROW. + 50 IBLOCK = IBLOCK + LENR(I) + W(I) = WI + IF (.NOT.NEG) GO TO 120 +C BACK SUBSTITUTION PHASE. +C J1 IS POSITION IN A/ICN AFTER END OF BLOCK BEGINNING IN ROW IFIRST +C AND ENDING IN ROW I. + J1 = IBLOCK +C ARE THERE ANY SINGULARITIES IN THIS BLOCK? IF NOT, CONTINUE WITH +C THE BACKSUBSTITUTION. + IB = I + IF (IQ(I).GT.0) GO TO 70 + DO 60 III = IFIRST,I + IB = I - III + IFIRST + IF (IQ(IB).GT.0) GO TO 70 + J1 = J1 - LENR(IB) + RESID = DMAX1(RESID,DABS(W(IB))) + W(IB) = ZERO + 60 CONTINUE +C ENTIRE BLOCK IS SINGULAR. + GO TO 110 +C EACH PASS THROUGH THIS LOOP PERFORMS THE BACK-SUBSTITUTION +C OPERATIONS FOR A SINGLE ROW, STARTING AT THE END OF THE BLOCK AND +C WORKING THROUGH IT IN REVERSE ORDER. + 70 DO 100 III = IFIRST,IB + II = IB - III + IFIRST +C J2 IS END OF ROW II. + J2 = J1 - 1 +C J1 IS BEGINNING OF ROW II. + J1 = J1 - LENR(II) +C JPIV IS THE POSITION OF THE PIVOT IN ROW II. + JPIV = J1 + LENRL(II) + JPIVP1 = JPIV + 1 +C JUMP IF ROW II OF U HAS NO NON-ZEROS. + IF (J2.LT.JPIVP1) GO TO 90 + WII = W(II) + DO 80 JJ = JPIVP1,J2 + J = ICN(JJ) + WII = WII - A(JJ)*W(J) + 80 CONTINUE + W(II) = WII + 90 W(II) = W(II)/A(JPIV) + 100 CONTINUE + 110 IFIRST = I + 1 + NEG = .FALSE. + 120 CONTINUE +C +C REORDER SOLUTION VECTOR ... X(I) = W(IQINVERSE(I)) + DO 130 II = 1,N + I = IQ(II) + I = IABS(I) + X(I) = W(II) + 130 CONTINUE + IP(N) = -IP(N) + GO TO 320 +C +C +C WE NOW SOLVE ATRANSPOSE * X = B. +C PREORDER VECTOR ... W(I)=X(IQ(I)) + 140 DO 150 II = 1,N + I = IQ(II) + I = IABS(I) + W(II) = X(I) + 150 CONTINUE +C LJ1 POINTS TO THE BEGINNING THE CURRENT ROW IN THE OFF-DIAGONAL +C BLOCKS. + LJ1 = IDISP(1) +C IBLOCK IS INITIALIZED TO POINT TO THE BEGINNING OF THE BLOCK AFTER +C THE LAST ONE ! + IBLOCK = IDISP(2) + 1 +C ILAST IS THE LAST ROW IN THE CURRENT BLOCK. + ILAST = N +C IBLEND POINTS TO THE POSITION AFTER THE LAST NON-ZERO IN THE +C CURRENT BLOCK. + IBLEND = IBLOCK +C EACH PASS THROUGH THIS LOOP OPERATES WITH ONE DIAGONAL BLOCK AND +C THE OFF-DIAGONAL PART OF THE MATRIX CORRESPONDING TO THE ROWS +C OF THIS BLOCK. THE BLOCKS ARE TAKEN IN REVERSE ORDER AND THE +C NUMBER OF TIMES THE LOOP IS ENTERED IS MIN(N,NO. BLOCKS+1). + DO 290 NUMBLK = 1,N + IF (ILAST.EQ.0) GO TO 300 + IBLOCK = IBLOCK - LENR(ILAST) +C THIS LOOP FINDS THE INDEX OF THE FIRST ROW IN THE CURRENT BLOCK.. +C IT IS FIRST AND IBLOCK IS SET TO THE POSITION OF THE BEGINNING +C OF THIS FIRST ROW. + DO 160 K = 1,N + II = ILAST - K + IF (II.EQ.0) GO TO 170 + IF (IP(II).LT.0) GO TO 170 + IBLOCK = IBLOCK - LENR(II) + 160 CONTINUE + 170 IFIRST = II + 1 +C J1 POINTS TO THE POSITION OF THE BEGINNING OF ROW I (LT PART) OR PIVOT + J1 = IBLOCK +C FORWARD ELIMINATION. +C EACH PASS THROUGH THIS LOOP PERFORMS THE OPERATIONS FOR ONE ROW OF THE +C BLOCK. IF THE CORRESPONDING ENTRY OF W IS ZERO THEN THE +C OPERATIONS CAN BE AVOIDED. + DO 210 I = IFIRST,ILAST + IF (W(I).EQ.ZERO) GO TO 200 +C JUMP IF ROW I SINGULAR. + IF (IQ(I).LT.0) GO TO 220 +C J2 FIRST POINTS TO THE PIVOT IN ROW I AND THEN IS MADE TO POINT TO THE +C FIRST NON-ZERO IN THE U TRANSPOSE PART OF THE ROW. + J2 = J1 + LENRL(I) + WI = W(I)/A(J2) + IF (LENR(I)-LENRL(I).EQ.1) GO TO 190 + J2 = J2 + 1 +C J3 POINTS TO THE END OF ROW I. + J3 = J1 + LENR(I) - 1 + DO 180 JJ = J2,J3 + J = ICN(JJ) + W(J) = W(J) - A(JJ)*WI + 180 CONTINUE + 190 W(I) = WI + 200 J1 = J1 + LENR(I) + 210 CONTINUE + GO TO 240 +C DEALS WITH REST OF BLOCK WHICH IS SINGULAR. + 220 DO 230 II = I,ILAST + RESID = DMAX1(RESID,DABS(W(II))) + W(II) = ZERO + 230 CONTINUE +C BACK SUBSTITUTION. +C THIS LOOP DOES THE BACK SUBSTITUTION ON THE ROWS OF THE BLOCK IN +C THE REVERSE ORDER DOING IT SIMULTANEOUSLY ON THE L TRANSPOSE PART +C OF THE DIAGONAL BLOCKS AND THE OFF-DIAGONAL BLOCKS. + 240 J1 = IBLEND + DO 280 IBACK = IFIRST,ILAST + I = ILAST - IBACK + IFIRST +C J1 POINTS TO THE BEGINNING OF ROW I. + J1 = J1 - LENR(I) + IF (LENRL(I).EQ.0) GO TO 260 +C J2 POINTS TO THE END OF THE L TRANSPOSE PART OF ROW I. + J2 = J1 + LENRL(I) - 1 + DO 250 JJ = J1,J2 + J = ICN(JJ) + W(J) = W(J) + A(JJ)*W(I) + 250 CONTINUE + 260 IF (NOBLOC) GO TO 280 +C OPERATIONS USING LOWER TRIANGULAR BLOCKS. + IF (LENOFF(I).EQ.0) GO TO 280 +C LJ2 POINTS TO THE END OF ROW I OF THE OFF-DIAGONAL BLOCKS. + LJ2 = LJ1 - 1 +C LJ1 POINTS TO THE BEGINNING OF ROW I OF THE OFF-DIAGONAL BLOCKS. + LJ1 = LJ1 - LENOFF(I) + DO 270 JJ = LJ1,LJ2 + J = ICN(JJ) + W(J) = W(J) - A(JJ)*W(I) + 270 CONTINUE + 280 CONTINUE + IBLEND = J1 + ILAST = IFIRST - 1 + 290 CONTINUE +C REORDER SOLUTION VECTOR ... X(I)=W(IPINVERSE(I)) + 300 DO 310 II = 1,N + I = IP(II) + I = IABS(I) + X(I) = W(II) + 310 CONTINUE +C + 320 RETURN + + END + SUBROUTINE MA30DD(A,ICN,IPTR,N,IACTIV,ITOP,REALS) +C THIS SUBROUTINE PERFORMS GARBAGE COLLECTION OPERATIONS ON THE +C ARRAYS A, ICN AND IRN. +C IACTIV IS THE FIRST POSITION IN ARRAYS A/ICN FROM WHICH THE COMPRESS +C STARTS. ON EXIT, IACTIV EQUALS THE POSITION OF THE FIRST ENTRY +C IN THE COMPRESSED PART OF A/ICN +C +C SEE BLOCK DATA FOR COMMENTS ON VARIABLES IN COMMON. +C +C .. Scalar Arguments .. + INTEGER IACTIV,ITOP,N + LOGICAL REALS +C .. +C .. Array Arguments .. + DOUBLE PRECISION A(ITOP) + INTEGER ICN(ITOP),IPTR(N) +C .. +C .. Local Scalars .. + INTEGER J,JPOS,K,KL,KN +C .. +C .. Common blocks .. + COMMON /MA30FD/IRNCP,ICNCP,IRANK,MINIRN,MINICN + INTEGER ICNCP,IRANK,IRNCP,MINICN,MINIRN +C .. +C .. Save statement .. + SAVE /MA30FD/ +C .. +C .. Executable Statements .. + IF (REALS) ICNCP = ICNCP + 1 + IF (.NOT.REALS) IRNCP = IRNCP + 1 +C SET THE FIRST NON-ZERO ENTRY IN EACH ROW TO THE NEGATIVE OF THE +C ROW/COL NUMBER AND HOLD THIS ROW/COL INDEX IN THE ROW/COL +C POINTER. THIS IS SO THAT THE BEGINNING OF EACH ROW/COL CAN +C BE RECOGNIZED IN THE SUBSEQUENT SCAN. + DO 10 J = 1,N + K = IPTR(J) + IF (K.LT.IACTIV) GO TO 10 + IPTR(J) = ICN(K) + ICN(K) = -J + 10 CONTINUE + KN = ITOP + 1 + KL = ITOP - IACTIV + 1 +C GO THROUGH ARRAYS IN REVERSE ORDER COMPRESSING TO THE BACK SO +C THAT THERE ARE NO ZEROS HELD IN POSITIONS IACTIV TO ITOP IN ICN. +C RESET FIRST ENTRY OF EACH ROW/COL AND POINTER ARRAY IPTR. + DO 30 K = 1,KL + JPOS = ITOP - K + 1 + IF (ICN(JPOS).EQ.0) GO TO 30 + KN = KN - 1 + IF (REALS) A(KN) = A(JPOS) + IF (ICN(JPOS).GE.0) GO TO 20 +C FIRST NON-ZERO OF ROW/COL HAS BEEN LOCATED + J = -ICN(JPOS) + ICN(JPOS) = IPTR(J) + IPTR(J) = KN + 20 ICN(KN) = ICN(JPOS) + 30 CONTINUE + IACTIV = KN + RETURN + + END + BLOCK DATA MA30JD +C ALTHOUGH ALL COMMON BLOCK VARIABLES DO NOT HAVE DEFAULT VALUES, +C WE COMMENT ON ALL THE COMMON BLOCK VARIABLES HERE. +C +C COMMON BLOCK MA30E/ED HOLDS CONTROL PARAMETERS .... +C COMMON /MA30ED/ LP, ABORT1, ABORT2, ABORT3 +C THE INTEGER LP IS THE UNIT NUMBER TO WHICH THE ERROR MESSAGES ARE +C SENT. LP HAS A DEFAULT VALUE OF 6. THIS DEFAULT VALUE CAN BE +C RESET BY THE USER, IF DESIRED. A VALUE OF 0 SUPPRESSES ALL +C MESSAGES. +C THE LOGICAL VARIABLES ABORT1,ABORT2,ABORT3 ARE USED TO CONTROL THE +C CONDITIONS UNDER WHICH THE SUBROUTINE WILL TERMINATE. +C IF ABORT1 IS .TRUE. THEN THE SUBROUTINE WILL EXIT IMMEDIATELY ON +C DETECTING STRUCTURAL SINGULARITY. +C IF ABORT2 IS .TRUE. THEN THE SUBROUTINE WILL EXIT IMMEDIATELY ON +C DETECTING NUMERICAL SINGULARITY. +C IF ABORT3 IS .TRUE. THEN THE SUBROUTINE WILL EXIT IMMEDIATELY WHEN +C THE AVAILABLE SPACE IN A/ICN IS FILLED UP BY THE PREVIOUSLY +C DECOMPOSED, ACTIVE, AND UNDECOMPOSED PARTS OF THE MATRIX. +C THE DEFAULT VALUES FOR ABORT1,ABORT2,ABORT3 ARE SET TO .TRUE.,.TRUE. +C AND .FALSE. RESPECTIVELY. +C +C THE VARIABLES IN THE COMMON BLOCK MA30F/FD ARE USED TO PROVIDE THE +C USER WITH INFORMATION ON THE DECOMPOSITION. +C COMMON /MA30FD/ IRNCP, ICNCP, IRANK, MINIRN, MINICN +C IRNCP AND ICNCP ARE INTEGER VARIABLES USED TO MONITOR THE ADEQUACY +C OF THE ALLOCATED SPACE IN ARRAYS IRN AND A/ICN RESPECTIVELY, BY +C TAKING ACCOUNT OF THE NUMBER OF DATA MANAGEMENT COMPRESSES +C REQUIRED ON THESE ARRAYS. IF IRNCP OR ICNCP IS FAIRLY LARGE (SAY +C GREATER THAN N/10), IT MAY BE ADVANTAGEOUS TO INCREASE THE SIZE +C OF THE CORRESPONDING ARRAY(S). IRNCP AND ICNCP ARE INITIALIZED +C TO ZERO ON ENTRY TO MA30A/AD AND ARE INCREMENTED EACH TIME THE +C COMPRESSING ROUTINE MA30D/DD IS ENTERED. +C ICNCP IS THE NUMBER OF COMPRESSES ON A/ICN. +C IRNCP IS THE NUMBER OF COMPRESSES ON IRN. +C IRANK IS AN INTEGER VARIABLE WHICH GIVES AN ESTIMATE (ACTUALLY AN +C UPPER BOUND) OF THE RANK OF THE MATRIX. ON AN EXIT WITH IFLAG +C EQUAL TO 0, THIS WILL BE EQUAL TO N. +C MINIRN IS AN INTEGER VARIABLE WHICH, AFTER A SUCCESSFUL CALL TO +C MA30A/AD, INDICATES THE MINIMUM LENGTH TO WHICH IRN CAN BE +C REDUCED WHILE STILL PERMITTING A SUCCESSFUL DECOMPOSITION OF THE +C SAME MATRIX. IF, HOWEVER, THE USER WERE TO DECREASE THE LENGTH +C OF IRN TO THAT SIZE, THE NUMBER OF COMPRESSES (IRNCP) MAY BE +C VERY HIGH AND QUITE COSTLY. IF LIRN IS NOT LARGE ENOUGH TO BEGIN +C THE DECOMPOSITION ON A DIAGONAL BLOCK, MINIRN WILL BE EQUAL TO +C THE VALUE REQUIRED TO CONTINUE THE DECOMPOSITION AND IFLAG WILL +C BE SET TO -3 OR -6. A VALUE OF LIRN SLIGHTLY GREATER THAN THIS +C (SAY ABOUT N/2) WILL USUALLY PROVIDE ENOUGH SPACE TO COMPLETE +C THE DECOMPOSITION ON THAT BLOCK. IN THE EVENT OF ANY OTHER +C FAILURE MINIRN GIVES THE MINIMUM SIZE OF IRN REQUIRED FOR A +C SUCCESSFUL DECOMPOSITION UP TO THAT POINT. +C MINICN IS AN INTEGER VARIABLE WHICH AFTER A SUCCESSFUL CALL TO +C MA30A/AD, INDICATES THE MINIMUM SIZE OF LICN REQUIRED TO ENABLE +C A SUCCESSFUL DECOMPOSITION. IN THE EVENT OF FAILURE WITH IFLAG= +C -5, MINICN WILL, IF ABORT3 IS LEFT SET TO .FALSE., INDICATE THE +C MINIMUM LENGTH THAT WOULD BE SUFFICIENT TO PREVENT THIS ERROR IN +C A SUBSEQUENT RUN ON AN IDENTICAL MATRIX. AGAIN THE USER MAY +C PREFER TO USE A VALUE OF ICN SLIGHTLY GREATER THAN MINICN FOR +C SUBSEQUENT RUNS TO AVOID TOO MANY CONPRESSES (ICNCP). IN THE +C EVENT OF FAILURE WITH IFLAG EQUAL TO ANY NEGATIVE VALUE EXCEPT +C -4, MINICN WILL GIVE THE MINIMUM LENGTH TO WHICH LICN COULD BE +C REDUCED TO ENABLE A SUCCESSFUL DECOMPOSITION TO THE POINT AT +C WHICH FAILURE OCCURRED. NOTICE THAT, ON A SUCCESSFUL ENTRY +C IDISP(2) GIVES THE AMOUNT OF SPACE IN A/ICN REQUIRED FOR THE +C DECOMPOSITION WHILE MINICN WILL USUALLY BE SLIGHTLY GREATER +C BECAUSE OF THE NEED FOR "ELBOW ROOM". IF THE USER IS VERY +C UNSURE HOW LARGE TO MAKE LICN, THE VARIABLE MINICN CAN BE USED +C TO PROVIDE THAT INFORMATION. A PRELIMINARY RUN SHOULD BE +C PERFORMED WITH ABORT3 LEFT SET TO .FALSE. AND LICN ABOUT 3/2 +C TIMES AS BIG AS THE NUMBER OF NON-ZEROS IN THE ORIGINAL MATRIX. +C UNLESS THE INITIAL PROBLEM IS VERY SPARSE (WHEN THE RUN WILL BE +C SUCCESSFUL) OR FILLS IN EXTREMELY BADLY (GIVING AN ERROR RETURN +C WITH IFLAG EQUAL TO -4), AN ERROR RETURN WITH IFLAG EQUAL TO -5 +C SHOULD RESULT AND MINICN WILL GIVE THE AMOUNT OF SPACE REQUIRED +C FOR A SUCCESSFUL DECOMPOSITION. +C +C COMMON BLOCK MA30G/GD IS USED BY THE MA30B/BD ENTRY ONLY. +C COMMON /MA30GD/ EPS, RMIN +C EPS IS A REAL/DOUBLE PRECISION VARIABLE. IT IS USED TO TEST FOR +C SMALL PIVOTS. ITS DEFAULT VALUE IS 1.0E-4 (1.0D-4 IN D VERSION). +C IF THE USER SETS EPS TO ANY VALUE GREATER THAN 1.0, THEN NO +C CHECK IS MADE ON THE SIZE OF THE PIVOTS. ALTHOUGH THE ABSENCE OF +C SUCH A CHECK WOULD FAIL TO WARN THE USER OF BAD INSTABILITY, ITS +C ABSENCE WILL ENABLE MA30B/BD TO RUN SLIGHTLY FASTER. AN A +C POSTERIORI CHECK ON THE STABILITY OF THE FACTORIZATION CAN BE +C OBTAINED FROM MC24A/AD. +C RMIN IS A REAL/DOUBLE PRECISION VARIABLE WHICH GIVES THE USER SOME +C INFORMATION ABOUT THE STABILITY OF THE DECOMPOSITION. AT EACH +C STAGE OF THE LU DECOMPOSITION THE MAGNITUDE OF THE PIVOT APIV +C IS COMPARED WITH THE LARGEST OFF-DIAGONAL ENTRY CURRENTLY IN ITS +C ROW (ROW OF U), ROWMAX SAY. IF THE RATIO +C MIN (APIV/ROWMAX) +C WHERE THE MINIMUM IS TAKEN OVER ALL THE ROWS, IS LESS THAN EPS +C THEN RMIN IS SET TO THIS MINIMUM VALUE AND IFLAG IS RETURNED +C WITH THE VALUE +I WHERE I IS THE ROW IN WHICH THIS MINIMUM +C OCCURS. IF THE USER SETS EPS GREATER THAN ONE, THEN THIS TEST +C IS NOT PERFORMED. IN THIS CASE, AND WHEN THERE ARE NO SMALL +C PIVOTS RMIN WILL BE SET EQUAL TO EPS. +C +C COMMON BLOCK MA30H/HD IS USED BY MA30C/CD ONLY. +C COMMON /MA30HD/ RESID +C RESID IS A REAL/DOUBLE PRECISION VARIABLE. IN THE CASE OF SINGULAR +C OR RECTANGULAR MATRICES ITS FINAL VALUE WILL BE EQUAL TO THE +C MAXIMUM RESIDUAL FOR THE UNSATISFIED EQUATIONS; OTHERWISE ITS +C VALUE WILL BE SET TO ZERO. +C +C COMMON BLOCK MA30I/ID CONTROLS THE USE OF DROP TOLERANCES, THE +C MODIFIED PIVOT OPTION AND THE THE CALCULATION OF THE LARGEST +C ENTRY IN THE FACTORIZATION PROCESS. THIS COMMON BLOCK WAS ADDED +C TO THE MA30 PACKAGE IN FEBRUARY, 1983. +C COMMON /MA30ID/ TOL, BIG, NDROP, NSRCH, LBIG +C TOL IS A REAL/DOUBLE PRECISION VARIABLE. IF IT IS SET TO A POSITIVE +C VALUE, THEN MA30A/AD WILL DROP FROM THE FACTORS ANY NON-ZERO +C WHOSE MODULUS IS LESS THAN TOL. THE FACTORIZATION WILL THEN +C REQUIRE LESS STORAGE BUT WILL BE INACCURATE. AFTER A RUN OF +C MA30A/AD WHERE ENTRIES HAVE BEEN DROPPED, MA30B/BD SHOULD NOT +C BE CALLED. THE DEFAULT VALUE FOR TOL IS 0.0. +C BIG IS A REAL/DOUBLE PRECISION VARIABLE. IF LBIG HAS BEEN SET TO +C .TRUE., BIG WILL BE SET TO THE LARGEST ENTRY ENCOUNTERED DURING +C THE FACTORIZATION. +C NDROP IS AN INTEGER VARIABLE. IF TOL HAS BEEN SET POSITIVE, ON EXIT +C FROM MA30A/AD, NDROP WILL HOLD THE NUMBER OF ENTRIES DROPPED +C FROM THE DATA STRUCTURE. +C NSRCH IS AN INTEGER VARIABLE. IF NSRCH IS SET TO A VALUE LESS THAN +C OR EQUAL TO N, THEN A DIFFERENT PIVOT OPTION WILL BE EMPLOYED BY +C MA30A/AD. THIS MAY RESULT IN DIFFERENT FILL-IN AND EXECUTION +C TIME FOR MA30A/AD. IF NSRCH IS LESS THAN OR EQUAL TO N, THE +C WORKSPACE ARRAYS LASTC AND NEXTC ARE NOT REFERENCED BY MA30A/AD. +C THE DEFAULT VALUE FOR NSRCH IS 32768. +C LBIG IS A LOGICAL VARIABLE. IF LBIG IS SET TO .TRUE., THE VALUE OF +C THE LARGEST ENTRY ENCOUNTERED IN THE FACTORIZATION BY MA30A/AD +C IS RETURNED IN BIG. SETTING LBIG TO .TRUE. WILL MARGINALLY +C INCREASE THE FACTORIZATION TIME FOR MA30A/AD AND WILL INCREASE +C THAT FOR MA30B/BD BY ABOUT 20%. THE DEFAULT VALUE FOR LBIG IS +C .FALSE. +C +C .. Common blocks .. + COMMON /MA30ED/LP,ABORT1,ABORT2,ABORT3 + COMMON /MA30GD/EPS,RMIN + COMMON /MA30ID/TOL,BIG,NDROP,NSRCH,LBIG + DOUBLE PRECISION BIG,EPS,RMIN,TOL + INTEGER LP,NDROP,NSRCH + LOGICAL ABORT1,ABORT2,ABORT3,LBIG +C .. +C .. Save statement .. + SAVE /MA30ED/,/MA30GD/,/MA30ID/ +C .. +C .. Data statements .. + DATA EPS/1.0D-4/,TOL/0.0D0/,BIG/0.0D0/ + DATA LP/6/,NSRCH/32768/ + DATA LBIG/.FALSE./ + DATA ABORT1/.TRUE./,ABORT2/.TRUE./,ABORT3/.FALSE./ +C .. +C .. Executable Statements .. + END +* COPYRIGHT (c) 1976 AEA Technology +* Original date 21 Jan 1993 +C Toolpack tool decs employed. +C Double version of MC13D (name change only) +C 10 August 2001 DOs terminated with CONTINUE +C 13/3/02 Cosmetic changes applied to reduce single/double differences +C +C 12th July 2004 Version 1.0.0. Version numbering added. + + SUBROUTINE MC13DD(N,ICN,LICN,IP,LENR,IOR,IB,NUM,IW) +C .. Scalar Arguments .. + INTEGER LICN,N,NUM +C .. +C .. Array Arguments .. + INTEGER IB(N),ICN(LICN),IOR(N),IP(N),IW(N,3),LENR(N) +C .. +C .. External Subroutines .. + EXTERNAL MC13ED +C .. +C .. Executable Statements .. + CALL MC13ED(N,ICN,LICN,IP,LENR,IOR,IB,NUM,IW(1,1),IW(1,2),IW(1,3)) + RETURN + + END + SUBROUTINE MC13ED(N,ICN,LICN,IP,LENR,ARP,IB,NUM,LOWL,NUMB,PREV) +C +C ARP(I) IS ONE LESS THAN THE NUMBER OF UNSEARCHED EDGES LEAVING +C NODE I. AT THE END OF THE ALGORITHM IT IS SET TO A +C PERMUTATION WHICH PUTS THE MATRIX IN BLOCK LOWER +C TRIANGULAR FORM. +C IB(I) IS THE POSITION IN THE ORDERING OF THE START OF THE ITH +C BLOCK. IB(N+1-I) HOLDS THE NODE NUMBER OF THE ITH NODE +C ON THE STACK. +C LOWL(I) IS THE SMALLEST STACK POSITION OF ANY NODE TO WHICH A PATH +C FROM NODE I HAS BEEN FOUND. IT IS SET TO N+1 WHEN NODE I +C IS REMOVED FROM THE STACK. +C NUMB(I) IS THE POSITION OF NODE I IN THE STACK IF IT IS ON +C IT, IS THE PERMUTED ORDER OF NODE I FOR THOSE NODES +C WHOSE FINAL POSITION HAS BEEN FOUND AND IS OTHERWISE ZERO. +C PREV(I) IS THE NODE AT THE END OF THE PATH WHEN NODE I WAS +C PLACED ON THE STACK. +C +C +C ICNT IS THE NUMBER OF NODES WHOSE POSITIONS IN FINAL ORDERING HAVE +C BEEN FOUND. +C .. Scalar Arguments .. + INTEGER LICN,N,NUM +C .. +C .. Array Arguments .. + INTEGER ARP(N),IB(N),ICN(LICN),IP(N),LENR(N),LOWL(N),NUMB(N), + + PREV(N) +C .. +C .. Local Scalars .. + INTEGER DUMMY,I,I1,I2,ICNT,II,ISN,IST,IST1,IV,IW,J,K,LCNT,NNM1,STP +C .. +C .. Intrinsic Functions .. + INTRINSIC MIN +C .. +C .. Executable Statements .. + ICNT = 0 +C NUM IS THE NUMBER OF BLOCKS THAT HAVE BEEN FOUND. + NUM = 0 + NNM1 = N + N - 1 +C +C INITIALIZATION OF ARRAYS. + DO 20 J = 1,N + NUMB(J) = 0 + ARP(J) = LENR(J) - 1 + 20 CONTINUE +C +C + DO 120 ISN = 1,N +C LOOK FOR A STARTING NODE + IF (NUMB(ISN).NE.0) GO TO 120 + IV = ISN +C IST IS THE NUMBER OF NODES ON THE STACK ... IT IS THE STACK POINTER. + IST = 1 +C PUT NODE IV AT BEGINNING OF STACK. + LOWL(IV) = 1 + NUMB(IV) = 1 + IB(N) = IV +C +C THE BODY OF THIS LOOP PUTS A NEW NODE ON THE STACK OR BACKTRACKS. + DO 110 DUMMY = 1,NNM1 + I1 = ARP(IV) +C HAVE ALL EDGES LEAVING NODE IV BEEN SEARCHED. + IF (I1.LT.0) GO TO 60 + I2 = IP(IV) + LENR(IV) - 1 + I1 = I2 - I1 +C +C LOOK AT EDGES LEAVING NODE IV UNTIL ONE ENTERS A NEW NODE OR +C ALL EDGES ARE EXHAUSTED. + DO 50 II = I1,I2 + IW = ICN(II) +C HAS NODE IW BEEN ON STACK ALREADY. + IF (NUMB(IW).EQ.0) GO TO 100 +C UPDATE VALUE OF LOWL(IV) IF NECESSARY. + LOWL(IV) = MIN(LOWL(IV),LOWL(IW)) + 50 CONTINUE +C +C THERE ARE NO MORE EDGES LEAVING NODE IV. + ARP(IV) = -1 +C IS NODE IV THE ROOT OF A BLOCK. + 60 IF (LOWL(IV).LT.NUMB(IV)) GO TO 90 +C +C ORDER NODES IN A BLOCK. + NUM = NUM + 1 + IST1 = N + 1 - IST + LCNT = ICNT + 1 +C PEEL BLOCK OFF THE TOP OF THE STACK STARTING AT THE TOP AND +C WORKING DOWN TO THE ROOT OF THE BLOCK. + DO 70 STP = IST1,N + IW = IB(STP) + LOWL(IW) = N + 1 + ICNT = ICNT + 1 + NUMB(IW) = ICNT + IF (IW.EQ.IV) GO TO 80 + 70 CONTINUE + 80 IST = N - STP + IB(NUM) = LCNT +C ARE THERE ANY NODES LEFT ON THE STACK. + IF (IST.NE.0) GO TO 90 +C HAVE ALL THE NODES BEEN ORDERED. + IF (ICNT.LT.N) GO TO 120 + GO TO 130 +C +C BACKTRACK TO PREVIOUS NODE ON PATH. + 90 IW = IV + IV = PREV(IV) +C UPDATE VALUE OF LOWL(IV) IF NECESSARY. + LOWL(IV) = MIN(LOWL(IV),LOWL(IW)) + GO TO 110 +C +C PUT NEW NODE ON THE STACK. + 100 ARP(IV) = I2 - II - 1 + PREV(IW) = IV + IV = IW + IST = IST + 1 + LOWL(IV) = IST + NUMB(IV) = IST + K = N + 1 - IST + IB(K) = IV + 110 CONTINUE +C + 120 CONTINUE +C +C +C PUT PERMUTATION IN THE REQUIRED FORM. + 130 DO 140 I = 1,N + II = NUMB(I) + ARP(II) = I + 140 CONTINUE + RETURN + + END +* COPYRIGHT (c) 1975 AEA Technology +*######DATE 4 Oct 1992 +C Toolpack tool decs employed. +C Array lengths given explicitly eg A(MAXA) +C + SUBROUTINE MC20AD(NC,MAXA,A,INUM,JPTR,JNUM,JDISP) +C +C .. Scalar Arguments .. + INTEGER JDISP,MAXA,NC +C .. +C .. Array Arguments .. + DOUBLE PRECISION A(MAXA) + INTEGER INUM(MAXA),JNUM(MAXA),JPTR(NC) +C .. +C .. Local Scalars .. + DOUBLE PRECISION ACE,ACEP + INTEGER I,ICE,ICEP,J,JA,JB,JCE,JCEP,K,KR,LOC,NULL +C .. +C .. Executable Statements .. + NULL = -JDISP +C** CLEAR JPTR + DO 10 J = 1,NC + JPTR(J) = 0 + 10 CONTINUE +C** COUNT THE NUMBER OF ELEMENTS IN EACH COLUMN. + DO 20 K = 1,MAXA + J = JNUM(K) + JDISP + JPTR(J) = JPTR(J) + 1 + 20 CONTINUE +C** SET THE JPTR ARRAY + K = 1 + DO 30 J = 1,NC + KR = K + JPTR(J) + JPTR(J) = K + K = KR + 30 CONTINUE +C +C** REORDER THE ELEMENTS INTO COLUMN ORDER. THE ALGORITHM IS AN +C IN-PLACE SORT AND IS OF ORDER MAXA. + DO 50 I = 1,MAXA +C ESTABLISH THE CURRENT ENTRY. + JCE = JNUM(I) + JDISP + IF (JCE.EQ.0) GO TO 50 + ACE = A(I) + ICE = INUM(I) +C CLEAR THE LOCATION VACATED. + JNUM(I) = NULL +C CHAIN FROM CURRENT ENTRY TO STORE ITEMS. + DO 40 J = 1,MAXA +C CURRENT ENTRY NOT IN CORRECT POSITION. DETERMINE CORRECT +C POSITION TO STORE ENTRY. + LOC = JPTR(JCE) + JPTR(JCE) = JPTR(JCE) + 1 +C SAVE CONTENTS OF THAT LOCATION. + ACEP = A(LOC) + ICEP = INUM(LOC) + JCEP = JNUM(LOC) +C STORE CURRENT ENTRY. + A(LOC) = ACE + INUM(LOC) = ICE + JNUM(LOC) = NULL +C CHECK IF NEXT CURRENT ENTRY NEEDS TO BE PROCESSED. + IF (JCEP.EQ.NULL) GO TO 50 +C IT DOES. COPY INTO CURRENT ENTRY. + ACE = ACEP + ICE = ICEP + JCE = JCEP + JDISP + 40 CONTINUE +C + 50 CONTINUE +C +C** RESET JPTR VECTOR. + JA = 1 + DO 60 J = 1,NC + JB = JPTR(J) + JPTR(J) = JA + JA = JB + 60 CONTINUE + RETURN + + END + SUBROUTINE MC20BD(NC,MAXA,A,INUM,JPTR) +C . . +C .. Scalar Arguments .. + INTEGER MAXA,NC +C .. +C .. Array Arguments .. + DOUBLE PRECISION A(MAXA) + INTEGER INUM(MAXA),JPTR(NC) +C .. +C .. Local Scalars .. + DOUBLE PRECISION ACE + INTEGER ICE,IK,J,JJ,K,KDUMMY,KLO,KMAX,KOR +C .. +C .. Intrinsic Functions .. + INTRINSIC IABS +C .. +C .. Executable Statements .. + KMAX = MAXA + DO 50 JJ = 1,NC + J = NC + 1 - JJ + KLO = JPTR(J) + 1 + IF (KLO.GT.KMAX) GO TO 40 + KOR = KMAX + DO 30 KDUMMY = KLO,KMAX +C ITEMS KOR, KOR+1, .... ,KMAX ARE IN ORDER + ACE = A(KOR-1) + ICE = INUM(KOR-1) + DO 10 K = KOR,KMAX + IK = INUM(K) + IF (IABS(ICE).LE.IABS(IK)) GO TO 20 + INUM(K-1) = IK + A(K-1) = A(K) + 10 CONTINUE + K = KMAX + 1 + 20 INUM(K-1) = ICE + A(K-1) = ACE + KOR = KOR - 1 + 30 CONTINUE +C NEXT COLUMN + 40 KMAX = KLO - 2 + 50 CONTINUE + RETURN + + END +* COPYRIGHT (c) 1977 AEA Technology +* Original date 8 Oct 1992 +C######8/10/92 Toolpack tool decs employed. +C######8/10/92 D version created by name change only. +C 13/3/02 Cosmetic changes applied to reduce single/double differences +C +C 12th July 2004 Version 1.0.0. Version numbering added. + + SUBROUTINE MC21AD(N,ICN,LICN,IP,LENR,IPERM,NUMNZ,IW) +C .. Scalar Arguments .. + INTEGER LICN,N,NUMNZ +C .. +C .. Array Arguments .. + INTEGER ICN(LICN),IP(N),IPERM(N),IW(N,4),LENR(N) +C .. +C .. External Subroutines .. + EXTERNAL MC21BD +C .. +C .. Executable Statements .. + CALL MC21BD(N,ICN,LICN,IP,LENR,IPERM,NUMNZ,IW(1,1),IW(1,2), + + IW(1,3),IW(1,4)) + RETURN +C + END + SUBROUTINE MC21BD(N,ICN,LICN,IP,LENR,IPERM,NUMNZ,PR,ARP,CV,OUT) +C PR(I) IS THE PREVIOUS ROW TO I IN THE DEPTH FIRST SEARCH. +C IT IS USED AS A WORK ARRAY IN THE SORTING ALGORITHM. +C ELEMENTS (IPERM(I),I) I=1, ... N ARE NON-ZERO AT THE END OF THE +C ALGORITHM UNLESS N ASSIGNMENTS HAVE NOT BEEN MADE. IN WHICH CASE +C (IPERM(I),I) WILL BE ZERO FOR N-NUMNZ ENTRIES. +C CV(I) IS THE MOST RECENT ROW EXTENSION AT WHICH COLUMN I +C WAS VISITED. +C ARP(I) IS ONE LESS THAN THE NUMBER OF NON-ZEROS IN ROW I +C WHICH HAVE NOT BEEN SCANNED WHEN LOOKING FOR A CHEAP ASSIGNMENT. +C OUT(I) IS ONE LESS THAN THE NUMBER OF NON-ZEROS IN ROW I +C WHICH HAVE NOT BEEN SCANNED DURING ONE PASS THROUGH THE MAIN LOOP. +C +C INITIALIZATION OF ARRAYS. +C .. Scalar Arguments .. + INTEGER LICN,N,NUMNZ +C .. +C .. Array Arguments .. + INTEGER ARP(N),CV(N),ICN(LICN),IP(N),IPERM(N),LENR(N),OUT(N),PR(N) +C .. +C .. Local Scalars .. + INTEGER I,II,IN1,IN2,IOUTK,J,J1,JORD,K,KK +C .. +C .. Executable Statements .. + DO 10 I = 1,N + ARP(I) = LENR(I) - 1 + CV(I) = 0 + IPERM(I) = 0 + 10 CONTINUE + NUMNZ = 0 +C +C +C MAIN LOOP. +C EACH PASS ROUND THIS LOOP EITHER RESULTS IN A NEW ASSIGNMENT +C OR GIVES A ROW WITH NO ASSIGNMENT. + DO 100 JORD = 1,N + J = JORD + PR(J) = -1 + DO 70 K = 1,JORD +C LOOK FOR A CHEAP ASSIGNMENT + IN1 = ARP(J) + IF (IN1.LT.0) GO TO 30 + IN2 = IP(J) + LENR(J) - 1 + IN1 = IN2 - IN1 + DO 20 II = IN1,IN2 + I = ICN(II) + IF (IPERM(I).EQ.0) GO TO 80 + 20 CONTINUE +C NO CHEAP ASSIGNMENT IN ROW. + ARP(J) = -1 +C BEGIN LOOKING FOR ASSIGNMENT CHAIN STARTING WITH ROW J. + 30 CONTINUE + OUT(J) = LENR(J) - 1 +C INNER LOOP. EXTENDS CHAIN BY ONE OR BACKTRACKS. + DO 60 KK = 1,JORD + IN1 = OUT(J) + IF (IN1.LT.0) GO TO 50 + IN2 = IP(J) + LENR(J) - 1 + IN1 = IN2 - IN1 +C FORWARD SCAN. + DO 40 II = IN1,IN2 + I = ICN(II) + IF (CV(I).EQ.JORD) GO TO 40 +C COLUMN I HAS NOT YET BEEN ACCESSED DURING THIS PASS. + J1 = J + J = IPERM(I) + CV(I) = JORD + PR(J) = J1 + OUT(J1) = IN2 - II - 1 + GO TO 70 +C + 40 CONTINUE +C +C BACKTRACKING STEP. + 50 CONTINUE + J = PR(J) + IF (J.EQ.-1) GO TO 100 + 60 CONTINUE +C + 70 CONTINUE +C +C NEW ASSIGNMENT IS MADE. + 80 CONTINUE + IPERM(I) = J + ARP(J) = IN2 - II - 1 + NUMNZ = NUMNZ + 1 + DO 90 K = 1,JORD + J = PR(J) + IF (J.EQ.-1) GO TO 100 + II = IP(J) + LENR(J) - OUT(J) - 2 + I = ICN(II) + IPERM(I) = J + 90 CONTINUE +C + 100 CONTINUE +C +C IF MATRIX IS STRUCTURALLY SINGULAR, WE NOW COMPLETE THE +C PERMUTATION IPERM. + IF (NUMNZ.EQ.N) RETURN + DO 110 I = 1,N + ARP(I) = 0 + 110 CONTINUE + K = 0 + DO 130 I = 1,N + IF (IPERM(I).NE.0) GO TO 120 + K = K + 1 + OUT(K) = I + GO TO 130 +C + 120 CONTINUE + J = IPERM(I) + ARP(J) = I + 130 CONTINUE + K = 0 + DO 140 I = 1,N + IF (ARP(I).NE.0) GO TO 140 + K = K + 1 + IOUTK = OUT(K) + IPERM(IOUTK) = I + 140 CONTINUE + RETURN +C + END +* COPYRIGHT (c) 1976 AEA Technology +* Original date 21 Jan 1993 +C 8 August 2000: CONTINUEs given to DOs. +C 20/2/02 Cosmetic changes applied to reduce single/double differences + +C +C 12th July 2004 Version 1.0.0. Version numbering added. + + SUBROUTINE MC22AD(N,ICN,A,NZ,LENROW,IP,IQ,IW,IW1) +C .. Scalar Arguments .. + INTEGER N,NZ +C .. +C .. Array Arguments .. + DOUBLE PRECISION A(NZ) + INTEGER ICN(NZ),IP(N),IQ(N),IW(N,2),IW1(NZ),LENROW(N) +C .. +C .. Local Scalars .. + DOUBLE PRECISION AVAL + INTEGER I,ICHAIN,IOLD,IPOS,J,J2,JJ,JNUM,JVAL,LENGTH,NEWPOS +C .. +C .. Intrinsic Functions .. + INTRINSIC IABS +C .. +C .. Executable Statements .. + IF (NZ.LE.0) GO TO 1000 + IF (N.LE.0) GO TO 1000 +C SET START OF ROW I IN IW(I,1) AND LENROW(I) IN IW(I,2) + IW(1,1) = 1 + IW(1,2) = LENROW(1) + DO 10 I = 2,N + IW(I,1) = IW(I-1,1) + LENROW(I-1) + IW(I,2) = LENROW(I) + 10 CONTINUE +C PERMUTE LENROW ACCORDING TO IP. SET OFF-SETS FOR NEW POSITION +C OF ROW IOLD IN IW(IOLD,1) AND PUT OLD ROW INDICES IN IW1 IN +C POSITIONS CORRESPONDING TO THE NEW POSITION OF THIS ROW IN A/ICN. + JJ = 1 + DO 20 I = 1,N + IOLD = IP(I) + IOLD = IABS(IOLD) + LENGTH = IW(IOLD,2) + LENROW(I) = LENGTH + IF (LENGTH.EQ.0) GO TO 20 + IW(IOLD,1) = IW(IOLD,1) - JJ + J2 = JJ + LENGTH - 1 + DO 15 J = JJ,J2 + IW1(J) = IOLD + 15 CONTINUE + JJ = J2 + 1 + 20 CONTINUE +C SET INVERSE PERMUTATION TO IQ IN IW(.,2). + DO 30 I = 1,N + IOLD = IQ(I) + IOLD = IABS(IOLD) + IW(IOLD,2) = I + 30 CONTINUE +C PERMUTE A AND ICN IN PLACE, CHANGING TO NEW COLUMN NUMBERS. +C +C *** MAIN LOOP *** +C EACH PASS THROUGH THIS LOOP PLACES A CLOSED CHAIN OF COLUMN INDICES +C IN THEIR NEW (AND FINAL) POSITIONS ... THIS IS RECORDED BY +C SETTING THE IW1 ENTRY TO ZERO SO THAT ANY WHICH ARE SUBSEQUENTLY +C ENCOUNTERED DURING THIS MAJOR SCAN CAN BE BYPASSED. + DO 200 I = 1,NZ + IOLD = IW1(I) + IF (IOLD.EQ.0) GO TO 200 + IPOS = I + JVAL = ICN(I) +C IF ROW IOLD IS IN SAME POSITIONS AFTER PERMUTATION GO TO 150. + IF (IW(IOLD,1).EQ.0) GO TO 150 + AVAL = A(I) +C ** CHAIN LOOP ** +C EACH PASS THROUGH THIS LOOP PLACES ONE (PERMUTED) COLUMN INDEX +C IN ITS FINAL POSITION .. VIZ. IPOS. + DO 100 ICHAIN = 1,NZ +C NEWPOS IS THE ORIGINAL POSITION IN A/ICN OF THE ELEMENT TO BE PLACED +C IN POSITION IPOS. IT IS ALSO THE POSITION OF THE NEXT ELEMENT IN +C THE CHAIN. + NEWPOS = IPOS + IW(IOLD,1) +C IS CHAIN COMPLETE ? + IF (NEWPOS.EQ.I) GO TO 130 + A(IPOS) = A(NEWPOS) + JNUM = ICN(NEWPOS) + ICN(IPOS) = IW(JNUM,2) + IPOS = NEWPOS + IOLD = IW1(IPOS) + IW1(IPOS) = 0 +C ** END OF CHAIN LOOP ** + 100 CONTINUE + 130 A(IPOS) = AVAL + 150 ICN(IPOS) = IW(JVAL,2) +C *** END OF MAIN LOOP *** + 200 CONTINUE +C + 1000 RETURN + + END +* COPYRIGHT (c) 1993 AEA Technology +*######DATE 21 Jan 1993 +C Toolpack tool decs employed. +C SAVE statements added. +C MC23CD reference removed. +C 12/12/94 Calls of MC13D and MC21A changed to MC13DD and MC21AD +C +C EAT 21/6/93 EXTERNAL statement put in for block data on VAXs. +C +C + SUBROUTINE MC23AD(N,ICN,A,LICN,LENR,IDISP,IP,IQ,LENOFF,IW,IW1) +C INPUT ... N,ICN .. A,ICN,LENR .... +C +C SET UP POINTERS IW(.,1) TO THE BEGINNING OF THE ROWS AND SET LENOFF +C EQUAL TO LENR. +C .. Scalar Arguments .. + INTEGER LICN,N +C .. +C .. Array Arguments .. + DOUBLE PRECISION A(LICN) + INTEGER ICN(LICN),IDISP(2),IP(N),IQ(N),IW(N,5),IW1(N,2),LENOFF(N), + + LENR(N) +C .. +C .. Local Scalars .. + INTEGER I,I1,I2,IBEG,IBLOCK,IEND,II,ILEND,INEW,IOLD,IROWB,IROWE,J, + + JJ,JNEW,JNPOS,JOLD,K,LENI,NZ +C .. +C .. External Subroutines .. + EXTERNAL MC13DD,MC21AD +C .. +C .. Data block external statement + EXTERNAL MC23CD +C .. +C .. Intrinsic Functions .. + INTRINSIC MAX0,MIN0 +C .. +C .. Common blocks .. + COMMON /MC23BD/LP,NUMNZ,NUM,LARGE,ABORT + INTEGER LARGE,LP,NUM,NUMNZ + LOGICAL ABORT +C .. +C .. Save statement .. + SAVE /MC23BD/ +C .. +C .. Executable Statements .. + IW1(1,1) = 1 + LENOFF(1) = LENR(1) + IF (N.EQ.1) GO TO 20 + DO 10 I = 2,N + LENOFF(I) = LENR(I) + 10 IW1(I,1) = IW1(I-1,1) + LENR(I-1) +C IDISP(1) POINTS TO THE FIRST POSITION IN A/ICN AFTER THE +C OFF-DIAGONAL BLOCKS AND UNTREATED ROWS. + 20 IDISP(1) = IW1(N,1) + LENR(N) +C +C FIND ROW PERMUTATION IP TO MAKE DIAGONAL ZERO-FREE. + CALL MC21AD(N,ICN,LICN,IW1,LENR,IP,NUMNZ,IW) +C +C POSSIBLE ERROR RETURN FOR STRUCTURALLY SINGULAR MATRICES. + IF (NUMNZ.NE.N .AND. ABORT) GO TO 170 +C +C IW1(.,2) AND LENR ARE PERMUTATIONS OF IW1(.,1) AND LENR/LENOFF +C SUITABLE FOR ENTRY +C TO MC13DD SINCE MATRIX WITH THESE ROW POINTER AND LENGTH ARRAYS +C HAS MAXIMUM NUMBER OF NON-ZEROS ON THE DIAGONAL. + DO 30 II = 1,N + I = IP(II) + IW1(II,2) = IW1(I,1) + 30 LENR(II) = LENOFF(I) +C +C FIND SYMMETRIC PERMUTATION IQ TO BLOCK LOWER TRIANGULAR FORM. + CALL MC13DD(N,ICN,LICN,IW1(1,2),LENR,IQ,IW(1,4),NUM,IW) +C + IF (NUM.NE.1) GO TO 60 +C +C ACTION TAKEN IF MATRIX IS IRREDUCIBLE. +C WHOLE MATRIX IS JUST MOVED TO THE END OF THE STORAGE. + DO 40 I = 1,N + LENR(I) = LENOFF(I) + IP(I) = I + 40 IQ(I) = I + LENOFF(1) = -1 +C IDISP(1) IS THE FIRST POSITION AFTER THE LAST ELEMENT IN THE +C OFF-DIAGONAL BLOCKS AND UNTREATED ROWS. + NZ = IDISP(1) - 1 + IDISP(1) = 1 +C IDISP(2) IS THE POSITION IN A/ICN OF THE FIRST ELEMENT IN THE +C DIAGONAL BLOCKS. + IDISP(2) = LICN - NZ + 1 + LARGE = N + IF (NZ.EQ.LICN) GO TO 230 + DO 50 K = 1,NZ + J = NZ - K + 1 + JJ = LICN - K + 1 + A(JJ) = A(J) + 50 ICN(JJ) = ICN(J) +C 230 = RETURN + GO TO 230 +C +C DATA STRUCTURE REORDERED. +C +C FORM COMPOSITE ROW PERMUTATION ... IP(I) = IP(IQ(I)). + 60 DO 70 II = 1,N + I = IQ(II) + 70 IW(II,1) = IP(I) + DO 80 I = 1,N + 80 IP(I) = IW(I,1) +C +C RUN THROUGH BLOCKS IN REVERSE ORDER SEPARATING DIAGONAL BLOCKS +C WHICH ARE MOVED TO THE END OF THE STORAGE. ELEMENTS IN +C OFF-DIAGONAL BLOCKS ARE LEFT IN PLACE UNLESS A COMPRESS IS +C NECESSARY. +C +C IBEG INDICATES THE LOWEST VALUE OF J FOR WHICH ICN(J) HAS BEEN +C SET TO ZERO WHEN ELEMENT IN POSITION J WAS MOVED TO THE +C DIAGONAL BLOCK PART OF STORAGE. + IBEG = LICN + 1 +C IEND IS THE POSITION OF THE FIRST ELEMENT OF THOSE TREATED ROWS +C WHICH ARE IN DIAGONAL BLOCKS. + IEND = LICN + 1 +C LARGE IS THE DIMENSION OF THE LARGEST BLOCK ENCOUNTERED SO FAR. + LARGE = 0 +C +C NUM IS THE NUMBER OF DIAGONAL BLOCKS. + DO 150 K = 1,NUM + IBLOCK = NUM - K + 1 +C I1 IS FIRST ROW (IN PERMUTED FORM) OF BLOCK IBLOCK. +C I2 IS LAST ROW (IN PERMUTED FORM) OF BLOCK IBLOCK. + I1 = IW(IBLOCK,4) + I2 = N + IF (K.NE.1) I2 = IW(IBLOCK+1,4) - 1 + LARGE = MAX0(LARGE,I2-I1+1) +C GO THROUGH THE ROWS OF BLOCK IBLOCK IN THE REVERSE ORDER. + DO 140 II = I1,I2 + INEW = I2 - II + I1 +C WE NOW DEAL WITH ROW INEW IN PERMUTED FORM (ROW IOLD IN ORIGINAL +C MATRIX). + IOLD = IP(INEW) +C IF THERE IS SPACE TO MOVE UP DIAGONAL BLOCK PORTION OF ROW GO TO 110 + IF (IEND-IDISP(1).GE.LENOFF(IOLD)) GO TO 110 +C +C IN-LINE COMPRESS. +C MOVES SEPARATED OFF-DIAGONAL ELEMENTS AND UNTREATED ROWS TO +C FRONT OF STORAGE. + JNPOS = IBEG + ILEND = IDISP(1) - 1 + IF (ILEND.LT.IBEG) GO TO 190 + DO 90 J = IBEG,ILEND + IF (ICN(J).EQ.0) GO TO 90 + ICN(JNPOS) = ICN(J) + A(JNPOS) = A(J) + JNPOS = JNPOS + 1 + 90 CONTINUE + IDISP(1) = JNPOS + IF (IEND-JNPOS.LT.LENOFF(IOLD)) GO TO 190 + IBEG = LICN + 1 +C RESET POINTERS TO THE BEGINNING OF THE ROWS. + DO 100 I = 2,N + 100 IW1(I,1) = IW1(I-1,1) + LENOFF(I-1) +C +C ROW IOLD IS NOW SPLIT INTO DIAG. AND OFF-DIAG. PARTS. + 110 IROWB = IW1(IOLD,1) + LENI = 0 + IROWE = IROWB + LENOFF(IOLD) - 1 +C BACKWARD SCAN OF WHOLE OF ROW IOLD (IN ORIGINAL MATRIX). + IF (IROWE.LT.IROWB) GO TO 130 + DO 120 JJ = IROWB,IROWE + J = IROWE - JJ + IROWB + JOLD = ICN(J) +C IW(.,2) HOLDS THE INVERSE PERMUTATION TO IQ. +C ..... IT WAS SET TO THIS IN MC13DD. + JNEW = IW(JOLD,2) +C IF (JNEW.LT.I1) THEN .... +C ELEMENT IS IN OFF-DIAGONAL BLOCK AND SO IS LEFT IN SITU. + IF (JNEW.LT.I1) GO TO 120 +C ELEMENT IS IN DIAGONAL BLOCK AND IS MOVED TO THE END OF THE STORAGE. + IEND = IEND - 1 + A(IEND) = A(J) + ICN(IEND) = JNEW + IBEG = MIN0(IBEG,J) + ICN(J) = 0 + LENI = LENI + 1 + 120 CONTINUE +C + LENOFF(IOLD) = LENOFF(IOLD) - LENI + 130 LENR(INEW) = LENI + 140 CONTINUE +C + IP(I2) = -IP(I2) + 150 CONTINUE +C RESETS IP(N) TO POSITIVE VALUE. + IP(N) = -IP(N) +C IDISP(2) IS POSITION OF FIRST ELEMENT IN DIAGONAL BLOCKS. + IDISP(2) = IEND +C +C THIS COMPRESS IS USED TO MOVE ALL OFF-DIAGONAL ELEMENTS TO THE +C FRONT OF THE STORAGE. + IF (IBEG.GT.LICN) GO TO 230 + JNPOS = IBEG + ILEND = IDISP(1) - 1 + DO 160 J = IBEG,ILEND + IF (ICN(J).EQ.0) GO TO 160 + ICN(JNPOS) = ICN(J) + A(JNPOS) = A(J) + JNPOS = JNPOS + 1 + 160 CONTINUE +C IDISP(1) IS FIRST POSITION AFTER LAST ELEMENT OF OFF-DIAGONAL BLOCKS. + IDISP(1) = JNPOS + GO TO 230 +C +C +C ERROR RETURN + 170 IF (LP.NE.0) WRITE (LP,FMT=180) NUMNZ + + 180 FORMAT (/,' ERROR RETURN FROM MC23A BECAUSE',/,10X, + + ' MATRIX IS STRUCTURALLY SINGULAR, RANK = ',I6) + + IDISP(1) = -1 + GO TO 230 + + 190 IF (LP.NE.0) WRITE (LP,FMT=200) N + + 200 FORMAT (/,' ERROR RETURN FROM MC23A BECAUSE',/,10X, + + ' LICN NOT BIG ENOUGH INCREASE BY ',I6) + + IDISP(1) = -2 +C + 230 RETURN + + END + BLOCK DATA MC23CD +C .. Common blocks .. + COMMON /MC23BD/LP,NUMNZ,NUM,LARGE,ABORT + INTEGER LARGE,LP,NUM,NUMNZ + LOGICAL ABORT +C .. +C .. Save statement .. + SAVE /MC23BD/ +C .. +C .. Data statements .. + DATA LP/6/,ABORT/.FALSE./ +C .. +C .. Executable Statements .. + END +* COPYRIGHT (c) 1977 AEA Technology +*######DATE 22 Feb 1993 +C Toolpack tool decs employed. +C ZERO made PARAMETER. +C + SUBROUTINE MC24AD(N,ICN,A,LICN,LENR,LENRL,W) +C .. Parameters .. + DOUBLE PRECISION ZERO + PARAMETER (ZERO=0.0D0) +C .. +C .. Scalar Arguments .. + INTEGER LICN,N +C .. +C .. Array Arguments .. + DOUBLE PRECISION A(LICN),W(N) + INTEGER ICN(LICN),LENR(N),LENRL(N) +C .. +C .. Local Scalars .. + DOUBLE PRECISION AMAXL,AMAXU,WROWL + INTEGER I,J,J0,J1,J2,JJ +C .. +C .. Intrinsic Functions .. + INTRINSIC DABS,DMAX1 +C .. +C .. Executable Statements .. + AMAXL = ZERO + DO 10 I = 1,N + 10 W(I) = ZERO + J0 = 1 + DO 100 I = 1,N + IF (LENR(I).EQ.0) GO TO 100 + J2 = J0 + LENR(I) - 1 + IF (LENRL(I).EQ.0) GO TO 50 +C CALCULATION OF 1-NORM OF L. + J1 = J0 + LENRL(I) - 1 + WROWL = ZERO + DO 30 JJ = J0,J1 + 30 WROWL = WROWL + DABS(A(JJ)) +C AMAXL IS THE MAXIMUM NORM OF COLUMNS OF L SO FAR FOUND. + AMAXL = DMAX1(AMAXL,WROWL) + J0 = J1 + 1 +C CALCULATION OF NORMS OF COLUMNS OF U (MAX-NORMS). + 50 J0 = J0 + 1 + IF (J0.GT.J2) GO TO 90 + DO 80 JJ = J0,J2 + J = ICN(JJ) + 80 W(J) = DMAX1(DABS(A(JJ)),W(J)) + 90 J0 = J2 + 1 + 100 CONTINUE +C AMAXU IS SET TO MAXIMUM MAX-NORM OF COLUMNS OF U. + AMAXU = ZERO + DO 200 I = 1,N + 200 AMAXU = DMAX1(AMAXU,W(I)) +C GROFAC IS MAX U MAX-NORM TIMES MAX L 1-NORM. + W(1) = AMAXL*AMAXU + RETURN + + END +* COPYRIGHT (c) 1993 Council for the Central Laboratory +* of the Research Councils +* Original date 15 March 1993 + +* 12th July 2004 Version 1.0.0. Version numbering added. + + SUBROUTINE MC30AD(N,NE,A,IRN,ICN,S,W,LP,IFAIL) + INTEGER N,NE + DOUBLE PRECISION A(NE) + INTEGER IRN(NE),ICN(NE) + DOUBLE PRECISION S(N),W(N,4) + INTEGER LP,IFAIL +C N is an integer variable that must be set to the matrix order. +C It is not altered by the subroutine. +C NE is an integer variable that must be set to the number of entries. +C It is not altered by the subroutine. +C A is an array that holds the values of the entries. +C IRN is an integer array that must be set to the row indices of the +C entries. It is not altered by the subroutine. +C ICN is an integer array that must be set to the column indices of the +C entries. It is not altered by the subroutine. +C S is an array that need not be be on entry. On return, it holds the +C logarithms of the scaling factors. +C W is a workarray. +C W(:,1) holds row non-zero counts (diagonal matrix M). +C W(:,2) holds the residual vector r. +C W(:,3) holds the cg vector p. +C W(:,4) holds the cg vector (M+E)p. +C LP must be set to the unit number for messages. +C It is not altered by the subroutine. +C IFAIL need not be set by the user. On return it has one of the +C following values: +C 0 successful entry. +C -1 N < 1. +C -2 NE < 1. + + INTRINSIC LOG,ABS,MAX,MIN + +C Constants + INTEGER M,MAXIT,R,P,MP + PARAMETER (M=1,MAXIT=10,MP=4,P=3,R=2) + DOUBLE PRECISION ONE,RMIN,ZERO + PARAMETER (ONE=1D0,RMIN=0.1,ZERO=0D0) +C M W(:,M) holds row non-zero counts (diagonal matrix M). +C MAXIT is the maximal permitted number of iterations. +C MP W(:,MP) holds the cg vector (M+E)p. +C P W(:,P) holds the cg vector p. +C R W(:,R) holds the residual vector. +C RMIN is used in a convergence test on (residual norm)**2 + +C Local variables + DOUBLE PRECISION AK,BK + INTEGER I,ITER,J,K + DOUBLE PRECISION PP,RM,RR,RRL,U +C AK Scalar of cg iteration. +C BK Scalar of cg iteration. +C I Row index. +C ITER Iteration index. +C J Column index. +C K Entry number. +C PP Scalar p'(M+E)p of cg iteration. +C RM Threshold for RR. +C RR Scalar r'(inv M)r of cg iteration. +C RRL Previous value of RR. +C U abs(A(K)). + +C Check N and NE. + IFAIL = 0 + IF (N.LT.1) THEN + IFAIL = -1 + GO TO 130 + ELSE IF (NE.LE.0) THEN + IFAIL = -2 + GO TO 130 + END IF +C +C Initialise for accumulation of sums and products. + DO 10 I = 1,N + S(I) = ZERO + W(I,M) = ZERO + W(I,R) = ZERO + 10 CONTINUE + +C Count non-zeros in the rows, and compute rhs vectors. + DO 40 K = 1,NE + U = ABS(A(K)) + IF (U.EQ.ZERO) GO TO 40 + I = IRN(K) + J = ICN(K) + IF ( MIN(I,J).LT.1 .OR. MAX(I,J).GT.N ) GO TO 40 + U = LOG(U) + W(I,M) = W(I,M) + ONE + W(I,R) = W(I,R) - U + W(J,M) = W(J,M) + ONE + IF(I.EQ.J) GO TO 40 + W(J,R) = W(J,R) - U + 40 CONTINUE + +C Find the initial vectors + RR = ZERO + DO 50 I = 1,N + IF (W(I,M).EQ.ZERO) W(I,M) = ONE + W(I,P) = W(I,R)/W(I,M) + W(I,MP) = W(I,R) + RR = RR + W(I,R)**2/W(I,M) + 50 CONTINUE + + RM = RMIN*NE + IF (RR.LE.RM) RETURN +C +C Iteration loop + DO 120 ITER = 1,MAXIT +C Sweep through matrix to add Ep to Mp + DO 80 K = 1,NE + IF (A(K).EQ.ZERO) GO TO 80 + I = ICN(K) + J = IRN(K) + IF(I.EQ.J) GO TO 80 + IF ( MIN(I,J).LT.1 .OR. MAX(I,J).GT.N ) GO TO 80 + W(I,MP) = W(I,MP) + W(J,P) + W(J,MP) = W(J,MP) + W(I,P) + 80 CONTINUE + PP = ZERO + DO 90 I = 1,N + PP = PP + W(I,P)*W(I,MP) + 90 CONTINUE + AK = RR/PP +C Update solution and residual + RRL = RR + RR = ZERO + DO 100 I = 1,N + S(I) = S(I) + AK*W(I,P) + W(I,R) = W(I,R) - AK*W(I,MP) + RR = RR + W(I,R)**2/W(I,M) + 100 CONTINUE + IF (RR.LE.RM) RETURN +C Update vector P. + BK = RR/RRL + DO 110 I = 1,N + W(I,P) = W(I,R)/W(I,M) + BK*W(I,P) + W(I,MP) = W(I,P)*W(I,M) + 110 CONTINUE + 120 CONTINUE + +C Error returns + 130 IF (LP.GT.0) WRITE (LP,'(/A/A,I3)') + + ' **** Error return from MC30AD ****',' IFAIL =',IFAIL + END +* COPYRIGHT (c) 1987 AEA Technology +* Original date 10 Feb 1993 +C Toolpack tool decs employed. +C 20/2/02 Cosmetic changes applied to reduce single/double differences + +C 12th July 2004 Version 1.0.0. Version numbering added. + + SUBROUTINE MC34AD(N,IRN,JCOLST,YESA,A,IW) +C THIS SUBROUTINE ACCEPTS AS INPUT THE STANDARD DATA STRUCTURE FOR +C A SYMMETRIC MATRIX STORED AS A LOWER TRIANGLE AND PRODUCES +C AS OUTPUT THE SYMMETRIC MATRIX HELD IN THE SAME DATA +C STRUCTURE AS A GENERAL MATRIX. +C N IS AN INTEGER VARIABLE THAT MUST BE SET BY THE USER TO THE +C ORDER OF THE MATRIX. NOT ALTERED BY THE ROUTINE +C RESTRICTION (IBM VERSION ONLY): N LE 32767. +C IRN IS AN INTEGER (INTEGER*2 IN IBM VERSION) ARRAY THAT +C MUST BE SET BY THE USER TO HOLD THE ROW INDICES OF THE LOWER +C TRIANGULAR PART OF THE SYMMETRIC MATRIX. THE ENTRIES OF A +C SINGLE COLUMN ARE CONTIGUOUS. THE ENTRIES OF COLUMN J +C PRECEDE THOSE OF COLUMN J+1 (J_=_1, ..., N-1), AND THERE IS +C NO WASTED SPACE BETWEEN COLUMNS. ROW INDICES WITHIN A COLUMN +C MAY BE IN ANY ORDER. ON EXIT IT WILL HAVE THE SAME MEANING +C BUT WILL BE CHANGED TO HOLD THE ROW INDICES OF ENTRIES IN +C THE EXPANDED STRUCTURE. DIAGONAL ENTRIES NEED NOT BE +C PRESENT. THE NEW ROW INDICES ADDED IN THE UPPER TRIANGULAR +C PART WILL BE IN ORDER FOR EACH COLUMN AND WILL PRECEDE THE +C ROW INDICES FOR THE LOWER TRIANGULAR PART WHICH WILL REMAIN +C IN THE INPUT ORDER. +C JCOLST IS AN INTEGER ARRAY OF LENGTH N+1 THAT MUST BE SET BY +C THE USER SO THAT JCOLST(J) IS THE POSITION IN ARRAYS IRN AND +C A OF THE FIRST ENTRY IN COLUMN J (J_=_1, ..., N). +C JCOLST(N+1) MUST BE SET TO ONE MORE THAN THE TOTAL NUMBER OF +C ENTRIES. ON EXIT, JCOLST(J) WILL HAVE THE SAME MEANING BUT +C WILL BE CHANGED TO POINT TO THE POSITION OF THE FIRST ENTRY +C OF COLUMN J IN THE EXPANDED STRUCTURE. THE NEW VALUE OF +C JCOLST(N+1) WILL BE ONE GREATER THAN THE NUMBER OF ENTRIES +C IN THE EXPANDED STRUCTURE. +C YESA IS A LOGICAL VARIABLE THAT MUST BE SET TO .TRUE. IF THE +C USER DESIRES TO GENERATE THE EXPANDED FORM FOR THE VALUES ALSO. +C IF YESA IS .FALSE., THE ARRAY A WILL NOT BE REFERENCED. IT IS +C NOT ALTERED BY THE ROUTINE. +C A IS A REAL (DOUBLE PRECISION IN THE D VERSION) ARRAY THAT +C CAN BE SET BY THE USER SO THAT A(K) HOLDS THE VALUE OF THE +C ENTRY IN POSITION K OF IRN, {K = 1, _..._ JCOLST(N+1)-1}. +C ON EXIT, IF YESA IS .TRUE., THE ARRAY WILL HOLD THE VALUES +C OF THE ENTRIES IN THE EXPANDED STRUCTURE CORRESPONDING TO +C THE OUTPUT VALUES OF IRN. IF YESA IS .FALSE., THE ARRAY IS +C NOT ACCESSED BY THE SUBROUTINE. +C IW IS AN INTEGER (INTEGER*2 IN IBM VERSION) ARRAY OF LENGTH +C N THAT WILL BE USED AS WORKSPACE. +C +C CKP1 IS A LOCAL VARIABLE USED AS A RUNNING POINTER. +C OLDTAU IS NUMBER OF ENTRIES IN SYMMETRIC STORAGE. +C .. Scalar Arguments .. + INTEGER N + LOGICAL YESA +C .. +C .. Array Arguments .. + DOUBLE PRECISION A(*) + INTEGER IRN(*),IW(*),JCOLST(*) +C .. +C .. Local Scalars .. + INTEGER CKP1,I,I1,I2,II,IPKP1,IPOS,J,JSTART,LENK,NDIAG,NEWTAU, + + OLDTAU +C .. +C .. Executable Statements .. +C + OLDTAU = JCOLST(N+1) - 1 +C INITIALIZE WORK ARRAY + DO 5 I = 1,N + IW(I) = 0 + 5 CONTINUE +C +C IW(J) IS SET EQUAL TO THE TOTAL NUMBER OF ENTRIES IN COLUMN J +C OF THE EXPANDED SYMMETRIC MATRIX. +C NDIAG COUNTS NUMBER OF DIAGONAL ENTRIES PRESENT + NDIAG = 0 + DO 20 J = 1,N + I1 = JCOLST(J) + I2 = JCOLST(J+1) - 1 + IW(J) = IW(J) + I2 - I1 + 1 + DO 10 II = I1,I2 + I = IRN(II) + IF (I.NE.J) THEN + IW(I) = IW(I) + 1 + + ELSE + NDIAG = NDIAG + 1 + END IF + + 10 CONTINUE + 20 CONTINUE +C +C NEWTAU IS NUMBER OF ENTRIES IN EXPANDED STORAGE. + NEWTAU = 2*OLDTAU - NDIAG +C IPKP1 POINTS TO POSITION AFTER END OF COLUMN BEING CURRENTLY +C PROCESSED + IPKP1 = OLDTAU + 1 +C CKP1 POINTS TO POSITION AFTER END OF SAME COLUMN IN EXPANDED +C STRUCTURE + CKP1 = NEWTAU + 1 +C GO THROUGH THE ARRAY IN THE REVERSE ORDER PLACING LOWER TRIANGULAR +C ELEMENTS IN THE APPROPRIATE SLOTS. + DO 40 J = N,1,-1 + I1 = JCOLST(J) + I2 = IPKP1 +C LENK IS NUMBER OF ENTRIES IN COLUMN J OF ORIGINAL STRUCTURE + LENK = I2 - I1 +C JSTART IS RUNNING POINTER TO POSITION IN NEW STRUCTURE + JSTART = CKP1 +C SET IKP1 FOR NEXT COLUMN + IPKP1 = I1 + I2 = I2 - 1 +C RUN THROUGH COLUMNS IN REVERSE ORDER +C LOWER TRIANGULAR PART OF COLUMN MOVED TO END OF SAME COLUMN IN +C EXPANDED FORM + DO 30 II = I2,I1,-1 + JSTART = JSTART - 1 + IF (YESA) A(JSTART) = A(II) + IRN(JSTART) = IRN(II) + 30 CONTINUE +C JCOLST IS SET TO POSITION OF FIRST ENTRY IN LOWER TRIANGULAR PART OF +C COLUMN J IN EXPANDED FORM + JCOLST(J) = JSTART +C SET CKP1 FOR NEXT COLUMN + CKP1 = CKP1 - IW(J) +C RESET IW(J) TO NUMBER OF ENTRIES IN LOWER TRIANGLE OF COLUMN. + IW(J) = LENK + 40 CONTINUE +C +C AGAIN SWEEP THROUGH THE COLUMNS IN THE REVERSE ORDER, THIS +C TIME WHEN ONE IS HANDLING COLUMN J THE UPPER TRIANGULAR +C ELEMENTS A(J,I) ARE PUT IN POSITION. + DO 80 J = N,1,-1 + I1 = JCOLST(J) + I2 = JCOLST(J) + IW(J) - 1 +C RUN DOWN COLUMN IN ORDER +C NOTE THAT I IS ALWAYS GREATER THAN OR EQUAL TO J + DO 60 II = I1,I2 + I = IRN(II) + IF (I.EQ.J) GO TO 60 + JCOLST(I) = JCOLST(I) - 1 + IPOS = JCOLST(I) + IF (YESA) A(IPOS) = A(II) + IRN(IPOS) = J + 60 CONTINUE + 80 CONTINUE + JCOLST(N+1) = NEWTAU + 1 + RETURN + + END +C COPYRIGHT (c) 1995 Timothy A. Davis, Patrick Amestoy and +C Council for the Central Laboratory of the Research Councils +C Original date 30 November 1995 +C April 2001: call to MC49 changed to MC59 to make routine threadsafe +C 20/2/02 Cosmetic changes applied to reduce single/double differences + +C 12th July 2004 Version 1.0.0. Version numbering added. +C 23 May 2007 Version 1.1.0. Absolute value of hash taken to cover the +C case of integer overflow. +C Comments with character in column 2 corrected. +C 2 August 2007 Version 2.0.0 Dense row handling added, error & warning +C messages added, iovflo added, interface changed. MC47I/ID +C added. +C 31 October 2007 Version 2.1.0 Corrected tree formation when handling +C full variables +C + + SUBROUTINE MC47ID(ICNTL) + INTEGER ICNTL(10) +C ICNTL is an INTEGER array of length 10 that contains control +C parameters and must be set by the user. Default values are set +C by MA57ID. +C +C ICNTL(1) is the stream number for error messages. Printing is +C suppressed if ICNTL(1)<0. The default is 6. +C +C ICNTL(2) is the stream number for warning messages. Printing is +C suppressed if ICNTL(2)<0. The default is 6. +C +C ICNTL(3) is the stream number for printing matrix data on entry +C to and exit from MC47A/AD. Printing is suppressed if ICNTL(3)<0. +C The default is -1. +C +C ICNTL(4) controls the choice of AMD algorithm +C =-1 Classical MC47B (AMD) algorithm (no dense row detection) +C = 0 Only exactly dense rows in the reduced matrix are selected. +C = 1 Corresponds to automatic setting of the minimum density +C requirement. +C The default value is 1. +C +C ICNTL(5) defines the largest positive +C integer that your computer can represent (-iovflo should also +C be representable). HUGE(1) in Fortran 95. The default value is +C 2139062143 +C +C ICNTL(6) to ICNTL(10) are set to zero by MA57ID but are not +C currently used by MC47. +C +C Local variables + INTEGER I + + ICNTL(1) = 6 + ICNTL(2) = 6 + ICNTL(3) = -1 + ICNTL(4) = 1 + ICNTL(5) = 2139062143 + + DO 100 I=6,10 + ICNTL(I) = 0 + 100 CONTINUE + RETURN + END + + + SUBROUTINE MC47AD(N, NE, PE, IW, IWLEN, + * ICNTL,INFO, RINFO) + INTEGER N, NE, PE(N+1), IWLEN, IW(IWLEN), INFO(10) + INTEGER ICNTL(10) + DOUBLE PRECISION RINFO(10) +C N is an INTEGER variable that must be set by the user to the +C order of the matrix A. It is not altered by the subroutine. +C Restriction: N >= 1. +C NE is an INTEGER variable that must be set by the user to the +C number of entries in the matrix A. +C It is not altered by the subroutine. +C PE is an INTEGER array of size N+1 that must be set by the user. +C If the user is supplying the entries by columns, then PE(i) must +C hold the index in IW of the start of column i, i=1, ..., N and +C PE(N+1) must be equal to NE+1. If the user is supplying row and +C column indices for the matrix, PE(1) must be negative. +C On exit, PE will hold information on the matrix factors. +C IW is an INTEGER array of length IWLEN that must be set by the user +C to hold the pattern of the matrix A. If PE(1) is positive, +C IW(PE(J)), ..., IW(PE(J+1)-1) must hold the row indices of entries +C in column J, J = 1, ..., N. +C The entries within a column need not be in order. +C If PE(1) is negative, then (IW(k), IW(NE+k)), k = 1, ..., NE, must +C hold the row and column index of an entry. +C Duplicates, out-of-range entries, diagonal entries, and entries +C in upper triangle are ignored. +C IW is used as workspace by the subroutine. On exit, the +C permutation generated by MC47 is held in IW(IWLEN-I+1), I=1, ... N +C and is such that the kth column of the permuted matrix is column +C IW(IWLEN-N+k) of the original matrix. +C The inverse permutation is held in positions IWLEN-2N+1 to +C IWLEN-N of IW, preceded by further information on the structure +C of the factors +C IWLEN is an INTEGER variable. It must be set by the user to the length +C of array IW and is not altered by the subroutine. +C We recommend IWLEN > 2NE + 9N. Restriction: IWLEN >= 2NE + 8N. +C ICNTL is an INTEGER array of length 10 that contains control +C parameters and must be set by the user. Default values for the +C components may be set by a call to MC47ID. +C INFO is an INTEGER array of length 8 that need not be set by the user. +C On return from MC47A/AD, a value of zero for INFO(1) indicates +C that the subroutine has performed successfully. Negative values +C for INFO(1) signify a fatal error. Possible values are: +C -1 N < 1 +C -2 IWLEN < 2NE + 8N. +C -3 Error in PE when input is by columns. +C -4 Matrix is null (usually because all entries in upper +C triangle. +C There is one warning indicated by a positive value for INFO(1) +C +1 Out-of-range index, duplicate, diagonal or entry in upper +C triangle in input. Action taken is to ignore these entries. +C The other entries of INFO give information to the user. +C INFO(2) gives the number of compresses performed on the array IW. +C A large value for this indicates that the ordering could +C be found more quickly if IWLEN were increased. +C INFO(3) gives the minimum necessary value for IWLEN for a +C successful run of MC47A/AD on the same matrix as has just +C been analysed, without the need for any compresses of IW. +C INFO(4) gives the number of entries with row or column indices +C that are out of range. Any such entry is ignored. +C INFO(5) gives the number of duplicate entries. Any such entry is +C ignored. +C INFO(6) gives the number of entries in upper triangle. Any such +C entry is ignored. +C INFO(7) gives the number of diagonal entries. Any such entry is +C ignored. +C INFO(8) gives the number of restarts performed. +C RINFO is an INTEGER array of length 10 that need not be set by the +C user. The other entries of RINFO give information to the user. +C RINFO(1) gives forecast number of reals to hold the factorization +C RINFO(2) gives the forecast number of flops required by the +C factorization if no pivoting is performed. + +C Local variables + INTEGER DEGREE + DOUBLE PRECISION DUMMY(1) + INTEGER ELEN,HEAD,I,II,I1,I2,J,LAST,LEN,LENIW,LP,MP, + * NEXT,NV,PFREE,W,WP + INTEGER ICT59(10),INFO59(10),IOUT,JOUT,IDUP,JNFO(10) +C DEGREE is used to subdivide array IW +C DUMMY is dummy real for call to MC34A/AD +C ELEN is used to subdivide array IW +C HEAD is used to subdivide array IW +C I is DO loop variable +C IFLAG is eror return from MC59A/AD +C II is running index for entries of IW in column +C I1 is first location for entries of IW in column +C I2 is flast location for entries of IW in column +C J is column index and DO loop variable +C LAST is used to subdivide array IW +C LEN is used to subdivide array IW +C LENIW is space left in IW after allocation of work vectors +C LP is a local copy of ICNTL(1) +C MP is a local copy of ICNTL(3) +C NEXT is used to subdivide array IW +C NV is used to subdivide array IW +C PFREE marks active length of IW for call to MC47B/BD +C W is used to subdivide array IW +C WP is a local copy of ICNTL(2) +C IOUT number of indices out-of-range +C JOUT number of column indices out-of-range (as detected by MC59A/AD) +C IDUP number of duplicates + + +C Subroutines called + EXTERNAL MC59AD,MC34AD,MC47BD + +C Initialize info + DO 5 J = 1,10 + INFO(J) = 0 + 5 CONTINUE + +C Set LP,WP,MP + LP = ICNTL(1) + WP = ICNTL(2) + MP = ICNTL(3) + +C Check value of N + IF (N.LT.1) THEN + INFO(1) = -1 + IF (LP.GE.0) WRITE(LP,'(/A,I3/A,I10)') + + '**** Error return from MC47AD **** INFO(1) =',INFO(1), + + 'N has value ',N + GO TO 1000 + ENDIF + +C Error check to see if enough space in IW to get started + IF (PE(1).LT.1) THEN + IF (2*NE+N.GT.IWLEN) THEN + INFO(1) = -2 + IF (LP.GE.0) WRITE(LP,'(/A,I3/A,I10)') + + '**** Error return from MC47AD **** INFO(1) =',INFO(1), + + 'IWLEN has value ',IWLEN + GO TO 1000 + ENDIF + ELSE + IF (NE+N.GT.IWLEN) THEN + INFO(1) = -2 + IF (LP.GE.0) WRITE(LP,'(/A,I3/A,I10)') + + '**** Error return from MC47AD **** INFO(1) =',INFO(1), + + 'IWLEN has value ',IWLEN + GO TO 1000 + ENDIF + ENDIF + +C Diagnostic print + IF (MP.GE.0) THEN + WRITE(MP,'(/A)') 'Entry to MC47A/AD' + WRITE(MP,'(A,I10,A,I10,A)') 'Matrix of order',N,' with',NE, + * ' entries' + IF (PE(1).LT.0) THEN + WRITE(MP,'(A)') 'Matrix input in coordinate form' + WRITE(MP,'(A/(4(I8,I8)))') 'Row and column indices', + * (IW(I),IW(NE+I),I=1,NE) + ELSE + WRITE(MP,'(A)') 'Matrix input by columns' + DO 10 J=1,N + WRITE(MP,'(A,I4/(10I8))') 'Column',J, + * (IW(I),I=PE(J),PE(J+1)-1) + 10 CONTINUE + ENDIF + ENDIF + +C Divide workspace + LAST = IWLEN - N + 1 + ELEN = LAST - N + NV = ELEN - N + W = NV - N + DEGREE = W - N + HEAD = DEGREE - N + NEXT = HEAD - N + LEN = NEXT - N + LENIW = LEN-1 + +C Set counters for number of upper triangular entries and diagonals +C present in input matrix. +C These will be removed for later processing. + INFO(6) = 0 + INFO(7) = 0 + + IF (PE(1).LT.0) THEN +C First remove diagonals (if present) and all entries in upper triangle +C Note that this may give out-of-range entries from MC59. + DO 20 I=1,NE + IF (IW(I).LE.IW(NE+I)) THEN + IF (IW(I).EQ.IW(NE+I) .AND. IW(I).NE.0) THEN + INFO(7) = INFO(7) + 1 + ELSE + IF (IW(I).GT.0) INFO(6) = INFO(6) + 1 + ENDIF + IW(I)=0 + ENDIF + 20 CONTINUE + +C Call sort routine + ICT59(1) = 0 + ICT59(2) = 1 + ICT59(3) = 1 + ICT59(4) = LP + ICT59(5) = -1 + ICT59(6) = 0 + CALL MC59AD(ICT59,N,N,NE,IW,NE,IW(NE+1),1,DUMMY, + * N+1,PE,N+1,IW(2*NE+1),INFO59) +C IFLAG = INFO59(1) + IDUP = INFO59(3) + IOUT = INFO59(4) + JOUT = INFO59(5) + ELSE + +C Matrix already sorted by columns. +C Remove duplicates, out-of-range indices, and entries in upper +C triangle. First initialize counts. + IDUP = 0 + IOUT = 0 + JOUT = 0 + +C Set array used to find duplicates + DO 30 I = 1,N + IW(NE+I) = 0 + 30 CONTINUE + + DO 50 J=1,N + I1 = PE(J) + PE(J) = I1-(IOUT+IDUP) + I2 = PE(J+1)-1 + IF (I2.LT.I1-1) THEN + INFO(1) = -3 + GO TO 1000 + ENDIF + DO 40 II = I1,I2 + I = IW(II) + IF (I.LE.J .OR. I.GT.N) THEN + IF (I.EQ.J) INFO(7) = INFO(7) + 1 + IF (I.GT.0 .AND. I.LT.J) INFO(6) = INFO(6) + 1 + IOUT = IOUT + 1 + ELSE + IF (IW(NE+I).EQ.J) THEN +C Duplicate found + IDUP = IDUP + 1 + ELSE + IW(NE+I)=J + IW(II-(IOUT+IDUP)) = I + ENDIF + ENDIF + 40 CONTINUE + 50 CONTINUE + PE(N+1) = NE - (IOUT+IDUP) + 1 + ENDIF + +C Set flags for duplicates or out-of-range entries +C Check if there were duplicates + IF (IDUP.GT.0) THEN + INFO(1) = 1 + INFO(4) = IDUP + IF (WP.GE.0) WRITE(WP,'(/A,I3/A,I10)') + + '**** Warning from MC47AD **** INFO(1) =',INFO(1), + + 'Number of duplicates found: ',INFO(4) + ELSE + INFO(4) = 0 + ENDIF +C Check for out of range entries + IF (IOUT+ JOUT - INFO(7) .GT.0 ) THEN + INFO(1) = 1 + INFO(5) = IOUT + JOUT - INFO(7) + IF (WP.GE.0) WRITE(WP,'(/A,I3/A,I10)') + + '**** Warning from MC47AD **** INFO(1) =',INFO(1), + + 'Number of out of range entries found and ignored: ', + + INFO(5) + ELSE + INFO(5) = 0 + ENDIF + +C Check for entries in upper triangle + IF (INFO(6).GT.0) THEN + INFO(1) = 1 + IF (WP.GE.0) WRITE(WP,'(/A,I3/A,I10)') + + '**** Warning from MC47AD **** INFO(1) =',INFO(1), + + 'Number of entries in upper triangle found and ignored: ', + + INFO(6) + ENDIF + +C Check for entries in diagonals + IF (INFO(7).GT.0) THEN + INFO(1) = 1 + IF (WP.GE.0) WRITE(WP,'(/A,I3/A,I10)') + + '**** Warning from MC47AD **** INFO(1) =',INFO(1), + + 'Number of entries in diagonals found and ignored: ', + + INFO(7) + ENDIF + +C Check for null matrix +C Usually happens if wrong triangle is input + IF (NE-(IOUT+IDUP).EQ.0) THEN + INFO(1) = -4 + IF (LP.GE.0) WRITE(LP,'(/A,I3/A)') + + '**** Error return from MC47AD **** INFO(1) =',INFO(1), + + 'Matrix is null' + GO TO 1000 + ENDIF + +C Generate matrix in expanded form +C First check there is sufficient space in IW + IF (LENIW.LT.2*(PE(N+1)-1)) THEN + INFO(1) = -2 + IF (LP.GE.0) WRITE(LP,'(/A,I3/A,I10/A,I10)') + + '**** Error return from MC47AD **** INFO(1) =',INFO(1), + + 'IWLEN has value ',IWLEN, + + 'Should be at least', 2*(PE(N+1)-1)+8*N + GO TO 1000 + ENDIF + + CALL MC34AD(N,IW,PE,.FALSE.,DUMMY,IW(W)) + PFREE = PE(N+1) + +C Set length array for MC47B/BD + DO 60 I=1,N + IW(LEN+I-1) = PE(I+1) - PE(I) + 60 CONTINUE + +C Call to approximate minimum degree subroutine. + CALL MC47BD(N,LENIW,PE,PFREE,IW(LEN),IW,IW(NV), + * IW(ELEN),IW(LAST),IW(DEGREE), + * IW(HEAD),IW(NEXT),IW(W), ICNTL,JNFO, RINFO) + + INFO(2) = JNFO(1) + INFO(3) = PFREE+8*N + INFO(8) = JNFO(2) + +C Print diagnostics + IF (MP.GE.0) THEN + WRITE(MP,'(/A)') 'Exit from MC47A/AD' + WRITE(MP,'(A/(7I10))') 'INFO(1-10):',(INFO(I),I=1,10) + WRITE(MP,'(A/(8I10))') 'Parent array',(PE(I),I=1,N) + WRITE(MP,'(A/(8I10))') 'Permutation',(IW(ELEN+I-1),I=1,N) + WRITE(MP,'(A/(8I10))') 'Inverse permutation', + * (IW(LAST+I-1),I=1,N) + WRITE(MP,'(A/(8I10))') 'Degree array',(IW(NV+I-1),I=1,N) + ENDIF + + 1000 RETURN + END + +C ==================================================================== +C ==================================================================== +C ==================================================================== + + SUBROUTINE MC47BD (N, IWLEN, PE, PFREE, LEN, IW, NV, + $ ELEN, LAST, DEGREE, + $ HEAD, DENXT, W, ICNTL, JNFO, RJNFO) + + INTEGER N, IWLEN, PE(N), PFREE, LEN(N), IW(IWLEN), NV(N), + $ ELEN(N), LAST(N), DEGREE(N), + $ HEAD(N), DENXT(N), W(N), ICNTL(10), JNFO(10) + + DOUBLE PRECISION RJNFO(10) + +C ------------------------------------------------------------------- +C AMDD is a modified version of +C MC47B: Approximate Minimum (UMFPACK/MA38-style, external) Degree +C ordering algorithm, with aggresive absorption +C designed to automatically detect and exploit dense +C rows in the reduced matrix at any step of the minimum degree. +C +C We use the term Le to denote the set of all supervariables in element +C E. +C **** Reword below*** +C A row is declared as full if none of its entries can be guaranteed +C to be zero. +C A row is quasi dense if at most N-THRESM-1 of its entries can be +C guaranteed to be zero at it has not been recognized as being full +C in the calculation so far. +C A row is dense if it is either full or quasi dense. +C A row is sparse if it is not dense. +C ------------------------------------------------------------------- +C +C +C N must be set to the matrix order. It is not altered. +C Restriction: N .ge. 1 +C +C IWLEN must be set to the length of IW. It is not altered. On input, +C the matrix is stored in IW (1..PFREE-1). +C *** We do not recommend running this algorithm with *** +C *** IWLEN .LT. PFREE + N. *** +C *** Better performance will be obtained if *** +C *** IWLEN .GE. PFREE + N *** +C *** or better yet *** +C *** IWLEN .GT. 1.2 * PFREE *** +C Restriction: IWLEN .GE. PFREE-1 +C +C PE(i) must be set to the the index in IW of the start of row I, or be +C zero if row I has no off-diagonal entries. During execution, +C it is used for both supervariables and elements: +C * Principal supervariable I: index into IW of the +C list of supervariable I. A supervariable +C represents one or more rows of the matrix +C with identical pattern. +C * Non-principal supervariable I: if I has been absorbed +C into another supervariable J, then PE(I) = -J. +C That is, J has the same pattern as I. +C Note that J might later be absorbed into another +C supervariable J2, in which case PE(I) is still -J, +C and PE(J) = -J2. +C * Unabsorbed element E: the index into IW of the list +C of element E. Element E is created when +C the supervariable of the same name is selected as +C the pivot. +C * Absorbed element E: if element E is absorbed into element +C E2, then PE(E) = -E2. This occurs when one of its +C variables is eliminated and when the pattern of +C E (that is, Le) is found to be a subset of the pattern +C of E2 (that is, Le2). If element E is "null" (it has +C no entries outside its pivot block), then PE(E) = 0. +C +C On output, PE holds the assembly tree/forest, which implicitly +C represents a pivot order with identical fill-in as the actual +C order (via a depth-first search of the tree). If NV(I) .GT. 0, +C then I represents a node in the assembly tree, and the parent of +C I is -PE(I), or zero if I is a root. If NV(I)=0, then (I,-PE(I)) +C represents an edge in a subtree, the root of which is a node in +C the assembly tree. +C +C PFREE must be set to the position in IW of the first free variable. +C During execution, additional data is placed in IW, and PFREE is +C modified so that components of IW from PFREE are free. +C On output, PFREE is set equal to the size of IW that would have +C caused no compressions to occur. If NCMPA is zero, then +C PFREE (on output) is less than or equal to IWLEN, and the space +C IW(PFREE+1 ... IWLEN) was not used. Otherwise, PFREE (on output) +C is greater than IWLEN, and all the memory in IW was used. +C +C LEN(I) must be set to hold the number of entries in row I of the +C matrix, excluding the diagonal. The contents of LEN(1..N) are +C undefined on output. +C +C IW(1..PFREE-1) must be set to hold the patterns of the rows of +C the matrix. The matrix must be symmetric, and both upper and +C lower triangular parts must be present. The diagonal must not be +C present. Row I is held as follows: +C IW(PE(I)...PE(I) + LEN(I) - 1) must hold the list of +C column indices for entries in row I (simple +C supervariables), excluding the diagonal. All +C supervariables start with one row/column each +C (supervariable I is just row I). If LEN(I) is zero on +C input, then PE(I) is ignored on input. Note that the +C rows need not be in any particular order, and there may +C be empty space between the rows. +C During execution, the supervariable I experiences fill-in. This +C is represented by constructing a list of the elements that cause +C fill-in in supervariable I: +C IE(PE(i)...PE(I) + ELEN(I) - 1) is the list of elements +C that contain I. This list is kept short by removing +C absorbed elements. IW(PE(I)+ELEN(I)...PE(I)+LEN(I)-1) +C is the list of supervariables in I. This list is kept +C short by removing nonprincipal variables, and any entry +C J that is also contained in at least one of the +C elements in the list for I. +C When supervariable I is selected as pivot, we create an element E +C of the same name (E=I): +C IE(PE(E)..PE(E)+LEN(E)-1) is the list of supervariables +C in element E. +C An element represents the fill-in that occurs when supervariable +C I is selected as pivot. +C CAUTION: THE INPUT MATRIX IS OVERWRITTEN DURING COMPUTATION. +C The contents of IW are undefined on output. +C +C NV(I) need not be set. During execution, ABS(NV(I)) is equal to the +C number of rows represented by the principal supervariable I. If I +C is a nonprincipal variable, then NV(I) = 0. Initially, NV(I) = 1 +C for all I. NV(I) .LT. 0 signifies that I is a principal variable +C in the pattern Lme of the current pivot element ME. On output, +C NV(E) holds the true degree of element E at the time it was +C created (including the diagonal part). +C +C ELEN(I) need not be set. See the description of IW above. At the +C start of execution, ELEN(I) is set to zero. For a supervariable, +C ELEN(I) is the number of elements in the list for supervariable +C I. For an element, ELEN(E) is the negation of the position in the +C pivot sequence of the supervariable that generated it. ELEN(I)=0 +C if I is nonprincipal. +C On output ELEN(1..N) holds the inverse permutation (the same +C as the 'INVP' argument in Sparspak). That is, if K = ELEN(I), +C then row I is the Kth pivot row. Row I of A appears as the +C (ELEN(I))-th row in the permuted matrix, PAP^T. +C +C LAST(I) need not be set on input. In a degree list, LAST(I) is the +C supervariable preceding I, or zero if I is the head of the list. +C In a hash bucket, LAST(I) is the hash key for I. LAST(HEAD(HASH)) +C is also used as the head of a hash bucket if HEAD(HASH) contains +C a degree list (see HEAD, below). +C On output, LAST(1..N) holds the permutation (the same as the +C 'PERM' argument in Sparspak). That is, if I = LAST(K), then row I +C is the Kth pivot row. Row LAST(K) of A is the K-th row in the +C permuted matrix, PAP^T. +C +C +C DEGREE need not be set on input. If I is a supervariable and sparse, +C then DEGREE(I) holds the current approximation of the external +C degree of row I (an upper bound). The external degree is the +C number of entries in row I, minus ABS(NV(I)) (the diagonal +C part). The bound is equal to the external degree if ELEN(I) is +C less than or equal to two. We also use the term "external degree" +C for elements E to refer to |Le \ Lme|. If I is full in the reduced +C matrix, then DEGREE(I)=N+1. If I is dense in the reduced matrix, +C then DEGREE(I)=N+1+last_approximate_external_deg of I. +C All dense rows are stored in the list pointed by HEAD(N). +C Quasi dense rows are stored first, and are followed by full rows +C in the reduced matrix. LASTD holds the last row in +C this list of dense rows or is zero if the list is empty. +C +C HEAD(DEG) need not be set on input. HEAD is used for degree lists. +C HEAD(DEG) is the first supervariable in a degree list (all +C supervariables I in a degree list DEG have the same approximate +C degree, namely, DEG = DEGREE(I)). If the list DEG is empty then +C HEAD(DEG) = 0. +C During supervariable detection HEAD(HASH) also serves as a +C pointer to a hash bucket. +C If HEAD(HASH) .GT. 0, there is a degree list of degree HASH. The +C hash bucket head pointer is LAST(HEAD(HASH)). +C If HEAD(HASH) = 0, then the degree list and hash bucket are +C both empty. +C If HEAD(HASH) .LT. 0, then the degree list is empty, and +C -HEAD(HASH) is the head of the hash bucket. +C After supervariable detection is complete, all hash buckets are +C empty, and the (LAST(HEAD(HASH)) = 0) condition is restored for +C the non-empty degree lists. +C +C DENXT(I) need not be set on input. For supervariable I, DENXT(I) is +C the supervariable following I in a link list, or zero if I is +C the last in the list. Used for two kinds of lists: degree lists +C and hash buckets (a supervariable can be in only one kind of +C list at a time). For element E, DENXT(E) is the number of +C variables with dense or full rows in the element E. +C +C W(I) need not be set on input. The flag array W determines the status +C of elements and variables, and the external degree of elements. +C For elements: +C if W(E) = 0, then the element E is absorbed. +C if W(E) .GE. WFLG, then W(E)-WFLG is the size of the set +C |Le \ Lme|, in terms of nonzeros (the sum of ABS(NV(I)) +C for each principal variable I that is both in the +C pattern of element E and NOT in the pattern of the +C current pivot element, ME). +C if WFLG .GT. WE(E) .GT. 0, then E is not absorbed and has +C not yet been seen in the scan of the element lists in +C the computation of |Le\Lme| in loop 150 below. +C ***SD: change comment to remove reference to label*** +C For variables: +C during supervariable detection, if W(J) .NE. WFLG then J is +C not in the pattern of variable I. +C The W array is initialized by setting W(I) = 1 for all I, and by +C setting WFLG = 2. It is reinitialized if WFLG becomes too large +C (to ensure that WFLG+N does not cause integer overflow). +C +C ICNTL is an INTEGER array of length 10 that contains control +C parameters and must be set by the user. Default values for the +C components may be set by a call to MC47ID. +C +C RJNFO is an REAL (DOUBLE PRECISION in D version) array of length 7 +C that need not be set by the user. This array supplies information +C on the execution of MC47BD. +C RJNFO(1) gives forecast number of reals to hold the factorization +C RJNFO(2) gives the forecast number of flops required by the +C factorization if no pivoting is performed. +C +C Local variables: +C --------------- + INTEGER DEG, DEGME, DEXT, DMAX, E, ELENME, ELN, HASH, HMOD, I, + $ IDUMMY, ILAST, INEXT, IOVFLO,J, JDUMMY, JLAST, JNEXT, K, + $ KNT1, KNT2, KNT3, LASTD, LENJ, LN, MAXMEM, ME, + $ MEM, MINDEG, NBD, NCMPA, NDME, NEL, NELME, NEWMEM, + $ NFULL, NLEFT, NRLADU, NVI, NVJ, NVPIV, P, P1, P2, P3, PDST, + $ PEE, PEE1, PEND, PJ, PME, PME1, PME2, PN, PSRC, RSTRT, + $ SLENME, THRESH, THRESM, WE, WFLG, WNVI,X + $ + DOUBLE PRECISION RELDEN, SM, STD, OPS + LOGICAL IDENSE +C +C DEG: the degree of a variable or element +C DEGME: size (no. of variables), |Lme|, of the current element, +C ME (= DEGREE(ME)) +C DEXT: external degree, |Le \ Lme|, of some element E +C DMAX: largest |Le| seen so far +C E: an element +C ELENME: the length, ELEN(ME), of element list of pivotal var. +C ELN: the length, ELEN(...), of an element list +C HASH: the computed value of the hash function +C HMOD: the hash function is computed modulo HMOD = MAX(1,N-1) +C I: a supervariable +C IDUMMY: loop counter +C ILAST: the entry in a link list preceding I +C INEXT: the entry in a link list following I +C IOVFLO: local copy of ICNTL(5) +C J: a supervariable +C JDUMMY: loop counter +C JLAST: the entry in a link list preceding J +C JNEXT: the entry in a link list, or path, following J +C K: the pivot order of an element or variable +C KNT1: loop counter used during element construction +C KNT2: loop counter used during element construction +C KNT3: loop counter used during element construction +C LASTD: index of the last row in the list of dense rows +C LENJ: LEN(J) +C LN: length of a supervariable list +C MAXMEM: amount of memory needed for no compressions +C ME: current supervariable being eliminated, and the +C current element created by eliminating that +C supervariable +C MEM: memory in use assuming no compressions have occurred +C MINDEG: current approximate minimum degree +C NBD: total number of dense rows selected +C NCMPA: counter for the number of times IW was compressed +C NDME : number of dense rows adjacent to me +C NEL: number of pivots selected so far +C NELME: number of pivots selected when reaching the root +C NEWMEM: amount of new memory needed for current pivot element +C NFULL: total number of full rows detected. +C NLEFT: N-NEL, the number of nonpivotal rows/columns remaining +C NRLADU: counter for the forecast number of reals in matrix factor +C NVI: the number of variables in a supervariable I (= NV(I)) +C NVJ: the number of variables in a supervariable J (= NV(J)) +C NVPIV: number of pivots in current element +C P: pointer into lots of things +C P1: pe (i) for some variable i (start of element list) +C P2: pe (i) + elen (i) - 1 for some var. i (end of el. list) +C P3: index of first supervariable in clean list +C PJ: pointer into an element or variable +C PDST: destination pointer, for compression +C PEE: pointer into element E +C PEE1: pointer into element E +C PEND: end of memory to compress +C PME: pointer into the current element (PME1...PME2) +C PME1: the current element, ME, is stored in IW(PME1...PME2) +C PME2: the end of the current element +C PN: pointer into a "clean" variable, also used to compress +C PSRC: source pointer, for compression +C RSTRT: counter for the number of restarts carried out +C SLENME: number of variables in variable list of pivotal variable +C THRESH: local copy of ICNTL(4) +C THRESM : local integer holding the threshold used to detect quasi +C dense rows. When quasi dense rows are reintegrated in the +C graph to be processed then THRESM is modified. +C WE: W(E) +C WFLG: used for flagging the W array. See description of W. +C WNVI: WFLG-NV(I) +C X: either a supervariable or an element +C +C OPS: counter for forecast number of flops +C RELDEN : holds average density to set THRESM automatically +C SM: counter used for forming standard deviation +C STD: standard deviation +C +C IDENSE is true if supervariable I is dense +C +C ------------------------------------------------------------------- +C FUNCTIONS CALLED: +C ------------------------------------------------------------------- + INTRINSIC MAX, MIN, MOD +C ==================================================================== +C INITIALIZATIONS +C ==================================================================== + + DO 2 I = 1,10 + RJNFO(I) = 0.0 + JNFO(I) = 0 + 2 CONTINUE + DMAX = 0 + HMOD = MAX (1, N-1) + IOVFLO = ICNTL(5) + LASTD = 0 + MEM = PFREE - 1 + MAXMEM = MEM + MINDEG = 1 + NBD = 0 + NCMPA = 0 + NEL = 0 + NFULL = 0 + NRLADU = 0 + RSTRT = 0 + OPS = 0.00 + THRESH = ICNTL(4) + WFLG = 2 + +C ------------------------------------------------------ +C Experiments with automatic setting of parameter THRESH. +C ------------------------------------------------------ + IF (THRESH.GT.0) THEN + THRESM = 0 + RELDEN = 0.0 + SM = 0 +C ---------------------------------------------------------- +C initialize arrays and eliminate rows with no off-diag. nz. +C ---------------------------------------------------------- + DO 5 I=1,N + THRESM = MAX(THRESM, LEN(I)) + IF (LEN(I).GT.0) THEN + RELDEN = RELDEN + LEN(I) + SM = SM + (LEN(I) * LEN(I)) + END IF + LAST (I) = 0 + HEAD (I) = 0 + NV (I) = 1 + DEGREE (I) = LEN (I) + IF (DEGREE(I) .EQ. 0) THEN + NEL = NEL + 1 + ELEN (I) = -NEL + PE (I) = 0 + W (I) = 0 + NRLADU = NRLADU + 1 + OPS = OPS + 1 + ELSE + W (I) = 1 + ELEN (I) = 0 + ENDIF + 5 CONTINUE + IF (N .EQ. NEL) GOTO 265 + + RELDEN = RELDEN/(N-NEL) +C RELDEN holds average row length + SM = SM/(N-NEL-NFULL) - RELDEN*RELDEN + STD = SQRT(ABS(SM)) +C STD holds standard deviation of the row lengths + IF (STD .LE. RELDEN) THEN + THRESM = -1 + ELSE + THRESM = INT(9*RELDEN + 0.5*STD*((STD/(RELDEN+0.01))**1.5)+ + * 2*RELDEN*RELDEN/(STD+0.01) +1) + END IF +C ------------------------------------------------------ +C end automatic setting of THRESM +C ------------------------------------------------------ + + ELSE + THRESM = THRESH + DO 10 I = 1, N + LAST (I) = 0 + HEAD (I) = 0 + NV (I) = 1 + DEGREE (I) = LEN (I) + IF (DEGREE(I) .EQ. 0) THEN + NEL = NEL + 1 + ELEN (I) = -NEL + PE (I) = 0 + W (I) = 0 + NRLADU = NRLADU + 1 + OPS = OPS + 1 + ELSE + W (I) = 1 + ELEN (I) = 0 + ENDIF + 10 CONTINUE + ENDIF + IF (THRESM.GE.0) THEN + IF (THRESM.GE.N) THEN +C full rows only + THRESM = -1 + ELSE IF (THRESM.EQ.0) THEN + THRESM = N + ENDIF + ENDIF + +C ---------------------------------------------------------------- +C initialize degree lists +C ---------------------------------------------------------------- + DO 20 I = 1, N + DEG = DEGREE (I) + IF (DEG .GT. 0) THEN +C ---------------------------------------------------------- +C place i in the degree list corresponding to its degree +C or in the dense row list if i is dense +C ---------------------------------------------------------- +C test for row density + IF ( (THRESM.GE.0) .AND. + & (DEG+1.GE.THRESM.OR.DEG+1.GE.N-NEL )) THEN +C I is dense and will be inserted in the degree +C list of N + NBD = NBD+1 + IF (DEG+1.NE.N-NEL) THEN +C I is quasi dense + DEGREE(I) = DEGREE(I)+N+1 +C insert I at the beginning of degree list of n + DEG = N + INEXT = HEAD (DEG) + IF (INEXT .NE. 0) LAST (INEXT) = I + DENXT (I) = INEXT + HEAD (DEG) = I + LAST(I) = 0 + IF (LASTD.EQ.0) THEN + LASTD=I + END IF + ELSE +C I is full + NFULL = NFULL+1 + DEGREE(I) = N+1 +C insert I at the end of degree list of n + DEG = N + IF (LASTD.EQ.0) THEN +C degree list is empty + LASTD = I + HEAD(DEG) = I + DENXT(I) = 0 + LAST(I) = 0 + ELSE +C IF (NFULL.EQ.1) THEN +C First full row encountered + DENXT(LASTD) = I + LAST(I) = LASTD + LASTD = I + DENXT(I) = 0 +C ELSE +C Absorb I into LASTD (first full row found) +C PE(I) = - LASTD +C NV(LASTD) = NV(LASTD) + NV(I) +C NV(I) = 0 +C ELEN(I) = 0 +C END IF + ENDIF + ENDIF + ELSE +C place i in the degree list corresponding to its degree + INEXT = HEAD (DEG) + IF (INEXT .NE. 0) LAST (INEXT) = I + DENXT (I) = INEXT + HEAD (DEG) = I + ENDIF + ENDIF + 20 CONTINUE + +C We suppress dense row selection if none of them was found in A +C in the 1st pass + IF (NBD.EQ.0 .AND. THRESH.GT.0) THEN + THRESM = -1 + END IF +C +C ==================================================================== +C WHILE (selecting pivots) DO +C ==================================================================== + + 30 IF (NEL .LT. N) THEN + +C ================================================================== +C GET PIVOT OF MINIMUM APPROXIMATE DEGREE +C ================================================================== +C ------------------------------------------------------------- +C find next supervariable for elimination +C ------------------------------------------------------------- + DO 40 DEG = MINDEG, N + ME = HEAD (DEG) + IF (ME .GT. 0) GO TO 50 + 40 CONTINUE + 50 MINDEG = DEG + IF (DEG.LT.N) THEN +C ------------------------------------------------------------- +C remove chosen variable from linked list +C ------------------------------------------------------------- + INEXT = DENXT (ME) + IF (INEXT .NE. 0) LAST (INEXT) = 0 + HEAD (DEG) = INEXT + ELSE + IF (DEGREE(ME).EQ.N+1) GO TO 263 +C DEGREE(ME).GT.N+1 so ME is quasi dense +C RESTARTING STRATEGY +C FOR EACH quasi dense row d +C 1/ insert d in the degree list according to the +C value degree(d)-(N+1) (updating MINDEG) +C 2/ Build the adjacency list of d in the quotient graph +C update DENXT(e_me)= DENXT(e_me)-NV(ME) +C 4/ get back to min degree process +C +C THRESM > 0 because quasi dense rows were selected +C While loop: ME is the current dense row +C make sure that WFLG is not too large + RSTRT = RSTRT + 1 + RELDEN = 0.0 + SM = 0 + IF (WFLG .GT. IOVFLO-NBD-1) THEN + DO 51 X = 1, N + IF (W (X) .NE. 0) W (X) = 1 + 51 CONTINUE + WFLG = 2 + END IF + WFLG = WFLG + 1 + DO 57 IDUMMY = 1,N + +C --------------------------------------------------------- +C remove chosen variable from link list +C --------------------------------------------------------- + INEXT = DENXT (ME) + IF (INEXT .NE. 0) THEN + LAST (INEXT) = 0 + ELSE + LASTD = 0 + ENDIF +C ---------------------------------------------------------- +c build adjacency list of ME in quotient graph +C and calculate its external degree in ndense(me) +C ---------------------------------------------------------- + DENXT(ME) = 0 +C Flag ME as having been considered in this calculation + W(ME) = WFLG + P1 = PE(ME) + P2 = P1 + LEN(ME) -1 +C LN-1 holds the pointer in IW to last elt/var in adj list +C of ME. LEN(ME) will then be set to LN-P1 +C ELN-1 hold the pointer in IW to last elt in in adj list +C of ME. ELEN(ME) will then be set to ELN-P1 +C element adjacent to ME + LN = P1 + ELN = P1 + DO 55 P=P1,P2 + E= IW(P) + IF (W(E).EQ.WFLG) GO TO 55 + W(E) = WFLG +C ------------------------------------------- +C Ensure that E is an unabsorbed element or a quasi dense +C row and flag it +C ------------------------------------------- + DO 52 JDUMMY = 1,N + IF ( PE(E) .GE. 0 ) GOTO 53 + E = -PE(E) + IF (W(E) .EQ.WFLG) GOTO 55 + W(E) = WFLG + 52 CONTINUE + 53 IF (ELEN(E).LT.0) THEN +C E is a new element in adj(ME) + DENXT(E) = DENXT(E) - NV(ME) +C Move first entry in ME's list of adjacent variables +C to the end + IW(LN) = IW(ELN) +C Place E at end of ME's list of adjacent elements + IW(ELN) = E + LN = LN+1 + ELN = ELN + 1 +C update ndense of ME with all unflagged dense +C rows in E + PEE1 = PE(E) + DO 54 PEE = PEE1, PEE1+LEN(E)-1 + X = IW(PEE) + IF ((ELEN(X).GE.0).AND.(W(X).NE.WFLG)) THEN +C X is a dense row + DENXT(ME) = DENXT(ME) + NV(X) + W(X) = WFLG + ENDIF + 54 CONTINUE + ELSE +C E is a dense row + DENXT(ME) = DENXT(ME) + NV(E) +C Place E at end of ME's list of adjacent variables + IW(LN)=E + LN = LN+1 + ENDIF + 55 CONTINUE + +C ---------------------------------------------- +C DEGREE(ME)-(N+1) holds last external degree computed +C when ME was detected as dense +C DENXT(ME) is the exact external degree of ME +C ---------------------------------------------- + WFLG = WFLG + 1 + LEN(ME) = LN-P1 + ELEN(ME) = ELN- P1 + NDME = DENXT(ME)+NV(ME) +C If we want to select ME as full (NDME.EQ.NBD) +C or quasi dense (NDME.GE.THRESM) then +C denxt(of elements adjacent to ME) should be updated + IF (DENXT(ME).EQ.0) DENXT(ME) =1 +C --------------------------------------------------------- +C place ME in the degree list of DENXT(ME), update DEGREE +C --------------------------------------------------------- +C IF (DEGREE(ME)+NV(ME) .LT. NBD ) THEN + IF (NDME .LT. NBD) THEN +C ME is not full + RELDEN = RELDEN + NV(ME)*NDME + SM = SM + NV(ME)*NDME*NDME + DEGREE(ME) = DENXT(ME) + DEG = DEGREE(ME) + MINDEG = MIN(DEG,MINDEG) + JNEXT = HEAD(DEG) + IF (JNEXT.NE. 0) LAST (JNEXT) = ME + DENXT(ME) = JNEXT + HEAD(DEG) = ME + ELSE +C ME is full + DEGREE(ME) = N+1 + DEG = DENXT(ME) + MINDEG = MIN(DEG,MINDEG) + DEG = N + +C Update DENXT of all elements in the list of elements +C adjacent to ME + P1 = PE(ME) + P2 = P1 + ELEN(ME) - 1 + DO 56 PJ=P1,P2 + E= IW(PJ) + DENXT (E) = DENXT(E) + NV(ME) + 56 CONTINUE +C insert ME in the list of dense rows + DEG = N +C ME at the end of the list + NFULL = NFULL +NV(ME) + IF (LASTD.EQ.0) THEN +C degree list is empty + LASTD = ME + HEAD(N) = ME + DENXT(ME) = 0 + LAST(ME) = 0 + IF (INEXT.EQ.0) INEXT = LASTD + ELSE +C IF (NFULL.EQ.NV(ME)) THEN +C First full row encountered + DENXT(LASTD) = ME + LAST(ME) = LASTD + LASTD = ME + DENXT(ME) = 0 + IF (INEXT.EQ.0) INEXT = LASTD +C ELSE +C Absorb ME into LASTD (first full row found) +C PE(ME) = - LASTD +C NV(LASTD) = NV(LASTD) + NV(ME) +C NV(ME) = 0 +C ELEN(ME) = 0 +C END IF + ENDIF + END IF + +C ------------------------------ +C process next quasi dense row +C ------------------------------ + ME = INEXT + IF (ME.EQ.0) GO TO 58 + IF (DEGREE(ME).LE.(N+1) ) GOTO 58 + 57 CONTINUE + 58 HEAD (N) = ME +C --------------------------------------- +C update dense row selection strategy +C ------------------------------------- + IF (NBD.EQ.NFULL) THEN + RELDEN = 0 + SM = 0 + ELSE + RELDEN = (RELDEN + NFULL*NBD)/(NBD) + SM = (SM + NFULL*NBD*NBD)/(NBD) - RELDEN*RELDEN + END IF + STD = SQRT(ABS(SM)) + THRESM = INT(9*RELDEN+0.5*STD*((STD/(RELDEN + 0.01))**1.5) + * + 2*RELDEN*RELDEN/(STD+0.01) +1) + THRESM = MIN(THRESM,NBD) + IF (THRESM.GE.NBD) THEN + THRESM = N + END IF + NBD = NFULL +C get back to min degree elimination loop + GOTO 30 +C ------------------------------------------------------------- +C ------------------------------------------------------------- + ENDIF +C ------------------------------------------------------------- +C me represents the elimination of pivots nel+1 to nel+nv(me). +C place me itself as the first in this set. It will be moved +C to the nel+nv(me) position when the permutation vectors are +C computed. +C ------------------------------------------------------------- + ELENME = ELEN (ME) + ELEN (ME) = - (NEL + 1) + NVPIV = NV (ME) + NEL = NEL + NVPIV + DENXT(ME) = 0 + +C ==================================================================== +C CONSTRUCT NEW ELEMENT +C ==================================================================== +C +C ------------------------------------------------------------- +C At this point, me is the pivotal supervariable. It will be +C converted into the current element. Scan list of the +C pivotal supervariable, me, setting tree pointers and +C constructing new list of supervariables for the new element, +C me. p is a pointer to the current position in the old list. +C ------------------------------------------------------------- +C +C flag the variable "me" as being in the front by negating nv(me) + NV (ME) = -NVPIV + DEGME = 0 + IF (ELENME .EQ. 0) THEN +C ---------------------------------------------------------- +C There are no elements involved. +C Construct the new element in place. +C ---------------------------------------------------------- + PME1 = PE (ME) + PME2 = PME1 - 1 + DO 60 P = PME1, PME1 + LEN (ME) - 1 + I = IW (P) + NVI = NV (I) + IF (NVI .GT. 0) THEN +C ---------------------------------------------------- +C i is a principal variable not yet placed in the +C generated element. Store i in new list +C ---------------------------------------------------- + DEGME = DEGME + NVI +C flag i as being in Lme by negating nv (i) + NV (I) = -NVI + PME2 = PME2 + 1 + IW (PME2) = I + +C ---------------------------------------------------- +C remove variable i from degree list. +C ---------------------------------------------------- +C only done for sparse rows + IF (DEGREE(I).LE.N) THEN + ILAST = LAST (I) + INEXT = DENXT (I) + IF (INEXT .NE. 0) LAST (INEXT) = ILAST + IF (ILAST .NE. 0) THEN + DENXT (ILAST) = INEXT + ELSE +C i is at the head of the degree list + HEAD (DEGREE (I)) = INEXT + ENDIF + ELSE +C Dense rows remain dense so do not remove from list + DENXT(ME) = DENXT(ME) + NVI + ENDIF + ENDIF + 60 CONTINUE +C this element takes no new memory in iw: + NEWMEM = 0 + ELSE +C ---------------------------------------------------------- +C construct the new element in empty space, iw (pfree ...) +C ---------------------------------------------------------- + P = PE (ME) + PME1 = PFREE + SLENME = LEN (ME) - ELENME + DO 120 KNT1 = 1, ELENME +C search the elements in me. + E = IW (P) + P = P + 1 + PJ = PE (E) + LN = LEN (E) +C ------------------------------------------------------- +C search for different supervariables and add them to the +C new list, compressing when necessary. +C ------------------------------------------------------- + DO 110 KNT2 = 1, LN + I = IW (PJ) + PJ = PJ + 1 + NVI = NV (I) + IF (NVI .GT. 0) THEN +C ------------------------------------------------- +C compress iw, if necessary +C ------------------------------------------------- + IF (PFREE .GT. IWLEN) THEN +C prepare for compressing iw by adjusting +C pointers and lengths so that the lists being +C searched in the inner and outer loops contain +C only the remaining entries. +C ***** SD: Seperate compression subroutine tried +C but found to be inefficient in comparison **** + PE (ME) = P + LEN (ME) = LEN (ME) - KNT1 +C Check if anything left in supervariable ME + IF (LEN (ME) .EQ. 0) PE (ME) = 0 + PE (E) = PJ + LEN (E) = LN - KNT2 +C Check if anything left in element E + IF (LEN (E) .EQ. 0) PE (E) = 0 + NCMPA = NCMPA + 1 +C store first item in pe +C set first entry to -item + DO 70 J = 1, N + PN = PE (J) + IF (PN .GT. 0) THEN + PE (J) = IW (PN) + IW (PN) = -J + ENDIF + 70 CONTINUE + +C psrc/pdst point to source/destination + PDST = 1 + PSRC = 1 + PEND = PME1 - 1 + +C while loop: + DO 91 IDUMMY = 1, IWLEN + IF (PSRC .GT. PEND) GO TO 95 +C search for next negative entry + J = -IW (PSRC) + PSRC = PSRC + 1 + IF (J .GT. 0) THEN + IW (PDST) = PE (J) + PE (J) = PDST + PDST = PDST + 1 +C copy from source to destination + LENJ = LEN (J) + DO 90 KNT3 = 0, LENJ - 2 + IW (PDST + KNT3) = IW (PSRC + KNT3) + 90 CONTINUE + PDST = PDST + LENJ - 1 + PSRC = PSRC + LENJ - 1 + ENDIF + 91 END DO + +C move the new partially-constructed element + 95 P1 = PDST + DO 100 PSRC = PME1, PFREE - 1 + IW (PDST) = IW (PSRC) + PDST = PDST + 1 + 100 CONTINUE + PME1 = P1 + PFREE = PDST + PJ = PE (E) + P = PE (ME) + ENDIF + +C ------------------------------------------------- +C i is a principal variable not yet placed in Lme +C store i in new list +C ------------------------------------------------- + DEGME = DEGME + NVI +C flag i as being in Lme by negating nv (i) + NV (I) = -NVI + IW (PFREE) = I + PFREE = PFREE + 1 + +C ------------------------------------------------- +C remove variable i from degree link list +C ------------------------------------------------- +C only done for sparse rows + IF (DEGREE(I).LE.N) THEN + ILAST = LAST (I) + INEXT = DENXT (I) + IF (INEXT .NE. 0) LAST (INEXT) = ILAST + IF (ILAST .NE. 0) THEN + DENXT (ILAST) = INEXT + ELSE +C i is at the head of the degree list + HEAD (DEGREE (I)) = INEXT + ENDIF + ELSE +C Dense rows remain dense so do not remove from list + DENXT(ME) = DENXT(ME) + NVI + ENDIF + ENDIF + 110 CONTINUE + +C set tree pointer and flag to indicate element e is +C absorbed into new element me (the parent of e is me) + PE (E) = -ME + W (E) = 0 + 120 CONTINUE + +C search the supervariables in me. + KNT1 = ELENME + 1 + E = ME + PJ = P + LN = SLENME + +C ------------------------------------------------------- +C search for different supervariables and add them to the +C new list, compressing when necessary. +C ------------------------------------------------------- + DO 126 KNT2 = 1, LN + I = IW (PJ) + PJ = PJ + 1 + NVI = NV (I) + IF (NVI .GT. 0) THEN +C ------------------------------------------------- +C compress iw, if necessary +C ------------------------------------------------- + IF (PFREE .GT. IWLEN) THEN +C prepare for compressing iw by adjusting +C pointers and lengths so that the lists being +C searched in the inner and outer loops contain +C only the remaining entries. + PE (ME) = P + LEN (ME) = LEN (ME) - KNT1 +C Check if anything left in supervariable ME + IF (LEN (ME) .EQ. 0) PE (ME) = 0 + PE (E) = PJ + LEN (E) = LN - KNT2 +C Check if anything left in element E + IF (LEN (E) .EQ. 0) PE (E) = 0 + NCMPA = NCMPA + 1 +C store first item in pe +C set first entry to -item + DO 121 J = 1, N + PN = PE (J) + IF (PN .GT. 0) THEN + PE (J) = IW (PN) + IW (PN) = -J + ENDIF + 121 CONTINUE + +C psrc/pdst point to source/destination + PDST = 1 + PSRC = 1 + PEND = PME1 - 1 + +C while loop: +C 122 CONTINUE + DO 123 IDUMMY = 1,IWLEN + IF (PSRC .GT. PEND) GO TO 124 +C search for next negative entry + J = -IW (PSRC) + PSRC = PSRC + 1 + IF (J .GT. 0) THEN + IW (PDST) = PE (J) + PE (J) = PDST + PDST = PDST + 1 +C copy from source to destination + LENJ = LEN (J) + DO 122 KNT3 = 0, LENJ - 2 + IW (PDST + KNT3) = IW (PSRC + KNT3) + 122 CONTINUE + PDST = PDST + LENJ - 1 + PSRC = PSRC + LENJ - 1 + ENDIF + 123 END DO + +C move the new partially-constructed element + 124 P1 = PDST + DO 125 PSRC = PME1, PFREE - 1 + IW (PDST) = IW (PSRC) + PDST = PDST + 1 + 125 CONTINUE + PME1 = P1 + PFREE = PDST + PJ = PE (E) + P = PE (ME) + END IF + +C ------------------------------------------------- +C i is a principal variable not yet placed in Lme +C store i in new list +C ------------------------------------------------- + DEGME = DEGME + NVI +C flag i as being in Lme by negating nv (i) + NV (I) = -NVI + IW (PFREE) = I + PFREE = PFREE + 1 + +C ------------------------------------------------- +C remove variable i from degree link list +C ------------------------------------------------- +C only done for sparse rows + IF (DEGREE(I).LE.N) THEN + ILAST = LAST (I) + INEXT = DENXT (I) + IF (INEXT .NE. 0) LAST (INEXT) = ILAST + IF (ILAST .NE. 0) THEN + DENXT (ILAST) = INEXT + ELSE +C i is at the head of the degree list + HEAD (DEGREE (I)) = INEXT + ENDIF + ELSE +C Dense rows remain dense so do not remove from list + DENXT(ME) = DENXT(ME) + NVI + ENDIF + ENDIF + 126 CONTINUE + + PME2 = PFREE - 1 +C this element takes newmem new memory in iw (possibly zero) + NEWMEM = PFREE - PME1 + MEM = MEM + NEWMEM + MAXMEM = MAX (MAXMEM, MEM) + ENDIF + +C ------------------------------------------------------------- +C me has now been converted into an element in iw (pme1..pme2) +C ------------------------------------------------------------- +C degme holds the external degree of new element + DEGREE (ME) = DEGME + PE (ME) = PME1 + LEN (ME) = PME2 - PME1 + 1 + +C ------------------------------------------------------------- +C make sure that wflg is not too large. With the current +C value of wflg, wflg+n must not cause integer overflow +C ------------------------------------------------------------- + IF (WFLG .GT. IOVFLO-N) THEN + DO 130 X = 1, N + IF (W (X) .NE. 0) W (X) = 1 + 130 CONTINUE + WFLG = 2 + ENDIF + +C ==================================================================== +C COMPUTE (w(e) - wflg) = |Le(G')\Lme(G')| FOR ALL ELEMENTS +C where G' is the subgraph of G containing just the sparse rows) +C ==================================================================== +C ------------------------------------------------------------- +C Scan 1: compute the external degrees of elements touched +C with respect to the current element. That is: +C (w (e) - wflg) = |Le \ Lme| +C for each element e involving a supervariable in Lme. +C The notation Le refers to the pattern (list of +C supervariables) of a previous element e, where e is not yet +C absorbed, stored in iw (pe (e) + 1 ... pe (e) + iw (pe (e))). +C The notation Lme refers to the pattern of the current element +C (stored in iw (pme1..pme2)). +C aggressive absorption is possible only if DENXT(ME) = NBD +C which is true when only full rows have been selected. +C ------------------------------------------------------------- + IF (NBD.GT.0) THEN +C Dense rows have been found + DO 150 PME = PME1, PME2 + I = IW (PME) +c skip dense rows + IF (DEGREE(I).GT.N) GOTO 150 + ELN = ELEN (I) + IF (ELN .GT. 0) THEN +C note that nv (i) has been negated to denote i in Lme: + NVI = -NV (I) + WNVI = WFLG - NVI + DO 140 P = PE (I), PE (I) + ELN - 1 + E = IW (P) + WE = W (E) + IF (WE .GE. WFLG) THEN +C unabsorbed element e has been seen in this loop + WE = WE - NVI + ELSE IF (WE .NE. 0) THEN +C e is an unabsorbed element - this is +C the first we have seen e in all of Scan 1 + WE = DEGREE (E) + WNVI - DENXT(E) + ENDIF + W (E) = WE + 140 CONTINUE + ENDIF + 150 CONTINUE + ELSE +C No dense rows have been found + DO 152 PME = PME1, PME2 + I = IW (PME) + ELN = ELEN (I) + IF (ELN .GT. 0) THEN +C note that nv (i) has been negated to denote i in Lme: + NVI = -NV (I) + WNVI = WFLG - NVI + DO 151 P = PE (I), PE (I) + ELN - 1 + E = IW (P) + WE = W (E) + IF (WE .GE. WFLG) THEN +C unabsorbed element e has been seen in this loop + WE = WE - NVI + ELSE IF (WE .NE. 0) THEN +C e is an unabsorbed element - this is +C the first we have seen e in all of Scan 1 + WE = DEGREE (E) + WNVI + ENDIF + W (E) = WE + 151 CONTINUE + ENDIF + 152 CONTINUE + END IF + +C ==================================================================== +C DEGREE UPDATE AND ELEMENT ABSORPTION +C ==================================================================== + +C ------------------------------------------------------------- +C Scan 2: for each sparse i in Lme, sum up the external degrees +C of each Le for the elements e appearing within i, plus the +C supervariables in i. Place i in hash list. +C ------------------------------------------------------------- + IF (NBD.GT.0) THEN +C Dense rows have been found + DO 180 PME = PME1, PME2 + I = IW (PME) +C skip dense rows + IF (DEGREE(I).GT.N) GOTO 180 +C remove absorbed elements from the list for i + P1 = PE (I) + P2 = P1 + ELEN (I) - 1 + PN = P1 + HASH = 0 + DEG = 0 + +C ---------------------------------------------------------- +C scan the element list associated with supervariable i +C ---------------------------------------------------------- + DO 160 P = P1, P2 + E = IW (P) +C dext = | Le | - | (Le \cap Lme)\D | - DENXT(e) + DEXT = W (E) - WFLG + IF (DEXT .GT. 0) THEN + DEG = DEG + DEXT + IW (PN) = E + PN = PN + 1 + HASH = HASH+E + ELSE IF ((DEXT .EQ. 0) .AND. + & (DENXT(ME).EQ.NBD)) THEN +C aggressive absorption: e is not adjacent to me, but +C |Le(G') \ Lme(G')| is 0 and all dense rows +C are in me, so absorb it into me + PE (E) = -ME + W (E) = 0 + ELSE IF (DEXT.EQ.0) THEN + IW(PN) = E + PN = PN+1 + HASH = HASH + E + ENDIF + 160 CONTINUE + +C count the number of elements in i (including me): + ELEN (I) = PN - P1 + 1 + +C ---------------------------------------------------------- +C scan the supervariables in the list associated with i +C ---------------------------------------------------------- + P3 = PN + DO 170 P = P2 + 1, P1 + LEN (I) - 1 + J = IW (P) + NVJ = NV (J) + IF (NVJ .GT. 0) THEN +C j is unabsorbed, and not in Lme. +C add to degree and add to new list +C add degree only of sparse rows. + IF (DEGREE(J).LE.N) DEG=DEG+NVJ + IW (PN) = J + PN = PN + 1 + HASH = HASH + J + ENDIF + 170 CONTINUE + +C ---------------------------------------------------------- +C update the degree and check for mass elimination +C ---------------------------------------------------------- + IF ((DEG .EQ. 0).AND.(DENXT(ME).EQ.NBD)) THEN +C mass elimination only possible when all dense rows +C are in ME +C ------------------------------------------------------- +C mass elimination - supervariable i can be eliminated +C ------------------------------------------------------- + PE (I) = -ME + NVI = -NV (I) + DEGME = DEGME - NVI + NVPIV = NVPIV + NVI + NEL = NEL + NVI + NV (I) = 0 + ELEN (I) = 0 + ELSE +C ------------------------------------------------------- +C update the upper-bound degree of i +C A bound for the new external degree is the old bound plus +C the size of the generated element +C ------------------------------------------------------- +C the following degree does not yet include the size +C of the current element, which is added later: + DEGREE(I) = MIN (DEG+NBD-DENXT(ME), DEGREE(I)) + +C ------------------------------------------------------- +C add me to the list for i +C ------------------------------------------------------- +C move first supervariable to end of list + IW (PN) = IW (P3) +C move first element to end of element part of list + IW (P3) = IW (P1) +C add new element to front of list. + IW (P1) = ME +C store the new length of the list in len (i) + LEN (I) = PN - P1 + 1 + +C ------------------------------------------------------- +C place in hash bucket. Save hash key of i in last (i). +C ------------------------------------------------------- + HASH = ABS(MOD (HASH, HMOD)) + 1 + J = HEAD (HASH) + IF (J .LE. 0) THEN +C the degree list is empty, hash head is -j + DENXT (I) = -J + HEAD (HASH) = -I + ELSE +C degree list is not empty - has j as its head +C last is hash head + DENXT (I) = LAST (J) + LAST (J) = I + ENDIF + LAST (I) = HASH + ENDIF + 180 CONTINUE + ELSE +C No dense rows have been found + DO 183 PME = PME1, PME2 + I = IW (PME) +C remove absorbed elements from the list for i + P1 = PE (I) + P2 = P1 + ELEN (I) - 1 + PN = P1 + HASH = 0 + DEG = 0 + +C ------------------------------------------------------- +C scan the element list associated with supervariable i +C ------------------------------------------------------- + DO 181 P = P1, P2 + E = IW (P) +C dext = | Le | - | (Le \cap Lme)\D | - DENXT(e) + DEXT = W (E) - WFLG + IF (DEXT .GT. 0) THEN + DEG = DEG + DEXT + IW (PN) = E + PN = PN + 1 + HASH = HASH + E + ELSE IF (DEXT .EQ. 0) THEN +C aggressive absorption: e is not adjacent to me, but +C |Le(G') \ Lme(G')| is 0, so absorb it into me + PE (E) = -ME + W (E) = 0 + ENDIF + 181 CONTINUE + +C count the number of elements in i (including me): + ELEN (I) = PN - P1 + 1 + +C ---------------------------------------------------------- +C scan the supervariables in the list associated with i +C ---------------------------------------------------------- + P3 = PN + DO 182 P = P2 + 1, P1 + LEN (I) - 1 + J = IW (P) + NVJ = NV (J) + IF (NVJ .GT. 0) THEN +C j is unabsorbed, and not in Lme. +C add to degree and add to new list + DEG=DEG+NVJ + IW (PN) = J + PN = PN + 1 + HASH = HASH + J + ENDIF + 182 CONTINUE + +C ---------------------------------------------------------- +C update the degree and check for mass elimination +C ---------------------------------------------------------- + IF (DEG .EQ. 0) THEN +C ------------------------------------------------------- +C mass elimination - supervariable i can be eliminated +C ------------------------------------------------------- + PE (I) = -ME + NVI = -NV (I) + DEGME = DEGME - NVI + NVPIV = NVPIV + NVI + NEL = NEL + NVI + NV (I) = 0 + ELEN (I) = 0 + ELSE +C ------------------------------------------------------- +C update the upper-bound degree of i +C A bound for the new external degree is the old bound plus +C the size of the generated element +C ------------------------------------------------------- +C +C the following degree does not yet include the size +C of the current element, which is added later: + DEGREE(I) = MIN (DEG, DEGREE(I)) + +C ------------------------------------------------------- +C add me to the list for i +C ------------------------------------------------------- +C move first supervariable to end of list + IW (PN) = IW (P3) +C move first element to end of element part of list + IW (P3) = IW (P1) +C add new element to front of list. + IW (P1) = ME +C store the new length of the list in len (i) + LEN (I) = PN - P1 + 1 + +C ------------------------------------------------------- +C place in hash bucket. Save hash key of i in last (i). +C ------------------------------------------------------- + HASH = ABS(MOD (HASH, HMOD)) + 1 + J = HEAD (HASH) + IF (J .LE. 0) THEN +C the degree list is empty, hash head is -j + DENXT (I) = -J + HEAD (HASH) = -I + ELSE +C degree list is not empty - has j as its head +C last is hash head + DENXT (I) = LAST (J) + LAST (J) = I + ENDIF + LAST (I) = HASH + ENDIF + 183 CONTINUE + END IF + DEGREE (ME) = DEGME + +C ------------------------------------------------------------- +C Clear the counter array, w (...), by incrementing wflg. +C ------------------------------------------------------------- + DMAX = MAX (DMAX, DEGME) + WFLG = WFLG + DMAX + +C make sure that wflg+n does not cause integer overflow + IF (WFLG .GE. IOVFLO - N) THEN + DO 190 X = 1, N + IF (W (X) .NE. 0) W (X) = 1 + 190 CONTINUE + WFLG = 2 + ENDIF +C at this point, w (1..n) .lt. wflg holds + +C ==================================================================== +C SUPERVARIABLE DETECTION +C ==================================================================== + DO 250 PME = PME1, PME2 + I = IW (PME) + IF ( (NV(I).GE.0) .OR. (DEGREE(I).GT.N) ) GO TO 250 +C only done for sparse rows +C replace i by head of its hash bucket, and set the hash +C bucket header to zero + +C ------------------------------------------------------- +C examine all hash buckets with 2 or more variables. We +C do this by examing all unique hash keys for super- +C variables in the pattern Lme of the current element, me +C ------------------------------------------------------- + HASH = LAST (I) +C let i = head of hash bucket, and empty the hash bucket + J = HEAD (HASH) + IF (J .EQ. 0) GO TO 250 + IF (J .LT. 0) THEN +C degree list is empty + I = -J + HEAD (HASH) = 0 + ELSE +C degree list is not empty, restore last () of head + I = LAST (J) + LAST (J) = 0 + ENDIF + IF (I .EQ. 0) GO TO 250 + +C while loop: + DO 247 JDUMMY = 1,N + IF (DENXT (I) .EQ. 0) GO TO 250 +C ---------------------------------------------------- +C this bucket has one or more variables following i. +C scan all of them to see if i can absorb any entries +C that follow i in hash bucket. Scatter i into w. +C ---------------------------------------------------- + LN = LEN (I) + ELN = ELEN (I) +C do not flag the first element in the list (me) + DO 210 P = PE (I) + 1, PE (I) + LN - 1 + W (IW (P)) = WFLG + 210 CONTINUE + +C ---------------------------------------------------- +C scan every other entry j following i in bucket +C ---------------------------------------------------- + JLAST = I + J = DENXT (I) + +C while loop: + DO 245 IDUMMY=1,N + IF (J .EQ. 0) GO TO 246 + +C ------------------------------------------------- +C check if j and i have identical nonzero pattern +C ------------------------------------------------- +C jump if i and j do not have same size data structure + IF (LEN (J) .NE. LN) GO TO 240 +C jump if i and j do not have same number adj elts + IF (ELEN (J) .NE. ELN) GO TO 240 +C do not flag the first element in the list (me) + + DO 230 P = PE (J) + 1, PE (J) + LN - 1 +C jump if an entry (iw(p)) is in j but not in i + IF (W (IW (P)) .NE. WFLG) GO TO 240 + 230 CONTINUE + +C ------------------------------------------------- +C found it! j can be absorbed into i +C ------------------------------------------------- + PE (J) = -I +C both nv (i) and nv (j) are negated since they +C are in Lme, and the absolute values of each +C are the number of variables in i and j: + NV (I) = NV (I) + NV (J) + NV (J) = 0 + ELEN (J) = 0 +C delete j from hash bucket + J = DENXT (J) + DENXT (JLAST) = J + GO TO 245 + +C ------------------------------------------------- + 240 CONTINUE +C j cannot be absorbed into i +C ------------------------------------------------- + JLAST = J + J = DENXT (J) + 245 CONTINUE + +C ---------------------------------------------------- +C no more variables can be absorbed into i +C go to next i in bucket and clear flag array +C ---------------------------------------------------- + 246 WFLG = WFLG + 1 + I = DENXT (I) + IF (I .EQ. 0) GO TO 250 + 247 CONTINUE + 250 CONTINUE + +C ==================================================================== +C RESTORE DEGREE LISTS AND REMOVE NONPRINCIPAL SUPERVAR. FROM ELEMENT +C Squeeze out absorbed variables +C ==================================================================== + P = PME1 + NLEFT = N - NEL + DO 260 PME = PME1, PME2 + I = IW (PME) + NVI = -NV (I) + IF (NVI .LE. 0) GO TO 260 +C i is a principal variable in Lme +C restore nv (i) to signify that i is principal + NV (I) = NVI + IF (DEGREE(I).GT.N) GO TO 258 +C ------------------------------------------------------- +C compute the external degree (add size of current elem) +C ------------------------------------------------------- + DEG = MIN (DEGREE (I)+ DEGME - NVI, NLEFT - NVI) + DEGREE (I) = DEG + IDENSE = .FALSE. +C ------------------- +C Dense row detection +C ------------------- + IF (THRESM.GE.0) THEN +C DEGME is exact external degree of pivot ME |Le\Ve|, +C DEG is is approx external degree of I + IF ((DEG+NVI .GE. THRESM).OR. + & (DEG+NVI .GE. NLEFT)) THEN + IF (THRESM.EQ.N) THEN +C We must be sure that I is full in reduced matrix + IF ((ELEN(I).LE.2) .AND.((DEG+NVI).EQ.NLEFT) + & .AND. NBD.EQ.NFULL ) THEN +C DEG approximation is exact and I is dense + DEGREE(I) = N+1 + IDENSE = .TRUE. + ENDIF + ELSE +C relaxed dense row detection + IDENSE = .TRUE. + IF ((ELEN(I).LE.2).AND. ((DEG+NVI).EQ.NLEFT) + & .AND. NBD.EQ.NFULL ) THEN + DEGREE(I) = N+1 + ELSE + DEGREE(I) = N+1+DEGREE(I) + ENDIF + ENDIF + ENDIF + IF (IDENSE) THEN +C update DENXT of all elements in the list of element +C adjacent to I (including ME). + P1 = PE(I) + P2 = P1 + ELEN(I) - 1 + DO 255 PJ=P1,P2 + E= IW(PJ) + DENXT (E) = DENXT(E) + NVI + 255 CONTINUE +C insert I in the list of dense rows + NBD = NBD+NVI + DEG = N + IF (DEGREE(I).EQ.N+1) THEN +c insert I at the end of the list + NFULL = NFULL +NVI + IF (LASTD.EQ.0) THEN +C degree list is empty + LASTD = I + HEAD(DEG) = I + DENXT(I) = 0 + LAST(I) = 0 + ELSE +C IF (NFULL.EQ.NVI) THEN +C First full row encountered + DENXT(LASTD) = I + LAST(I) = LASTD + LASTD = I + DENXT(I) = 0 +C ELSE +C Absorb I into LASTD (first full row found) +C PE(I) = - LASTD +C NV(LASTD) = NV(LASTD) + NV(I) +C NV(I) = 0 +C ELEN(I) = 0 +C END IF + ENDIF + ELSE +C insert I at the beginning of the list + INEXT = HEAD(DEG) + IF (INEXT .NE. 0) LAST (INEXT) = I + DENXT (I) = INEXT + HEAD (DEG) = I + LAST(I) = 0 + IF (LASTD.EQ.0) LASTD=I + ENDIF +C end of IDENSE=true + ENDIF +C end of THRESM>0 + ENDIF + + IF (.NOT.IDENSE) THEN +C ------------------------------------------------------- +C place the supervariable at the head of the degree list +C ------------------------------------------------------- + INEXT = HEAD (DEG) + IF (INEXT .NE. 0) LAST (INEXT) = I + DENXT (I) = INEXT + LAST (I) = 0 + HEAD (DEG) = I + ENDIF +C ------------------------------------------------------- +C save the new degree, and find the minimum degree +C ------------------------------------------------------- + MINDEG = MIN (MINDEG, DEG) + 258 CONTINUE +C ------------------------------------------------------- +C place the supervariable in the element pattern +C ------------------------------------------------------- + IW (P) = I + P = P + 1 + 260 CONTINUE + +C ===================================================================== +C FINALIZE THE NEW ELEMENT +C ===================================================================== + OPS = OPS + DEGME*NVPIV + DEGME * NVPIV*NVPIV + + * DEGME*DEGME*NVPIV + NVPIV*NVPIV*NVPIV/3 + + * NVPIV*NVPIV/2 + NVPIV/6 + NVPIV + NRLADU = NRLADU + (NVPIV*(NVPIV+1))/2 + (DEGME*NVPIV) + NV (ME) = NVPIV + DEGME +C nv (me) is now the degree of pivot (including diagonal part) +C save the length of the list for the new element me + LEN (ME) = P - PME1 + IF (LEN (ME) .EQ. 0) THEN +C there is nothing left of the current pivot element + PE (ME) = 0 + W (ME) = 0 + ENDIF + IF (NEWMEM .NE. 0) THEN +C element was not constructed in place: deallocate part +C of it (final size is less than or equal to newmem, +C since newly nonprincipal variables have been removed). + PFREE = P + MEM = MEM - NEWMEM + LEN (ME) + ENDIF + +C ===================================================================== +C END WHILE (selecting pivots) + GO TO 30 + ENDIF +C ===================================================================== + GO TO 265 + +C We have only full rows that we amalgamate at the root +C node and ME = LASTD +C Perform mass elimination of all full rows + 263 NELME = -(NEL+1) + DO 264 X=1,N + IF ((PE(X).GT.0) .AND. (ELEN(X).LT.0)) THEN +C X is an unabsorbed element + PE(X) = -ME + ELSEIF (DEGREE(X).EQ.N+1) THEN +C X is a dense row, absorb it in ME (mass elimination) + NEL = NEL + NV(X) + PE(X) = -ME + ELEN(X) = 0 + NV(X) = 0 + ENDIF + 264 CONTINUE +C ME is the root node + ELEN(ME) = NELME + NV(ME) = NBD + NRLADU = NRLADU + (NBD*(NBD+1))/2 + OPS = OPS + NBD*NBD*NBD/3 + NBD*NBD/2 + NBD/6 + NBD + PE(ME) = 0 + + 265 CONTINUE +C =================================================================== +C COMPUTE THE PERMUTATION VECTORS +C =================================================================== + +C ---------------------------------------------------------------- +C The time taken by the following code is O(n). At this +C point, elen (e) = -k has been done for all elements e, +C and elen (i) = 0 has been done for all nonprincipal +C variables i. At this point, there are no principal +C supervariables left, and all elements are absorbed. +C ---------------------------------------------------------------- +C +C ---------------------------------------------------------------- +C compute the ordering of unordered nonprincipal variables +C ---------------------------------------------------------------- + + DO 290 I = 1, N + IF (ELEN (I) .EQ. 0) THEN +C ---------------------------------------------------------- +C i is an un-ordered row. Traverse the tree from i until +C reaching an element, e. The element, e, was the +C principal supervariable of i and all nodes in the path +C from i to when e was selected as pivot. +C ---------------------------------------------------------- + J = -PE (I) +C while (j is a variable) do: + DO 270 JDUMMY = 1,N + IF (ELEN (J) .LT. 0) GO TO 275 + J = -PE (J) + 270 CONTINUE + 275 E = J +C ---------------------------------------------------------- +C get the current pivot ordering of e +C ---------------------------------------------------------- + K = -ELEN (E) + +C ---------------------------------------------------------- +C traverse the path again from i to e, and compress the +C path (all nodes point to e). Path compression allows +C this code to compute in O(n) time. Order the unordered +C nodes in the path, and place the element e at the end. +C ---------------------------------------------------------- + J = I +C while (j is a variable) do: + DO 280 IDUMMY = 1,N + IF (ELEN (J) .LT. 0) GO TO 285 + JNEXT = -PE (J) + PE (J) = -E + IF (ELEN (J) .EQ. 0) THEN +C j is an unordered row + ELEN (J) = K + K = K + 1 + ENDIF + J = JNEXT + 280 CONTINUE +C leave elen (e) negative, so we know it is an element + 285 ELEN (E) = -K + ENDIF + 290 CONTINUE + +C ---------------------------------------------------------------- +C reset the inverse permutation (elen (1..n)) to be positive, +C and compute the permutation (last (1..n)). +C ---------------------------------------------------------------- + DO 300 I = 1, N + K = ABS (ELEN (I)) + LAST (K) = I + ELEN (I) = K + 300 CONTINUE + +C ==================================================================== +C RETURN THE MEMORY USAGE IN IW AND SET INFORMATION ARRAYS +C ==================================================================== +C If maxmem is less than or equal to iwlen, then no compressions +C occurred, and iw (maxmem+1 ... iwlen) was unused. Otherwise +C compressions did occur, and iwlen would have had to have been +C greater than or equal to maxmem for no compressions to occur. +C Return the value of maxmem in the pfree argument. + + RJNFO(1) = OPS + RJNFO(2) = NRLADU + JNFO(1) = NCMPA + JNFO(2) = RSTRT + PFREE = MAXMEM + + RETURN + END +C ==================================================================== +C ==================================================================== +C ==================================================================== +* COPYRIGHT (c) 1993 Council for the Central Laboratory +* of the Research Councils + +C Original date 29 Jan 2001 +C 29 January 2001. Modified from MC49 to be threadsafe. + +C 12th July 2004 Version 1.0.0. Version numbering added. +C 28 February 2008. Version 1.0.1. Comments flowed to column 72. +C 21 September 2009. Version 1.0.2. Minor change to documentation. + + SUBROUTINE MC59AD(ICNTL,NC,NR,NE,IRN,LJCN,JCN,LA,A,LIP,IP, + & LIW,IW,INFO) +C +C To sort the sparsity pattern of a matrix to an ordering by columns. +C There is an option for ordering the entries within each column by +C increasing row indices and an option for checking the user-supplied +C matrix entries for indices which are out-of-range or duplicated. +C +C ICNTL: INTEGER array of length 10. Intent(IN). Used to specify +C control parameters for the subroutine. +C ICNTL(1): indicates whether the user-supplied matrix entries are to +C be checked for duplicates, and out-of-range indices. +C Note simple checks are always performed. +C ICNTL(1) = 0, data checking performed. +C Otherwise, no data checking. +C ICNTL(2): indicates the ordering requested. +C ICNTL(2) = 0, input is by rows and columns in arbitrary +C order and the output is sorted by columns. +C ICNTL(2) = 1, the output is also row ordered +C within each column. +C ICNTL(2) = 2, the input is already ordered by +C columns and is to be row ordered within each column. +C Values outside the range 0 to 2 are flagged as an error. +C ICNTL(3): indicates whether matrix entries are also being ordered. +C ICNTL(3) = 0, matrix entries are ordered. +C Otherwise, only the sparsity pattern is ordered +C and the array A is not accessed by the routine. +C ICNTL(4): the unit number of the device to +C which error messages are sent. Error messages +C can be suppressed by setting ICNTL(4) < 0. +C ICNTL(5): the unit number of the device to +C which warning messages are sent. Warning +C messages can be suppressed by setting ICNTL(5) < 0. +C ICNTL(6) indicates whether matrix symmetric. If unsymmetric, ICNTL(6) +C must be set to 0. +C If ICNTL(6) = -1 or 1, symmetric and only the lower +C triangular part of the reordered matrix is returned. +C If ICNTL(6) = -2 or 2, Hermitian and only the lower +C triangular part of the reordered matrix is returned. +C If error checks are performed (ICNTL(1) = 0) +C and ICNTL(6)> 1 or 2, the values of duplicate +C entries are added together; if ICNTL(6) < -1 or -2, the +C value of the first occurrence of the entry is used. +C ICNTL(7) to ICNTL(10) are not currently accessed by the routine. +C +C NC: INTEGER variable. Intent(IN). Must be set by the user +C to the number of columns in the matrix. +C NR: INTEGER variable. Intent(IN). Must be set by the user +C to the number of rows in the matrix. +C NE: INTEGER variable. Intent(IN). Must be set by the user +C to the number of entries in the matrix. +C IRN: INTEGER array of length NE. Intent (INOUT). Must be set by the +C user to hold the row indices of the entries in the matrix. +C If ICNTL(2).NE.2, the entries may be in any order. +C If ICNTL(2).EQ.2, the entries in column J must be in +C positions IP(J) to IP(J+1)-1 of IRN. On exit, the row +C indices are reordered so that the entries of a single +C column are contiguous with column J preceding column J+1, J +C = 1, 2, ..., NC-1, with no space between columns. +C If ICNTL(2).EQ.0, the order within each column is arbitrary; +C if ICNTL(2) = 1 or 2, the order within each column is by +C increasing row indices. +C LJCN: INTEGER variable. Intent(IN). Defines length array +C JCN: INTEGER array of length LJCN. Intent (INOUT). +C If ICNTL(2) = 0 or 1, JCN(K) must be set by the user +C to the column index of the entry +C whose row index is held in IRN(K), K = 1, 2, ..., NE. +C On exit, the contents of this array will have been altered. +C If ICNTL(2) = 2, the array is not accessed. +C LA: INTEGER variable. Intent(IN). Defines length of array +C A. +C A: is a REAL (DOUBLE PRECISION in the D version, INTEGER in +C the I version, COMPLEX in the C version, +C or COMPLEX"*"16 in the Z version) array of length LA. +C Intent(INOUT). +C If ICNTL(3).EQ.0, A(K) must be set by the user to +C hold the value of the entry with row index IRN(K), +C K = 1, 2, ..., NE. On exit, the array will have been +C permuted in the same way as the array IRN. +C If ICNTL(3).NE.0, the array is not accessed. +C LIP: INTEGER variable. Intent(IN). Defines length of array +C IP. +C IP: INTEGER array of length LIP. Intent(INOUT). IP +C need only be set by the user if ICNTL(2) = 2. +C In this case, IP(J) holds the position in +C the array IRN of the first entry in column J, J = 1, 2, +C ..., NC, and IP(NC+1) is one greater than the number of +C entries in the matrix. +C In all cases, the array IP will have this meaning on exit +C from the subroutine and is altered when ICNTL(2) = 2 only +C when ICNTL(1) = 0 and there are out-of-range +C indices or duplicates. +C LIW: INTEGER variable. Intent(IN). Defines length of array +C IW. +C IW: INTEGER array of length LIW. Intent(OUT). Used by the +C routine as workspace. +C INFO: INTEGER array of length 10. Intent(OUT). On exit, +C a negative value of INFO(1) is used to signal a fatal +C error in the input data, a positive value of INFO(1) +C indicates that a warning has been issued, and a +C zero value is used to indicate a successful call. +C In cases of error, further information is held in INFO(2). +C For warnings, further information is +C provided in INFO(3) to INFO(6). INFO(7) to INFO(10) are not +C currently used and are set to zero. +C Possible nonzero values of INFO(1): +C -1 - The restriction ICNTL(2) = 0, 1, or 2 violated. +C Value of ICNTL(2) is given by INFO(2). +C -2 - NC.LE.0. Value of NC is given by INFO(2). +C -3 - Error in NR. Value of NR is given by INFO(2). +C -4 - NE.LE.0. Value of NE is given by INFO(2). +C -5 - LJCN too small. Min. value of LJCN is given by INFO(2). +C -6 - LA too small. Min. value of LA is given by INFO(2). +C -7 - LIW too small. Value of LIW is given by INFO(2). +C -8 - LIP too small. Value of LIP is given by INFO(2). +C -9 - The entries of IP not monotonic increasing. +C -10 - For each I, IRN(I) or JCN(I) out-of-range. +C -11 - ICNTL(6) is out of range. +C +1 - One or more duplicated entries. One copy of +C each such entry is kept and, if ICNTL(3) = 0 and +C ICNTL(6).GE.0, the values of these entries are +C added together. If ICNTL(3) = 0 and ICNTL(6).LT.0, +C the value of the first occurrence of the entry is used. +C Initially INFO(3) is set to zero. If an entry appears +C k times, INFO(3) is incremented by k-1 and INFO(6) +C is set to the revised number of entries in the +C matrix. +C +2 - One or more of the entries in IRN out-of-range. These +C entries are removed by the routine.`INFO(4) is set to +C the number of entries which were out-of-range and +C INFO(6) is set to the revised number of entries in the +C matrix. +C +4 - One or more of the entries in JCN out-of-range. These +C entries are removed by the routine. INFO(5) is set to +C the number of entries which were out-of-range and +C INFO(6) is set to the revised number of entries in the +C matrix. Positive values of INFO(1) are summed so that +C the user can identify all warnings. +C +C .. Scalar Arguments .. + INTEGER LA,LIP,LIW,LJCN,NC,NE,NR +C .. +C .. Array Arguments .. + DOUBLE PRECISION A(LA) + INTEGER ICNTL(10),IP(LIP),INFO(10),IRN(NE),IW(LIW),JCN(LJCN) +C .. +C .. Local Scalars .. + INTEGER I,ICNTL1,ICNTL2,ICNTL3,ICNTL6,LAA + INTEGER IDUP,IOUT,IUP,JOUT,LP,MP,KNE,PART + LOGICAL LCHECK +C .. +C .. External Subroutines .. + EXTERNAL MC59BD,MC59CD,MC59DD,MC59ED,MC59FD +C .. +C .. Intrinsic Functions .. + INTRINSIC MAX +C .. +C .. Executable Statements .. + +C Initialise + DO 10 I = 1,10 + INFO(I) = 0 + 10 CONTINUE + + ICNTL1 = ICNTL(1) + ICNTL2 = ICNTL(2) + ICNTL3 = ICNTL(3) + ICNTL6 = ICNTL(6) + LCHECK = (ICNTL1.EQ.0) +C Streams for errors/warnings + LP = ICNTL(4) + MP = ICNTL(5) + +C Check the input data + IF (ICNTL2.GT.2 .OR. ICNTL2.LT.0) THEN + INFO(1) = -1 + INFO(2) = ICNTL2 + IF (LP.GT.0) THEN + WRITE (LP,FMT=9000) INFO(1) + WRITE (LP,FMT=9010) ICNTL2 + END IF + GO TO 70 + END IF + + IF (ICNTL6.GT.2 .OR. ICNTL6.LT.-2) THEN + INFO(1) = -11 + INFO(2) = ICNTL6 + IF (LP.GT.0) THEN + WRITE (LP,FMT=9000) INFO(1) + WRITE (LP,FMT=9150) ICNTL6 + END IF + GO TO 70 + END IF +C For real matrices, symmetric = Hermitian so only +C have to distinguish between unsymmetric (ICNTL6 = 0) and +C symmetric (ICNTL6.ne.0) + + IF (NC.LT.1) THEN + INFO(1) = -2 + INFO(2) = NC + IF (LP.GT.0) THEN + WRITE (LP,FMT=9000) INFO(1) + WRITE (LP,FMT=9020) NC + END IF + GO TO 70 + END IF + + IF (NR.LT.1) THEN + INFO(1) = -3 + INFO(2) = NR + IF (LP.GT.0) THEN + WRITE (LP,FMT=9000) INFO(1) + WRITE (LP,FMT=9030) NR + END IF + GO TO 70 + END IF + + IF (ICNTL6.NE.0 .AND. NR.NE.NC) THEN + INFO(1) = -3 + INFO(2) = NR + IF (LP.GT.0) THEN + WRITE (LP,FMT=9000) INFO(1) + WRITE (LP,FMT=9035) NC,NR + END IF + GO TO 70 + END IF + + IF (NE.LT.1) THEN + INFO(1) = -4 + INFO(2) = NE + IF (LP.GT.0) THEN + WRITE (LP,FMT=9000) INFO(1) + WRITE (LP,FMT=9040) NE + END IF + GO TO 70 + END IF + + IF (ICNTL2.EQ.0 .OR. ICNTL2.EQ.1) THEN + IF (LJCN.LT.NE) THEN + INFO(1) = -5 + INFO(2) = NE + END IF + ELSE + IF (LJCN.LT.1) THEN + INFO(1) = -5 + INFO(2) = 1 + END IF + END IF + IF (INFO(1).EQ.-5) THEN + IF (LP.GT.0) THEN + WRITE (LP,FMT=9000) INFO(1) + WRITE (LP,FMT=9050) LJCN,INFO(2) + END IF + GO TO 70 + END IF + + IF (ICNTL3.EQ.0) THEN + IF (LA.LT.NE) THEN + INFO(1) = -6 + INFO(2) = NE + END IF + ELSE + IF (LA.LT.1) THEN + INFO(1) = -6 + INFO(2) = 1 + END IF + END IF + IF (INFO(1).EQ.-6) THEN + IF (LP.GT.0) THEN + WRITE (LP,FMT=9000) INFO(1) + WRITE (LP,FMT=9060) LA,INFO(2) + END IF + GO TO 70 + END IF + + IF (ICNTL2.EQ.0 .OR. ICNTL2.EQ.2) THEN + IF (LIP.LT.NC+1) THEN + INFO(1) = -7 + INFO(2) = NC+1 + END IF + ELSE IF (LIP.LT.MAX(NR,NC)+1) THEN + INFO(1) = -7 + INFO(2) = MAX(NR,NC)+1 + END IF + IF (INFO(1).EQ.-7) THEN + IF (LP.GT.0) THEN + WRITE (LP,FMT=9000) INFO(1) + WRITE (LP,FMT=9065) LIP,INFO(2) + END IF + GO TO 70 + END IF + +C Check workspace sufficient + IF (LIW.LT.MAX(NR,NC)+1) THEN + INFO(1) = -8 + INFO(2) = MAX(NR,NC)+1 + IF (LP.GT.0) THEN + WRITE (LP,FMT=9000) INFO(1) + WRITE (LP,FMT=9070) LIW,INFO(2) + END IF + GO TO 70 + END IF + + LAA = NE + IF (ICNTL3.NE.0) LAA = 1 +C Initialise counts of number of out-of-range entries and duplicates + IOUT = 0 + JOUT = 0 + IDUP = 0 + IUP = 0 + +C PART is used by MC59BD to indicate if upper or lower or +C all of matrix is required. +C PART = 0 : unsymmetric case, whole matrix wanted +C PART = 1 : symmetric case, lower triangular part of matrix wanted +C PART = -1 : symmetric case, upper triangular part of matrix wanted + PART = 0 + IF (ICNTL6.NE.0) PART = 1 + + IF (ICNTL2.EQ.0) THEN + +C Order directly by columns +C On exit from MC59BD, KNE holds number of entries in matrix +C after removal of out-of-range entries. If no data checking, KNE = NE. + CALL MC59BD(LCHECK,PART,NC,NR,NE,IRN,JCN,LAA,A,IP,IW, + + IOUT,JOUT,KNE) +C Return if ALL entries out-of-range. + IF (KNE.EQ.0) GO TO 50 + +C Check for duplicates + IF (LCHECK) CALL MC59ED(NC,NR,NE,IRN,LIP,IP,LAA,A,IW,IDUP, + & KNE,ICNTL6) + + ELSE IF (ICNTL2.EQ.1) THEN + +C First order by rows. +C Interchanged roles of IRN and JCN, so set PART = -1 +C if matrix is symmetric case + IF (ICNTL6.NE.0) PART = -1 + CALL MC59BD(LCHECK,PART,NR,NC,NE,JCN,IRN,LAA,A,IW,IP, + + JOUT,IOUT,KNE) +C Return if ALL entries out-of-range. + IF (KNE.EQ.0) GO TO 50 + +C At this point, JCN and IW hold column indices and row pointers +C Optionally, check for duplicates. + IF (LCHECK) CALL MC59ED(NR,NC,NE,JCN,NR+1,IW,LAA,A,IP, + & IDUP,KNE,ICNTL6) + +C Now order by columns and by rows within each column + CALL MC59CD(NC,NR,KNE,IRN,JCN,LAA,A,IP,IW) + + ELSE IF (ICNTL2.EQ.2) THEN +C Input is using IP, IRN. +C Optionally check for duplicates and remove out-of-range entries + IF (LCHECK) THEN + CALL MC59FD(NC,NR,NE,IRN,NC+1,IP,LAA,A,LIW,IW,IDUP, + + IOUT,IUP,KNE,ICNTL6,INFO) +C Return if IP not monotonic. + IF (INFO(1).EQ.-9) GO TO 40 +C Return if ALL entries out-of-range. + IF (KNE.EQ.0) GO TO 50 + ELSE + KNE = NE + END IF + +C Order by rows within each column + CALL MC59DD(NC,KNE,IRN,IP,LAA,A) + + END IF + + INFO(3) = IDUP + INFO(4) = IOUT + INFO(5) = JOUT + INFO(6) = KNE + INFO(7) = IUP + +C Set warning flag if out-of-range /duplicates found + IF (IDUP.GT.0) INFO(1) = INFO(1) + 1 + IF (IOUT.GT.0) INFO(1) = INFO(1) + 2 + IF (JOUT.GT.0) INFO(1) = INFO(1) + 4 + IF (INFO(1).GT.0 .AND. MP.GT.0) THEN + WRITE (MP,FMT=9080) INFO(1) + IF (IOUT.GT.0) WRITE (MP,FMT=9090) IOUT + IF (JOUT.GT.0) WRITE (MP,FMT=9110) JOUT + IF (IDUP.GT.0) WRITE (MP,FMT=9100) IDUP + IF (IUP.GT.0) WRITE (MP,FMT=9130) IUP + END IF + GO TO 70 + + 40 INFO(3) = IDUP + INFO(4) = IOUT + INFO(7) = IUP + IF (LP.GT.0) THEN + WRITE (LP,FMT=9000) INFO(1) + WRITE (LP,FMT=9140) + END IF + GO TO 70 + + 50 INFO(1) = -10 + INFO(4) = IOUT + INFO(5) = JOUT + INFO(2) = IOUT + JOUT + IF (LP.GT.0) THEN + WRITE (LP,FMT=9000) INFO(1) + WRITE (LP,FMT=9120) + END IF + 70 RETURN + + 9000 FORMAT (/,' *** Error return from MC59AD *** INFO(1) = ',I3) + 9010 FORMAT (1X,'ICNTL(2) = ',I2,' is out of range') + 9020 FORMAT (1X,'NC = ',I6,' is out of range') + 9030 FORMAT (1X,'NR = ',I6,' is out of range') + 9035 FORMAT (1X,'Symmetric case. NC = ',I6,' but NR = ',I6) + 9040 FORMAT (1X,'NE = ',I10,' is out of range') + 9050 FORMAT (1X,'Increase LJCN from ',I10,' to at least ',I10) + 9060 FORMAT (1X,'Increase LA from ',I10,' to at least ',I10) + 9065 FORMAT (1X,'Increase LIP from ',I8,' to at least ',I10) + 9070 FORMAT (1X,'Increase LIW from ',I8,' to at least ',I10) + 9080 FORMAT (/,' *** Warning message from MC59AD *** INFO(1) = ',I3) + 9090 FORMAT (1X,I8,' entries in IRN supplied by the user were ', + + /,' out of range and were ignored by the routine') + 9100 FORMAT (1X,I8,' duplicate entries were supplied by the user') + 9110 FORMAT (1X,I8,' entries in JCN supplied by the user were ', + + /,' out of range and were ignored by the routine') + 9120 FORMAT (1X,'All entries out of range') + 9130 FORMAT (1X,I8,' of these entries were in the upper triangular ', + + /,' part of matrix') + 9140 FORMAT (1X,'Entries in IP are not monotonic increasing') + 9150 FORMAT (1X,'ICNTL(6) = ',I2,' is out of range') + END +C*********************************************************************** + SUBROUTINE MC59BD(LCHECK,PART,NC,NR,NE,IRN,JCN,LA,A,IP,IW,IOUT, + + JOUT,KNE) +C +C To sort a sparse matrix from arbitrary order to +C column order, unordered within each column. Optionally +C checks for out-of-range entries in IRN,JCN. +C +C LCHECK - logical variable. Intent(IN). If true, check +C for out-of-range indices. +C PART - integer variable. Intent(IN) +C PART = 0 : unsymmetric case, whole matrix wanted +C PART = 1 : symmetric case, lower triangular part of matrix wanted +C (ie IRN(K) .ge. JCN(K) on exit) +C PART = -1 : symmetric case, upper triangular part of matrix wanted +C (ie IRN(K) .le. JCN(K) on exit) +C NC - integer variable. Intent(IN) +C - on entry must be set to the number of columns in the matrix +C NR - integer variable. Intent(IN) +C - on entry must be set to the number of rows in the matrix +C NE - integer variable. Intent(IN) +C - on entry, must be set to the number of nonzeros in the matrix +C IRN - integer array of length NE. Intent(INOUT) +C - on entry set to contain the row indices of the nonzeros +C in arbitrary order. +C - on exit, the entries in IRN are reordered so that the row +C indices for column 1 precede those for column 2 and so on, +C but the order within columns is arbitrary. +C JCN - integer array of length NE. Intent(INOUT) +C - on entry set to contain the column indices of the nonzeros +C - JCN(K) must be the column index of +C the entry in IRN(K) +C - on exit, JCN(K) is the column index for the entry with +C row index IRN(K) (K=1,...,NE). +C LA - integer variable which defines the length of the array A. +C Intent(IN) +C A - real (double precision/complex/complex*16) array of length LA +C Intent(INOUT) +C - if LA > 1, the array must be of length NE, and A(K) +C must be set to the value of the entry in (IRN(K), JCN(K)); +C on exit A is reordered in the same way as IRN +C - if LA = 1, the array is not accessed +C IP - integer array of length NC+1. Intent(INOUT) +C - not set on entry +C - on exit, IP(J) contains the position in IRN (and A) of the +C first entry in column J (J=1,...,NC) +C - IP(NC+1) is set to NE+1 +C IW - integer array of length NC+1. Intent(INOUT) +C - the array is used as workspace +C - on exit IW(I) = IP(I) (so IW(I) points to the beginning +C of column I). +C IOUT - integer variable. Intent(OUT). On exit, holds number +C of entries in IRN found to be out-of-range +C JOUT - integer variable. Intent(OUT). On exit, holds number +C of entries in JCN found to be out-of-range +C KNE - integer variable. Intent(OUT). On exit, holds number +C of entries in matrix after removal of out-of-range entries. +C If no data checking, KNE = NE. + +C .. Scalar Arguments .. + INTEGER LA,NC,NE,NR,IOUT,JOUT,KNE,PART + LOGICAL LCHECK +C .. +C .. Array Arguments .. + DOUBLE PRECISION A(LA) + INTEGER IP(NC+1),IRN(NE),IW(NC+1),JCN(NE) +C .. +C .. Local Scalars .. + DOUBLE PRECISION ACE,ACEP + INTEGER I,ICE,ICEP,J,JCE,JCEP,K,L,LOC +C .. +C .. Executable Statements .. + +C Initialise IW + DO 10 J = 1,NC + 1 + IW(J) = 0 + 10 CONTINUE + + KNE = 0 + IOUT = 0 + JOUT = 0 +C Count the number of entries in each column and store in IW. +C We also allow checks for out-of-range indices + IF (LCHECK) THEN +C Check data. +C Treat case of pattern only separately. + IF (LA.GT.1) THEN + IF (PART.EQ.0) THEN +C Unsymmetric + DO 20 K = 1,NE + I = IRN(K) + J = JCN(K) + IF (I.GT.NR .OR. I.LT.1) THEN + IOUT = IOUT + 1 +C IRN out-of-range. Is JCN also out-of-range? + IF (J.GT.NC .OR. J.LT.1) JOUT = JOUT + 1 + ELSE IF (J.GT.NC .OR. J.LT.1) THEN + JOUT = JOUT + 1 + ELSE + KNE = KNE + 1 + IRN(KNE) = I + JCN(KNE) = J + A(KNE) = A(K) + IW(J) = IW(J) + 1 + END IF + 20 CONTINUE + ELSE IF (PART.EQ.1) THEN +C Symmetric, lower triangle + DO 21 K = 1,NE + I = IRN(K) + J = JCN(K) + IF (I.GT.NR .OR. I.LT.1) THEN + IOUT = IOUT + 1 +C IRN out-of-range. Is JCN also out-of-range? + IF (J.GT.NC .OR. J.LT.1) JOUT = JOUT + 1 + ELSE IF (J.GT.NC .OR. J.LT.1) THEN + JOUT = JOUT + 1 + ELSE + KNE = KNE + 1 +C Lower triangle ... swap if necessary + IF (I.LT.J) THEN + IRN(KNE) = J + JCN(KNE) = I + IW(I) = IW(I) + 1 + ELSE + IRN(KNE) = I + JCN(KNE) = J + IW(J) = IW(J) + 1 + END IF + A(KNE) = A(K) + END IF + 21 CONTINUE + ELSE IF (PART.EQ.-1) THEN +C Symmetric, upper triangle + DO 22 K = 1,NE + I = IRN(K) + J = JCN(K) + IF (I.GT.NR .OR. I.LT.1) THEN + IOUT = IOUT + 1 +C IRN out-of-range. Is JCN also out-of-range? + IF (J.GT.NC .OR. J.LT.1) JOUT = JOUT + 1 + ELSE IF (J.GT.NC .OR. J.LT.1) THEN + JOUT = JOUT + 1 + ELSE + KNE = KNE + 1 +C Upper triangle ... swap if necessary + IF (I.GT.J) THEN + IRN(KNE) = J + JCN(KNE) = I + IW(I) = IW(I) + 1 + ELSE + IRN(KNE) = I + JCN(KNE) = J + IW(J) = IW(J) + 1 + END IF + A(KNE) = A(K) + END IF + 22 CONTINUE + END IF + ELSE +C Pattern only + IF (PART.EQ.0) THEN + DO 25 K = 1,NE + I = IRN(K) + J = JCN(K) + IF (I.GT.NR .OR. I.LT.1) THEN + IOUT = IOUT + 1 + IF (J.GT.NC .OR. J.LT.1) JOUT = JOUT + 1 + ELSE IF (J.GT.NC .OR. J.LT.1) THEN + JOUT = JOUT + 1 + ELSE + KNE = KNE + 1 + IRN(KNE) = I + JCN(KNE) = J + IW(J) = IW(J) + 1 + END IF + 25 CONTINUE + ELSE IF (PART.EQ.1) THEN + DO 26 K = 1,NE + I = IRN(K) + J = JCN(K) + IF (I.GT.NR .OR. I.LT.1) THEN + IOUT = IOUT + 1 + IF (J.GT.NC .OR. J.LT.1) JOUT = JOUT + 1 + ELSE IF (J.GT.NC .OR. J.LT.1) THEN + JOUT = JOUT + 1 + ELSE + KNE = KNE + 1 +C Lower triangle ... swap if necessary + IF (I.LT.J) THEN + IRN(KNE) = J + JCN(KNE) = I + IW(I) = IW(I) + 1 + ELSE + IRN(KNE) = I + JCN(KNE) = J + IW(J) = IW(J) + 1 + END IF + END IF + 26 CONTINUE + ELSE IF (PART.EQ.-1) THEN + DO 27 K = 1,NE + I = IRN(K) + J = JCN(K) + IF (I.GT.NR .OR. I.LT.1) THEN + IOUT = IOUT + 1 + IF (J.GT.NC .OR. J.LT.1) JOUT = JOUT + 1 + ELSE IF (J.GT.NC .OR. J.LT.1) THEN + JOUT = JOUT + 1 + ELSE + KNE = KNE + 1 +C Upper triangle ... swap if necessary + IF (I.GT.J) THEN + IRN(KNE) = J + JCN(KNE) = I + IW(I) = IW(I) + 1 + ELSE + IRN(KNE) = I + JCN(KNE) = J + IW(J) = IW(J) + 1 + END IF + END IF + 27 CONTINUE + END IF + END IF +C Return if ALL entries out-of-range. + IF (KNE.EQ.0) GO TO 130 + + ELSE + +C No checks + KNE = NE + IF (PART.EQ.0) THEN + DO 30 K = 1,NE + J = JCN(K) + IW(J) = IW(J) + 1 + 30 CONTINUE + ELSE IF (PART.EQ.1) THEN + DO 35 K = 1,NE + I = IRN(K) + J = JCN(K) +C Lower triangle ... swap if necessary + IF (I.LT.J) THEN + IRN(K) = J + JCN(K) = I + IW(I) = IW(I) + 1 + ELSE + IW(J) = IW(J) + 1 + END IF + 35 CONTINUE + ELSE IF (PART.EQ.-1) THEN + DO 36 K = 1,NE + I = IRN(K) + J = JCN(K) +C Upper triangle ... swap if necessary + IF (I.GT.J) THEN + IRN(K) = J + JCN(K) = I + IW(I) = IW(I) + 1 + ELSE + IW(J) = IW(J) + 1 + END IF + 36 CONTINUE + END IF + END IF + +C KNE is now the number of nonzero entries in matrix. + +C Put into IP and IW the positions where each column +C would begin in a compressed collection with the columns +C in natural order. + + IP(1) = 1 + DO 37 J = 2,NC + 1 + IP(J) = IW(J-1) + IP(J-1) + IW(J-1) = IP(J-1) + 37 CONTINUE + +C Reorder the elements into column order. +C Fill in each column from the front, and as a new entry is placed +C in column K increase the pointer IW(K) by one. + + IF (LA.EQ.1) THEN +C Pattern only + DO 70 L = 1,NC + DO 60 K = IW(L),IP(L+1) - 1 + ICE = IRN(K) + JCE = JCN(K) + DO 40 J = 1,NE + IF (JCE.EQ.L) GO TO 50 + LOC = IW(JCE) + JCEP = JCN(LOC) + ICEP = IRN(LOC) + IW(JCE) = LOC + 1 + JCN(LOC) = JCE + IRN(LOC) = ICE + JCE = JCEP + ICE = ICEP + 40 CONTINUE + 50 JCN(K) = JCE + IRN(K) = ICE + 60 CONTINUE + 70 CONTINUE + ELSE + + DO 120 L = 1,NC + DO 110 K = IW(L),IP(L+1) - 1 + ICE = IRN(K) + JCE = JCN(K) + ACE = A(K) + DO 90 J = 1,NE + IF (JCE.EQ.L) GO TO 100 + LOC = IW(JCE) + JCEP = JCN(LOC) + ICEP = IRN(LOC) + IW(JCE) = LOC + 1 + JCN(LOC) = JCE + IRN(LOC) = ICE + JCE = JCEP + ICE = ICEP + ACEP = A(LOC) + A(LOC) = ACE + ACE = ACEP + 90 CONTINUE + 100 JCN(K) = JCE + IRN(K) = ICE + A(K) = ACE + 110 CONTINUE + 120 CONTINUE + END IF + + 130 CONTINUE + + RETURN + END +C +C********************************************************** + SUBROUTINE MC59CD(NC,NR,NE,IRN,JCN,LA,A,IP,IW) +C +C To sort a sparse matrix stored by rows, +C unordered within each row, to ordering by columns, with +C ordering by rows within each column. +C +C NC - integer variable. Intent(IN) +C - on entry must be set to the number of columns in the matrix +C NR - integer variable. Intent(IN) +C - on entry must be set to the number of rows in the matrix +C NE - integer variable. Intent(IN) +C - on entry, must be set to the number of nonzeros in the matrix +C IRN - integer array of length NE. Intent(OUT). +C - not set on entry. +C - on exit, IRN holds row indices with the row +C indices for column 1 preceding those for column 2 and so on, +C with ordering by rows within each column. +C JCN - integer array of length NE. Intent(INOUT) +C - on entry set to contain the column indices of the nonzeros +C with indices for column 1 preceding those for column 2 +C and so on, with the order within columns is arbitrary. +C - on exit, contents destroyed. +C LA - integer variable which defines the length of the array A. +C Intent(IN) +C A - real (double precision/complex/complex*16) array of length LA +C Intent(INOUT) +C - if LA > 1, the array must be of length NE, and A(K) +C must be set to the value of the entry in JCN(K); +C on exit A, A(K) holds the value of the entry in IRN(K). +C - if LA = 1, the array is not accessed +C IP - integer array of length NC+1. Intent(INOUT) +C - not set on entry +C - on exit, IP(J) contains the position in IRN (and A) of the +C first entry in column J (J=1,...,NC) +C - IP(NC+1) is set to NE+1 +C IW - integer array of length NR+1. Intent(IN) +C - on entry, must be set on entry so that IW(J) points to the +C position in JCN of the first entry in row J, J=1,...,NR, and +C IW(NR+1) must be set to NE+1 +C +C .. Scalar Arguments .. + INTEGER LA,NC,NE,NR +C .. +C .. Array Arguments .. + DOUBLE PRECISION A(LA) + INTEGER IP(NC+1),IRN(NE),IW(NR+1),JCN(NE) +C .. +C .. Local Scalars .. + DOUBLE PRECISION ACE,ACEP + INTEGER I,ICE,ICEP,J,J1,J2,K,L,LOC,LOCP +C .. +C .. Executable Statements .. + +C Count the number of entries in each column + + DO 10 J = 1,NC + IP(J) = 0 + 10 CONTINUE + + IF (LA.GT.1) THEN + + DO 20 K = 1,NE + I = JCN(K) + IP(I) = IP(I) + 1 + IRN(K) = JCN(K) + 20 CONTINUE + IP(NC+1) = NE + 1 + +C Set IP so that IP(I) points to the first entry in column I+1 + + IP(1) = IP(1) + 1 + DO 30 J = 2,NC + IP(J) = IP(J) + IP(J-1) + 30 CONTINUE + + DO 50 I = NR,1,-1 + J1 = IW(I) + J2 = IW(I+1) - 1 + DO 40 J = J1,J2 + K = IRN(J) + L = IP(K) - 1 + JCN(J) = L + IRN(J) = I + IP(K) = L + 40 CONTINUE + 50 CONTINUE + IP(NC+1) = NE + 1 + DO 70 J = 1,NE + LOC = JCN(J) + IF (LOC.EQ.0) GO TO 70 + ICE = IRN(J) + ACE = A(J) + JCN(J) = 0 + DO 60 K = 1,NE + LOCP = JCN(LOC) + ICEP = IRN(LOC) + ACEP = A(LOC) + JCN(LOC) = 0 + IRN(LOC) = ICE + A(LOC) = ACE + IF (LOCP.EQ.0) GO TO 70 + ICE = ICEP + ACE = ACEP + LOC = LOCP + 60 CONTINUE + 70 CONTINUE + ELSE + +C Pattern only + +C Count the number of entries in each column + + DO 90 K = 1,NE + I = JCN(K) + IP(I) = IP(I) + 1 + 90 CONTINUE + IP(NC+1) = NE + 1 + +C Set IP so that IP(I) points to the first entry in column I+1 + + IP(1) = IP(1) + 1 + DO 100 J = 2,NC + IP(J) = IP(J) + IP(J-1) + 100 CONTINUE + + DO 120 I = NR,1,-1 + J1 = IW(I) + J2 = IW(I+1) - 1 + DO 110 J = J1,J2 + K = JCN(J) + L = IP(K) - 1 + IRN(L) = I + IP(K) = L + 110 CONTINUE + 120 CONTINUE + + END IF + + RETURN + END + +C********************************************************** + + SUBROUTINE MC59DD(NC,NE,IRN,IP,LA,A) +C +C To sort from arbitrary order within each column to order +C by increasing row index. Note: this is taken from MC20B/BD. +C +C NC - integer variable. Intent(IN) +C - on entry must be set to the number of columns in the matrix +C NE - integer variable. Intent(IN) +C - on entry, must be set to the number of nonzeros in the matrix +C IRN - integer array of length NE. Intent(INOUT) +C - on entry set to contain the row indices of the nonzeros +C ordered so that the row +C indices for column 1 precede those for column 2 and so on, +C but the order within columns is arbitrary. +C On exit, the order within each column is by increasing +C row indices. +C LA - integer variable which defines the length of the array A. +C Intent(IN) +C A - real (double precision/complex/complex*16) array of length LA +C Intent(INOUT) +C - if LA > 1, the array must be of length NE, and A(K) +C must be set to the value of the entry in IRN(K); +C on exit A is reordered in the same way as IRN +C - if LA = 1, the array is not accessed +C IP - integer array of length NC. Intent(IN) +C - on entry, IP(J) contains the position in IRN (and A) of the +C first entry in column J (J=1,...,NC) +C . . +C .. Scalar Arguments .. + INTEGER LA,NC,NE +C .. +C .. Array Arguments .. + DOUBLE PRECISION A(LA) + INTEGER IRN(NE),IP(NC) +C .. +C .. Local Scalars .. + DOUBLE PRECISION ACE + INTEGER ICE,IK,J,JJ,K,KDUMMY,KLO,KMAX,KOR +C .. +C .. Intrinsic Functions .. + INTRINSIC ABS +C .. +C .. Executable Statements .. + +C Jump if pattern only. + IF (LA.GT.1) THEN + KMAX = NE + DO 50 JJ = 1,NC + J = NC + 1 - JJ + KLO = IP(J) + 1 + IF (KLO.GT.KMAX) GO TO 40 + KOR = KMAX + DO 30 KDUMMY = KLO,KMAX +C Items KOR, KOR+1, .... ,KMAX are in order + ACE = A(KOR-1) + ICE = IRN(KOR-1) + DO 10 K = KOR,KMAX + IK = IRN(K) + IF (ABS(ICE).LE.ABS(IK)) GO TO 20 + IRN(K-1) = IK + A(K-1) = A(K) + 10 CONTINUE + K = KMAX + 1 + 20 IRN(K-1) = ICE + A(K-1) = ACE + KOR = KOR - 1 + 30 CONTINUE +C Next column + 40 KMAX = KLO - 2 + 50 CONTINUE + ELSE + +C Pattern only. + KMAX = NE + DO 150 JJ = 1,NC + J = NC + 1 - JJ + KLO = IP(J) + 1 + IF (KLO.GT.KMAX) GO TO 140 + KOR = KMAX + DO 130 KDUMMY = KLO,KMAX +C Items KOR, KOR+1, .... ,KMAX are in order + ICE = IRN(KOR-1) + DO 110 K = KOR,KMAX + IK = IRN(K) + IF (ABS(ICE).LE.ABS(IK)) GO TO 120 + IRN(K-1) = IK + 110 CONTINUE + K = KMAX + 1 + 120 IRN(K-1) = ICE + KOR = KOR - 1 + 130 CONTINUE +C Next column + 140 KMAX = KLO - 2 + 150 CONTINUE + END IF + END +C*********************************************************************** + + SUBROUTINE MC59ED(NC,NR,NE,IRN,LIP,IP,LA,A,IW,IDUP,KNE,ICNTL6) + +C Checks IRN for duplicate entries. +C On exit, IDUP holds number of duplicates found and KNE is number +C of entries in matrix after removal of duplicates +C . . +C .. Scalar Arguments .. + INTEGER ICNTL6,IDUP,KNE,LIP,LA,NC,NR,NE +C .. +C .. Array Arguments .. + DOUBLE PRECISION A(LA) + INTEGER IRN(NE),IP(LIP),IW(NR) +C .. +C .. Local Scalars .. + INTEGER I,J,K,KSTART,KSTOP,NZJ + + IDUP = 0 + KNE = 0 +C Initialise IW + DO 10 I = 1,NR + IW(I) = 0 + 10 CONTINUE + + KSTART = IP(1) + IF (LA.GT.1) THEN +C Matrix entries considered + NZJ = 0 + DO 30 J = 1,NC + KSTOP = IP(J+1) + IP(J+1) = IP(J) + DO 20 K = KSTART,KSTOP - 1 + I = IRN(K) + IF (IW(I).LE.NZJ) THEN + KNE = KNE + 1 + IRN(KNE) = I + A(KNE) = A(K) + IP(J+1) = IP(J+1) + 1 + IW(I) = KNE + ELSE +C We have a duplicate in column J + IDUP = IDUP + 1 +C If requested, sum duplicates + IF (ICNTL6.GE.0) A(IW(I)) = A(IW(I)) + A(K) + END IF + 20 CONTINUE + KSTART = KSTOP + NZJ = KNE + 30 CONTINUE + + ELSE + +C Pattern only + DO 50 J = 1,NC + KSTOP = IP(J+1) + IP(J+1) = IP(J) + DO 40 K = KSTART,KSTOP - 1 + I = IRN(K) + IF (IW(I).LT.J) THEN + KNE = KNE + 1 + IRN(KNE) = I + IP(J+1) = IP(J+1) + 1 + IW(I) = J + ELSE +C We have a duplicate in column J + IDUP = IDUP + 1 + END IF + 40 CONTINUE + KSTART = KSTOP + 50 CONTINUE + END IF + + RETURN + END +C*********************************************************************** + + SUBROUTINE MC59FD(NC,NR,NE,IRN,LIP,IP,LA,A,LIW,IW,IDUP,IOUT, + + IUP,KNE,ICNTL6,INFO) + +C Checks IRN for duplicate and out-of-range entries. +C For symmetric matrix, also checks NO entries lie in upper triangle. +C Also checks IP is monotonic. +C On exit: +C IDUP holds number of duplicates found +C IOUT holds number of out-of-range entries +C For symmetric matrix, IUP holds number of entries in upper +C triangular part. +C KNE holds number of entries in matrix after removal of +C out-of-range and duplicate entries. +C Note: this is similar to MC59ED except it also checks IP is +C monotonic and removes out-of-range entries in IRN. +C . . +C .. Scalar Arguments .. + INTEGER ICNTL6,IDUP,IOUT,IUP,KNE,LA,LIP,LIW,NC,NR,NE +C .. +C .. Array Arguments .. + DOUBLE PRECISION A(LA) + INTEGER IRN(NE),IP(LIP),IW(LIW),INFO(2) +C .. +C .. Local Scalars .. + INTEGER I,J,K,KSTART,KSTOP,NZJ,LOWER + + IDUP = 0 + IOUT = 0 + IUP = 0 + KNE = 0 +C Initialise IW + DO 10 I = 1,NR + IW(I) = 0 + 10 CONTINUE + + KSTART = IP(1) + LOWER = 1 + IF (LA.GT.1) THEN + NZJ = 0 + DO 30 J = 1,NC +C In symmetric case, entries out-of-range if they lie +C in upper triangular part. + IF (ICNTL6.NE.0) LOWER = J + KSTOP = IP(J+1) + IF (KSTART.GT.KSTOP) THEN + INFO(1) = -9 + INFO(2) = J + RETURN + END IF + IP(J+1) = IP(J) + DO 20 K = KSTART,KSTOP - 1 + I = IRN(K) +C Check for out-of-range + IF (I.GT.NR .OR. I.LT.LOWER) THEN + IOUT = IOUT + 1 +C In symmetric case, check if entry is out-of-range because +C it lies in upper triangular part. + IF (ICNTL6.NE.0 .AND. I.LT.J) IUP = IUP + 1 + ELSE IF (IW(I).LE.NZJ) THEN + KNE = KNE + 1 + IRN(KNE) = I + A(KNE) = A(K) + IP(J+1) = IP(J+1) + 1 + IW(I) = KNE + ELSE +C We have a duplicate in column J + IDUP = IDUP + 1 +C If requested, sum duplicates + IF (ICNTL6.GE.0) A(IW(I)) = A(IW(I)) + A(K) + END IF + 20 CONTINUE + KSTART = KSTOP + NZJ = KNE + 30 CONTINUE + + ELSE + +C Pattern only + DO 50 J = 1,NC +C In symmetric case, entries out-of-range if lie +C in upper triangular part. + IF (ICNTL6.NE.0) LOWER = J + KSTOP = IP(J+1) + IF (KSTART.GT.KSTOP) THEN + INFO(1) = -9 + INFO(2) = J + RETURN + END IF + IP(J+1) = IP(J) + DO 40 K = KSTART,KSTOP - 1 + I = IRN(K) +C Check for out-of-range + IF (I.GT.NR .OR. I.LT.LOWER) THEN + IOUT = IOUT + 1 + IF (ICNTL6.NE.0 .AND. I.GT.1) IUP = IUP + 1 + ELSE IF (IW(I).LT.J) THEN + KNE = KNE + 1 + IRN(KNE) = I + IP(J+1) = IP(J+1) + 1 + IW(I) = J + ELSE +C We have a duplicate in column J + IDUP = IDUP + 1 + END IF + 40 CONTINUE + KSTART = KSTOP + 50 CONTINUE + END IF + + RETURN + END + +! COPYRIGHT (c) 1999 Council for the Central Laboratory +! of the Research Councils +! Original date July 1999 +! AUTHORS Iain Duff (i.duff@rl.ac.uk) and +! Jacko Koster (jacko.koster@uninett.no) +! +! Version 1.6.0 +! See ChangeLog for version history. +! + SUBROUTINE MC64ID(ICNTL) + IMPLICIT NONE + +C Purpose +C ======= +C +C The components of the array ICNTL control the action of MC64A/AD. +C Default values for these are set in this subroutine. +C +C Parameters +C ========== +C + INTEGER ICNTL(10) +C +C Local variables + INTEGER I +C +C ICNTL(1) has default value 6. +C It is the output stream for error messages. If it +C is negative, these messages will be suppressed. +C +C ICNTL(2) has default value 6. +C It is the output stream for warning messages. +C If it is negative, these messages are suppressed. +C +C ICNTL(3) has default value -1. +C It is the output stream for monitoring printing. +C If it is negative, these messages are suppressed. +C +C ICNTL(4) has default value 0. +C If left at the defaut value, the incoming data is checked for +C out-of-range indices and duplicates. Setting ICNTL(4) to any +C other will avoid the checks but is likely to cause problems +C later if out-of-range indices or duplicates are present. +C The user should only set ICNTL(4) non-zero, if the data is +C known to avoid these problems. +C +C ICNTL(5) to ICNTL(10) are not used by MC64A/AD but are set to +C zero in this routine. + +C Initialization of the ICNTL array. + ICNTL(1) = 6 + ICNTL(2) = 6 + ICNTL(3) = -1 + DO 10 I = 4,10 + ICNTL(I) = 0 + 10 CONTINUE + + RETURN + END + +C********************************************************************** + SUBROUTINE MC64AD(JOB,N,NE,IP,IRN,A,NUM,CPERM,LIW,IW,LDW,DW, + & ICNTL,INFO) + IMPLICIT NONE +C +C *** Copyright (c) 1999 Council for the Central Laboratory of the +C Research Councils *** +C *** Although every effort has been made to ensure robustness and *** +C *** reliability of the subroutines in this MC64 suite, we *** +C *** disclaim any liability arising through the use or misuse of *** +C *** any of the subroutines. *** +C *** Any problems? Contact ... *** +C Iain Duff (I.Duff@rl.ac.uk) or *** +C Jacko Koster (jacko.koster@uninett.no) *** +C +C Purpose +C ======= +C +C This subroutine attempts to find a column permutation for an NxN +C sparse matrix A = {a_ij} that makes the permuted matrix have N +C entries on its diagonal. +C If the matrix is structurally nonsingular, the subroutine optionally +C returns a column permutation that maximizes the smallest element +C on the diagonal, maximizes the sum of the diagonal entries, or +C maximizes the product of the diagonal entries of the permuted matrix. +C For the latter option, the subroutine also finds scaling factors +C that may be used to scale the matrix so that the nonzero diagonal +C entries of the permuted matrix are one in absolute value and all the +C off-diagonal entries are less than or equal to one in absolute value. +C The natural logarithms of the scaling factors u(i), i=1..N, for the +C rows and v(j), j=1..N, for the columns are returned so that the +C scaled matrix B = {b_ij} has entries b_ij = a_ij * EXP(u_i + v_j). +C +C Parameters +C ========== +C + INTEGER JOB,N,NE,NUM,LIW,LDW + INTEGER IP(N+1),IRN(NE),CPERM(N),IW(LIW),ICNTL(10),INFO(10) + DOUBLE PRECISION A(NE),DW(LDW) +C +C JOB is an INTEGER variable which must be set by the user to +C control the action. It is not altered by the subroutine. +C Possible values for JOB are: +C 1 Compute a column permutation of the matrix so that the +C permuted matrix has as many entries on its diagonal as possible. +C The values on the diagonal are of arbitrary size. HSL subroutine +C MC21A/AD is used for this. See [1]. +C 2 Compute a column permutation of the matrix so that the smallest +C value on the diagonal of the permuted matrix is maximized. +C See [3]. +C 3 Compute a column permutation of the matrix so that the smallest +C value on the diagonal of the permuted matrix is maximized. +C The algorithm differs from the one used for JOB = 2 and may +C have quite a different performance. See [2]. +C 4 Compute a column permutation of the matrix so that the sum +C of the diagonal entries of the permuted matrix is maximized. +C See [3]. +C 5 Compute a column permutation of the matrix so that the product +C of the diagonal entries of the permuted matrix is maximized +C and vectors to scale the matrix so that the nonzero diagonal +C entries of the permuted matrix are one in absolute value and +C all the off-diagonal entries are less than or equal to one in +C absolute value. See [3]. +C Restriction: 1 <= JOB <= 5. +C +C N is an INTEGER variable which must be set by the user to the +C order of the matrix A. It is not altered by the subroutine. +C Restriction: N >= 1. +C +C NE is an INTEGER variable which must be set by the user to the +C number of entries in the matrix. It is not altered by the +C subroutine. +C Restriction: NE >= 1. +C +C IP is an INTEGER array of length N+1. +C IP(J), J=1..N, must be set by the user to the position in array IRN +C of the first row index of an entry in column J. IP(N+1) must be set +C to NE+1. It is not altered by the subroutine. +C +C IRN is an INTEGER array of length NE. +C IRN(K), K=1..NE, must be set by the user to hold the row indices of +C the entries of the matrix. Those belonging to column J must be +C stored contiguously in the positions IP(J)..IP(J+1)-1. The ordering +C of the row indices within each column is unimportant. Repeated +C entries are not allowed. The array IRN is not altered by the +C subroutine. +C +C A is a DOUBLE PRECISION array of length NE. +C The user must set A(K), K=1..NE, to the numerical value of the +C entry that corresponds to IRN(K). +C It is not used by the subroutine when JOB = 1. +C It is not altered by the subroutine. +C +C NUM is an INTEGER variable that need not be set by the user. +C On successful exit, NUM will be the number of entries on the +C diagonal of the permuted matrix. +C If NUM < N, the matrix is structurally singular. +C +C CPERM is an INTEGER array of length N that need not be set by the +C user. On successful exit, CPERM contains the column permutation. +C Column ABS(CPERM(J)) of the original matrix is column J in the +C permuted matrix, J=1..N. For the N-NUM entries of CPERM that are +C not matched the permutation array is set negative so that a full +C permutation of the matrix is obtained even in the structurally +C singular case. +C +C LIW is an INTEGER variable that must be set by the user to +C the dimension of array IW. It is not altered by the subroutine. +C Restriction: +C JOB = 1 : LIW >= 5N +C JOB = 2 : LIW >= 4N +C JOB = 3 : LIW >= 10N + NE +C JOB = 4 : LIW >= 5N +C JOB = 5 : LIW >= 5N +C +C IW is an INTEGER array of length LIW that is used for workspace. +C +C LDW is an INTEGER variable that must be set by the user to the +C dimension of array DW. It is not altered by the subroutine. +C Restriction: +C JOB = 1 : LDW is not used +C JOB = 2 : LDW >= N +C JOB = 3 : LDW >= NE +C JOB = 4 : LDW >= 2N + NE +C JOB = 5 : LDW >= 3N + NE +C +C DW is a DOUBLE PRECISION array of length LDW +C that is used for workspace. If JOB = 5, on return, +C DW(i) contains u_i, i=1..N, and DW(N+j) contains v_j, j=1..N. +C +C ICNTL is an INTEGER array of length 10. Its components control the +C output of MC64A/AD and must be set by the user before calling +C MC64A/AD. They are not altered by the subroutine. +C +C ICNTL(1) must be set to specify the output stream for +C error messages. If ICNTL(1) < 0, messages are suppressed. +C The default value set by MC46I/ID is 6. +C +C ICNTL(2) must be set by the user to specify the output stream for +C warning messages. If ICNTL(2) < 0, messages are suppressed. +C The default value set by MC46I/ID is 6. +C +C ICNTL(3) must be set by the user to specify the output stream for +C diagnostic messages. If ICNTL(3) < 0, messages are suppressed. +C The default value set by MC46I/ID is -1. +C +C ICNTL(4) must be set by the user to a value other than 0 to avoid +C checking of the input data. +C The default value set by MC46I/ID is 0. +C +C INFO is an INTEGER array of length 10 which need not be set by the +C user. INFO(1) is set non-negative to indicate success. A negative +C value is returned if an error occurred, a positive value if a +C warning occurred. INFO(2) holds further information on the error. +C On exit from the subroutine, INFO(1) will take one of the +C following values: +C 0 : successful entry (for structurally nonsingular matrix). +C +1 : successful entry (for structurally singular matrix). +C +2 : the returned scaling factors are large and may cause +C overflow when used to scale the matrix. +C (For JOB = 5 entry only.) +C -1 : JOB < 1 or JOB > 5. Value of JOB held in INFO(2). +C -2 : N < 1. Value of N held in INFO(2). +C -3 : NE < 1. Value of NE held in INFO(2). +C -4 : the defined length LIW violates the restriction on LIW. +C Value of LIW required given by INFO(2). +C -5 : the defined length LDW violates the restriction on LDW. +C Value of LDW required given by INFO(2). +C -6 : entries are found whose row indices are out of range. INFO(2) +C contains the index of a column in which such an entry is found. +C -7 : repeated entries are found. INFO(2) contains the index of a +C column in which such entries are found. +C INFO(3) to INFO(10) are not currently used and are set to zero by +C the routine. +C +C References: +C [1] I. S. Duff, (1981), +C "Algorithm 575. Permutations for a zero-free diagonal", +C ACM Trans. Math. Software 7(3), 387-390. +C [2] I. S. Duff and J. Koster, (1998), +C "The design and use of algorithms for permuting large +C entries to the diagonal of sparse matrices", +C SIAM J. Matrix Anal. Appl., vol. 20, no. 4, pp. 889-901. +C [3] I. S. Duff and J. Koster, (1999), +C "On algorithms for permuting large entries to the diagonal +C of sparse matrices", +C Technical Report RAL-TR-1999-030, RAL, Oxfordshire, England. + +C Local variables and parameters + INTEGER I,J,K + DOUBLE PRECISION FACT,ZERO,RINF + PARAMETER (ZERO=0.0D+00) +C External routines and functions + EXTERNAL MC21AD,MC64BD,MC64RD,MC64SD,MC64WD +C Intrinsic functions + INTRINSIC ABS,LOG + +C Set RINF to largest positive real number (infinity) + RINF = HUGE(RINF) + +C Check value of JOB + IF (JOB.LT.1 .OR. JOB.GT.5) THEN + INFO(1) = -1 + INFO(2) = JOB + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9001) INFO(1),'JOB',JOB + GO TO 99 + ENDIF +C Check value of N + IF (N.LT.1) THEN + INFO(1) = -2 + INFO(2) = N + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9001) INFO(1),'N',N + GO TO 99 + ENDIF +C Check value of NE + IF (NE.LT.1) THEN + INFO(1) = -3 + INFO(2) = NE + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9001) INFO(1),'NE',NE + GO TO 99 + ENDIF +C Check LIW + IF (JOB.EQ.1) K = 5*N + IF (JOB.EQ.2) K = 4*N + IF (JOB.EQ.3) K = 10*N + NE + IF (JOB.EQ.4) K = 5*N + IF (JOB.EQ.5) K = 5*N + IF (LIW.LT.K) THEN + INFO(1) = -4 + INFO(2) = K + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9004) INFO(1),K + GO TO 99 + ENDIF +C Check LDW +C If JOB = 1, do not check + IF (JOB.GT.1) THEN + IF (JOB.EQ.2) K = N + IF (JOB.EQ.3) K = NE + IF (JOB.EQ.4) K = 2*N + NE + IF (JOB.EQ.5) K = 3*N + NE + IF (LDW.LT.K) THEN + INFO(1) = -5 + INFO(2) = K + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9005) INFO(1),K + GO TO 99 + ENDIF + ENDIF + IF (ICNTL(4).EQ.0) THEN +C Check row indices. Use IW(1:N) as workspace + DO 3 I = 1,N + IW(I) = 0 + 3 CONTINUE + DO 6 J = 1,N + DO 4 K = IP(J),IP(J+1)-1 + I = IRN(K) +C Check for row indices that are out of range + IF (I.LT.1 .OR. I.GT.N) THEN + INFO(1) = -6 + INFO(2) = J + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9006) INFO(1),J,I + GO TO 99 + ENDIF +C Check for repeated row indices within a column + IF (IW(I).EQ.J) THEN + INFO(1) = -7 + INFO(2) = J + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9007) INFO(1),J,I + GO TO 99 + ELSE + IW(I) = J + ENDIF + 4 CONTINUE + 6 CONTINUE + ENDIF + +C Print diagnostics on input + IF (ICNTL(3).GE.0) THEN + WRITE(ICNTL(3),9020) JOB,N,NE + WRITE(ICNTL(3),9021) (IP(J),J=1,N+1) + WRITE(ICNTL(3),9022) (IRN(J),J=1,NE) + IF (JOB.GT.1) WRITE(ICNTL(3),9023) (A(J),J=1,NE) + ENDIF + +C Set components of INFO to zero + DO 8 I=1,10 + INFO(I) = 0 + 8 CONTINUE + +C Compute maximum matching with MC21A/AD + IF (JOB.EQ.1) THEN +C Put length of column J in IW(J) + DO 10 J = 1,N + IW(J) = IP(J+1) - IP(J) + 10 CONTINUE +C IW(N+1:5N) is workspace + CALL MC21AD(N,IRN,NE,IP,IW(1),CPERM,NUM,IW(N+1)) + GO TO 90 + ENDIF + +C Compute bottleneck matching + IF (JOB.EQ.2) THEN +C IW(1:5N), DW(1:N) are workspaces + CALL MC64BD(N,NE,IP,IRN,A,CPERM,NUM, + & IW(1),IW(N+1),IW(2*N+1),IW(3*N+1),DW) + GO TO 90 + ENDIF + +C Compute bottleneck matching + IF (JOB.EQ.3) THEN +C Copy IRN(K) into IW(K), ABS(A(K)) into DW(K), K=1..NE + DO 20 K = 1,NE + IW(K) = IRN(K) + DW(K) = ABS(A(K)) + 20 CONTINUE +C Sort entries in each column by decreasing value. + CALL MC64RD(N,NE,IP,IW,DW) +C IW(NE+1:NE+10N) is workspace + CALL MC64SD(N,NE,IP,IW(1),DW,CPERM,NUM,IW(NE+1), + & IW(NE+N+1),IW(NE+2*N+1),IW(NE+3*N+1),IW(NE+4*N+1), + & IW(NE+5*N+1),IW(NE+6*N+1)) + GO TO 90 + ENDIF + + IF (JOB.EQ.4) THEN + DO 50 J = 1,N + FACT = ZERO + DO 30 K = IP(J),IP(J+1)-1 + IF (ABS(A(K)).GT.FACT) FACT = ABS(A(K)) + 30 CONTINUE + DO 40 K = IP(J),IP(J+1)-1 + DW(2*N+K) = FACT - ABS(A(K)) + 40 CONTINUE + 50 CONTINUE +C B = DW(2N+1:2N+NE); IW(1:5N) and DW(1:2N) are workspaces + CALL MC64WD(N,NE,IP,IRN,DW(2*N+1),CPERM,NUM, + & IW(1),IW(N+1),IW(2*N+1),IW(3*N+1),IW(4*N+1), + & DW(1),DW(N+1)) + GO TO 90 + ENDIF + + IF (JOB.EQ.5) THEN + DO 75 J = 1,N + FACT = ZERO + DO 60 K = IP(J),IP(J+1)-1 + DW(3*N+K) = ABS(A(K)) + IF (DW(3*N+K).GT.FACT) FACT = DW(3*N+K) + 60 CONTINUE + DW(2*N+J) = FACT + IF (FACT.NE.ZERO) THEN + FACT = LOG(FACT) + ELSE + FACT = RINF/N + ENDIF + DO 70 K = IP(J),IP(J+1)-1 + IF (DW(3*N+K).NE.ZERO) THEN + DW(3*N+K) = FACT - LOG(DW(3*N+K)) + ELSE + DW(3*N+K) = RINF/N + ENDIF + 70 CONTINUE + 75 CONTINUE +C B = DW(3N+1:3N+NE); IW(1:5N) and DW(1:2N) are workspaces + CALL MC64WD(N,NE,IP,IRN,DW(3*N+1),CPERM,NUM, + & IW(1),IW(N+1),IW(2*N+1),IW(3*N+1),IW(4*N+1), + & DW(1),DW(N+1)) + IF (NUM.EQ.N) THEN + DO 80 J = 1,N + IF (DW(2*N+J).NE.ZERO) THEN + DW(N+J) = DW(N+J) - LOG(DW(2*N+J)) + ELSE + DW(N+J) = ZERO + ENDIF + 80 CONTINUE + ENDIF +C Check size of scaling factors + FACT = 0.5*LOG(RINF) + DO 86 J = 1,N + IF (DW(J).LT.FACT .AND. DW(N+J).LT.FACT) GO TO 86 + INFO(1) = 2 + GO TO 90 + 86 CONTINUE +C GO TO 90 + ENDIF + + 90 IF (INFO(1).EQ.0 .AND. NUM.LT.N) THEN +C Matrix is structurally singular, return with warning + INFO(1) = 1 + IF (ICNTL(2).GE.0) WRITE(ICNTL(2),9011) INFO(1) + ENDIF + IF (INFO(1).EQ.2) THEN +C Scaling factors are large, return with warning + IF (ICNTL(2).GE.0) WRITE(ICNTL(2),9012) INFO(1) + ENDIF + +C Print diagnostics on output + IF (ICNTL(3).GE.0) THEN + WRITE(ICNTL(3),9030) (INFO(J),J=1,2) + WRITE(ICNTL(3),9031) NUM + WRITE(ICNTL(3),9032) (CPERM(J),J=1,N) + IF (JOB.EQ.5) THEN + WRITE(ICNTL(3),9033) (DW(J),J=1,N) + WRITE(ICNTL(3),9034) (DW(N+J),J=1,N) + ENDIF + ENDIF + +C Return from subroutine. + 99 RETURN + + 9001 FORMAT (' ****** Error in MC64A/AD. INFO(1) = ',I2, + & ' because ',(A),' = ',I10) + 9004 FORMAT (' ****** Error in MC64A/AD. INFO(1) = ',I2/ + & ' LIW too small, must be at least ',I8) + 9005 FORMAT (' ****** Error in MC64A/AD. INFO(1) = ',I2/ + & ' LDW too small, must be at least ',I8) + 9006 FORMAT (' ****** Error in MC64A/AD. INFO(1) = ',I2/ + & ' Column ',I8, + & ' contains an entry with invalid row index ',I8) + 9007 FORMAT (' ****** Error in MC64A/AD. INFO(1) = ',I2/ + & ' Column ',I8, + & ' contains two or more entries with row index ',I8) + 9011 FORMAT (' ****** Warning from MC64A/AD. INFO(1) = ',I2/ + & ' The matrix is structurally singular.') + 9012 FORMAT (' ****** Warning from MC64A/AD. INFO(1) = ',I2/ + & ' Some scaling factors may be too large.') + 9020 FORMAT (' ****** Input parameters for MC64A/AD:'/ + & ' JOB = ',I8/' N = ',I8/' NE = ',I8) + 9021 FORMAT (' IP(1:N+1) = ',8I8/(14X,8I8)) + 9022 FORMAT (' IRN(1:NE) = ',8I8/(14X,8I8)) + 9023 FORMAT (' A(1:NE) = ',4(1PD14.4)/(14X,4(1PD14.4))) + 9030 FORMAT (' ****** Output parameters for MC64A/AD:'/ + & ' INFO(1:2) = ',2I8) + 9031 FORMAT (' NUM = ',I8) + 9032 FORMAT (' CPERM(1:N) = ',8I8/(14X,8I8)) + 9033 FORMAT (' DW(1:N) = ',5(F11.3)/(14X,5(F11.3))) + 9034 FORMAT (' DW(N+1:2N) = ',5(F11.3)/(14X,5(F11.3))) + END + +C********************************************************************** + SUBROUTINE MC64BD(N,NE,IP,IRN,A,IPERM,NUM,JPERM,PR,Q,L,D) + IMPLICIT NONE +C +C *** Copyright (c) 1999 Council for the Central Laboratory of the +C Research Councils *** +C *** Although every effort has been made to ensure robustness and *** +C *** reliability of the subroutines in this MC64 suite, we *** +C *** disclaim any liability arising through the use or misuse of *** +C *** any of the subroutines. *** +C *** Any problems? Contact ... *** +C Iain Duff (I.Duff@rl.ac.uk) or *** +C Jacko Koster (jacko.koster@uninett.no) *** +C + INTEGER N,NE,NUM + INTEGER IP(N+1),IRN(NE),IPERM(N),JPERM(N),PR(N),Q(N),L(N) + DOUBLE PRECISION A(NE),D(N) + +C N, NE, IP, IRN are described in MC64A/AD. +C A is a DOUBLE PRECISION array of length +C NE. A(K), K=1..NE, must be set to the value of the entry +C that corresponds to IRN(K). It is not altered. +C IPERM is an INTEGER array of length N. On exit, it contains the +C matching: IPERM(I) = 0 or row I is matched to column IPERM(I). +C NUM is INTEGER variable. On exit, it contains the cardinality of the +C matching stored in IPERM. +C IW is an INTEGER work array of length 4N. +C DW is a DOUBLE PRECISION array of length N. + +C Local variables + INTEGER I,II,J,JJ,JORD,Q0,QLEN,IDUM,JDUM,ISP,JSP, + & K,KK,KK1,KK2,I0,UP,LOW,LPOS + DOUBLE PRECISION CSP,DI,DNEW,DQ0,AI,A0,BV +C Local parameters + DOUBLE PRECISION RINF,ZERO,MINONE + PARAMETER (ZERO=0.0D+0,MINONE=-1.0D+0) +C Intrinsic functions + INTRINSIC ABS,MIN +C External subroutines and/or functions + EXTERNAL MC64DD,MC64ED,MC64FD + + +C Set RINF to largest positive real number + RINF = HUGE(RINF) + +C Initialization + NUM = 0 + BV = RINF + DO 10 K = 1,N + IPERM(K) = 0 + JPERM(K) = 0 + PR(K) = IP(K) + D(K) = ZERO + 10 CONTINUE +C Scan columns of matrix; + DO 20 J = 1,N + A0 = MINONE + DO 30 K = IP(J),IP(J+1)-1 + I = IRN(K) + AI = ABS(A(K)) + IF (AI.GT.D(I)) D(I) = AI + IF (JPERM(J).NE.0) GO TO 30 + IF (AI.GE.BV) THEN + A0 = BV + IF (IPERM(I).NE.0) GO TO 30 + JPERM(J) = I + IPERM(I) = J + NUM = NUM + 1 + ELSE + IF (AI.LE.A0) GO TO 30 + A0 = AI + I0 = I + ENDIF + 30 CONTINUE + IF (A0.NE.MINONE .AND. A0.LT.BV) THEN + BV = A0 + IF (IPERM(I0).NE.0) GO TO 20 + IPERM(I0) = J + JPERM(J) = I0 + NUM = NUM + 1 + ENDIF + 20 CONTINUE +C Update BV with smallest of all the largest maximum absolute values +C of the rows. + DO 25 I = 1,N + BV = MIN(BV,D(I)) + 25 CONTINUE + IF (NUM.EQ.N) GO TO 1000 +C Rescan unassigned columns; improve initial assignment + DO 95 J = 1,N + IF (JPERM(J).NE.0) GO TO 95 + DO 50 K = IP(J),IP(J+1)-1 + I = IRN(K) + AI = ABS(A(K)) + IF (AI.LT.BV) GO TO 50 + IF (IPERM(I).EQ.0) GO TO 90 + JJ = IPERM(I) + KK1 = PR(JJ) + KK2 = IP(JJ+1) - 1 + IF (KK1.GT.KK2) GO TO 50 + DO 70 KK = KK1,KK2 + II = IRN(KK) + IF (IPERM(II).NE.0) GO TO 70 + IF (ABS(A(KK)).GE.BV) GO TO 80 + 70 CONTINUE + PR(JJ) = KK2 + 1 + 50 CONTINUE + GO TO 95 + 80 JPERM(JJ) = II + IPERM(II) = JJ + PR(JJ) = KK + 1 + 90 NUM = NUM + 1 + JPERM(J) = I + IPERM(I) = J + PR(J) = K + 1 + 95 CONTINUE + IF (NUM.EQ.N) GO TO 1000 + +C Prepare for main loop + DO 99 I = 1,N + D(I) = MINONE + L(I) = 0 + 99 CONTINUE + +C Main loop ... each pass round this loop is similar to Dijkstra's +C algorithm for solving the single source shortest path problem + + DO 100 JORD = 1,N + + IF (JPERM(JORD).NE.0) GO TO 100 + QLEN = 0 + LOW = N + 1 + UP = N + 1 +C CSP is cost of shortest path to any unassigned row +C ISP is matrix position of unassigned row element in shortest path +C JSP is column index of unassigned row element in shortest path + CSP = MINONE +C Build shortest path tree starting from unassigned column JORD + J = JORD + PR(J) = -1 + +C Scan column J + DO 115 K = IP(J),IP(J+1)-1 + I = IRN(K) + DNEW = ABS(A(K)) + IF (CSP.GE.DNEW) GO TO 115 + IF (IPERM(I).EQ.0) THEN +C Row I is unassigned; update shortest path info + CSP = DNEW + ISP = I + JSP = J + IF (CSP.GE.BV) GO TO 160 + ELSE + D(I) = DNEW + IF (DNEW.GE.BV) THEN +C Add row I to Q2 + LOW = LOW - 1 + Q(LOW) = I + ELSE +C Add row I to Q, and push it + QLEN = QLEN + 1 + L(I) = QLEN + CALL MC64DD(I,N,Q,D,L,1) + ENDIF + JJ = IPERM(I) + PR(JJ) = J + ENDIF + 115 CONTINUE + + DO 150 JDUM = 1,NUM +C If Q2 is empty, extract new rows from Q + IF (LOW.EQ.UP) THEN + IF (QLEN.EQ.0) GO TO 160 + I = Q(1) + IF (CSP.GE.D(I)) GO TO 160 + BV = D(I) + DO 152 IDUM = 1,N + CALL MC64ED(QLEN,N,Q,D,L,1) + L(I) = 0 + LOW = LOW - 1 + Q(LOW) = I + IF (QLEN.EQ.0) GO TO 153 + I = Q(1) + IF (D(I).NE.BV) GO TO 153 + 152 CONTINUE +C End of dummy loop; this point is never reached + ENDIF +C Move row Q0 + 153 UP = UP - 1 + Q0 = Q(UP) + DQ0 = D(Q0) + L(Q0) = UP +C Scan column that matches with row Q0 + J = IPERM(Q0) + DO 155 K = IP(J),IP(J+1)-1 + I = IRN(K) +C Update D(I) + IF (L(I).GE.UP) GO TO 155 + DNEW = MIN(DQ0,ABS(A(K))) + IF (CSP.GE.DNEW) GO TO 155 + IF (IPERM(I).EQ.0) THEN +C Row I is unassigned; update shortest path info + CSP = DNEW + ISP = I + JSP = J + IF (CSP.GE.BV) GO TO 160 + ELSE + DI = D(I) + IF (DI.GE.BV .OR. DI.GE.DNEW) GO TO 155 + D(I) = DNEW + IF (DNEW.GE.BV) THEN +C Delete row I from Q (if necessary); add row I to Q2 + IF (DI.NE.MINONE) THEN + LPOS = L(I) + CALL MC64FD(LPOS,QLEN,N,Q,D,L,1) + ENDIF + L(I) = 0 + LOW = LOW - 1 + Q(LOW) = I + ELSE +C Add row I to Q (if necessary); push row I up Q + IF (DI.EQ.MINONE) THEN + QLEN = QLEN + 1 + L(I) = QLEN + ENDIF + CALL MC64DD(I,N,Q,D,L,1) + ENDIF +C Update tree + JJ = IPERM(I) + PR(JJ) = J + ENDIF + 155 CONTINUE + 150 CONTINUE + +C If CSP = MINONE, no augmenting path is found + 160 IF (CSP.EQ.MINONE) GO TO 190 +C Update bottleneck value + BV = MIN(BV,CSP) +C Find augmenting path by tracing backward in PR; update IPERM,JPERM + NUM = NUM + 1 + I = ISP + J = JSP + DO 170 JDUM = 1,NUM+1 + I0 = JPERM(J) + JPERM(J) = I + IPERM(I) = J + J = PR(J) + IF (J.EQ.-1) GO TO 190 + I = I0 + 170 CONTINUE +C End of dummy loop; this point is never reached + 190 DO 191 KK = UP,N + I = Q(KK) + D(I) = MINONE + L(I) = 0 + 191 CONTINUE + DO 192 KK = LOW,UP-1 + I = Q(KK) + D(I) = MINONE + 192 CONTINUE + DO 193 KK = 1,QLEN + I = Q(KK) + D(I) = MINONE + L(I) = 0 + 193 CONTINUE + + 100 CONTINUE +C End of main loop + +C BV is bottleneck value of final matching + IF (NUM.EQ.N) GO TO 1000 + +C Matrix is structurally singular, complete IPERM. +C JPERM, PR are work arrays + DO 300 J = 1,N + JPERM(J) = 0 + 300 CONTINUE + K = 0 + DO 310 I = 1,N + IF (IPERM(I).EQ.0) THEN + K = K + 1 + PR(K) = I + ELSE + J = IPERM(I) + JPERM(J) = I + ENDIF + 310 CONTINUE + K = 0 + DO 320 I = 1,N + IF (JPERM(I).NE.0) GO TO 320 + K = K + 1 + JDUM = PR(K) + IPERM(JDUM) = - I + 320 CONTINUE + + 1000 RETURN + END + +C********************************************************************** + SUBROUTINE MC64DD(I,N,Q,D,L,IWAY) + IMPLICIT NONE +C +C *** Copyright (c) 1999 Council for the Central Laboratory of the +C Research Councils *** +C *** Although every effort has been made to ensure robustness and *** +C *** reliability of the subroutines in this MC64 suite, we *** +C *** disclaim any liability arising through the use or misuse of *** +C *** any of the subroutines. *** +C *** Any problems? Contact ... *** +C Iain Duff (I.Duff@rl.ac.uk) or *** +C Jacko Koster (jacko.koster@uninett.no) *** +C + INTEGER I,N,IWAY + INTEGER Q(N),L(N) + DOUBLE PRECISION D(N) + +C Variables N,Q,D,L are described in MC64B/BD +C IF IWAY is equal to 1, then +C node I is pushed from its current position upwards +C IF IWAY is not equal to 1, then +C node I is pushed from its current position downwards + +C Local variables and parameters + INTEGER IDUM,K,POS,POSK,QK + PARAMETER (K=2) + DOUBLE PRECISION DI + + POS = L(I) + IF (POS.LE.1) GO TO 20 + DI = D(I) +C POS is index of current position of I in the tree + IF (IWAY.EQ.1) THEN + DO 10 IDUM = 1,N + POSK = POS/K + QK = Q(POSK) + IF (DI.LE.D(QK)) GO TO 20 + Q(POS) = QK + L(QK) = POS + POS = POSK + IF (POS.LE.1) GO TO 20 + 10 CONTINUE +C End of dummy loop; this point is never reached + ELSE + DO 15 IDUM = 1,N + POSK = POS/K + QK = Q(POSK) + IF (DI.GE.D(QK)) GO TO 20 + Q(POS) = QK + L(QK) = POS + POS = POSK + IF (POS.LE.1) GO TO 20 + 15 CONTINUE +C End of dummy loop; this point is never reached + ENDIF +C End of dummy if; this point is never reached + 20 Q(POS) = I + L(I) = POS + + RETURN + END + +C********************************************************************** + SUBROUTINE MC64ED(QLEN,N,Q,D,L,IWAY) + IMPLICIT NONE +C +C *** Copyright (c) 1999 Council for the Central Laboratory of the +C Research Councils *** +C *** Although every effort has been made to ensure robustness and *** +C *** reliability of the subroutines in this MC64 suite, we *** +C *** disclaim any liability arising through the use or misuse of *** +C *** any of the subroutines. *** +C *** Any problems? Contact ... *** +C Iain Duff (I.Duff@rl.ac.uk) or *** +C Jacko Koster (jacko.koster@uninett.no) *** +C + INTEGER QLEN,N,IWAY + INTEGER Q(N),L(N) + DOUBLE PRECISION D(N) + +C Variables QLEN,N,Q,D,L are described in MC64B/BD (IWAY = 1) or +C MC64W/WD (IWAY = 2) +C The root node is deleted from the binary heap. + +C Local variables and parameters + INTEGER I,IDUM,K,POS,POSK + PARAMETER (K=2) + DOUBLE PRECISION DK,DR,DI + +C Move last element to begin of Q + I = Q(QLEN) + DI = D(I) + QLEN = QLEN - 1 + POS = 1 + IF (IWAY.EQ.1) THEN + DO 10 IDUM = 1,N + POSK = K*POS + IF (POSK.GT.QLEN) GO TO 20 + DK = D(Q(POSK)) + IF (POSK.LT.QLEN) THEN + DR = D(Q(POSK+1)) + IF (DK.LT.DR) THEN + POSK = POSK + 1 + DK = DR + ENDIF + ENDIF + IF (DI.GE.DK) GO TO 20 +C Exchange old last element with larger priority child + Q(POS) = Q(POSK) + L(Q(POS)) = POS + POS = POSK + 10 CONTINUE +C End of dummy loop; this point is never reached + ELSE + DO 15 IDUM = 1,N + POSK = K*POS + IF (POSK.GT.QLEN) GO TO 20 + DK = D(Q(POSK)) + IF (POSK.LT.QLEN) THEN + DR = D(Q(POSK+1)) + IF (DK.GT.DR) THEN + POSK = POSK + 1 + DK = DR + ENDIF + ENDIF + IF (DI.LE.DK) GO TO 20 +C Exchange old last element with smaller child + Q(POS) = Q(POSK) + L(Q(POS)) = POS + POS = POSK + 15 CONTINUE +C End of dummy loop; this point is never reached + ENDIF +C End of dummy if; this point is never reached + 20 Q(POS) = I + L(I) = POS + + RETURN + END + +C********************************************************************** + SUBROUTINE MC64FD(POS0,QLEN,N,Q,D,L,IWAY) + IMPLICIT NONE +C +C *** Copyright (c) 1999 Council for the Central Laboratory of the +C Research Councils *** +C *** Although every effort has been made to ensure robustness and *** +C *** reliability of the subroutines in this MC64 suite, we *** +C *** disclaim any liability arising through the use or misuse of *** +C *** any of the subroutines. *** +C *** Any problems? Contact ... *** +C Iain Duff (I.Duff@rl.ac.uk) or *** +C Jacko Koster (jacko.koster@uninett.no) *** +C + INTEGER POS0,QLEN,N,IWAY + INTEGER Q(N),L(N) + DOUBLE PRECISION D(N) + +C Variables QLEN,N,Q,D,L are described in MC64B/BD (IWAY = 1) or +C MC64WD (IWAY = 2). +C Move last element in the heap + + INTEGER I,IDUM,K,POS,POSK,QK + PARAMETER (K=2) + DOUBLE PRECISION DK,DR,DI + +C Quick return, if possible + IF (QLEN.EQ.POS0) THEN + QLEN = QLEN - 1 + RETURN + ENDIF + +C Move last element from queue Q to position POS0 +C POS is current position of node I in the tree + I = Q(QLEN) + DI = D(I) + QLEN = QLEN - 1 + POS = POS0 + IF (IWAY.EQ.1) THEN + IF (POS.LE.1) GO TO 20 + DO 10 IDUM = 1,N + POSK = POS/K + QK = Q(POSK) + IF (DI.LE.D(QK)) GO TO 20 + Q(POS) = QK + L(QK) = POS + POS = POSK + IF (POS.LE.1) GO TO 20 + 10 CONTINUE +C End of dummy loop; this point is never reached + 20 Q(POS) = I + L(I) = POS + IF (POS.NE.POS0) RETURN + DO 30 IDUM = 1,N + POSK = K*POS + IF (POSK.GT.QLEN) GO TO 40 + DK = D(Q(POSK)) + IF (POSK.LT.QLEN) THEN + DR = D(Q(POSK+1)) + IF (DK.LT.DR) THEN + POSK = POSK + 1 + DK = DR + ENDIF + ENDIF + IF (DI.GE.DK) GO TO 40 + QK = Q(POSK) + Q(POS) = QK + L(QK) = POS + POS = POSK + 30 CONTINUE +C End of dummy loop; this point is never reached + ELSE + IF (POS.LE.1) GO TO 34 + DO 32 IDUM = 1,N + POSK = POS/K + QK = Q(POSK) + IF (DI.GE.D(QK)) GO TO 34 + Q(POS) = QK + L(QK) = POS + POS = POSK + IF (POS.LE.1) GO TO 34 + 32 CONTINUE +C End of dummy loop; this point is never reached + 34 Q(POS) = I + L(I) = POS + IF (POS.NE.POS0) RETURN + DO 36 IDUM = 1,N + POSK = K*POS + IF (POSK.GT.QLEN) GO TO 40 + DK = D(Q(POSK)) + IF (POSK.LT.QLEN) THEN + DR = D(Q(POSK+1)) + IF (DK.GT.DR) THEN + POSK = POSK + 1 + DK = DR + ENDIF + ENDIF + IF (DI.LE.DK) GO TO 40 + QK = Q(POSK) + Q(POS) = QK + L(QK) = POS + POS = POSK + 36 CONTINUE +C End of dummy loop; this point is never reached + ENDIF +C End of dummy if; this point is never reached + 40 Q(POS) = I + L(I) = POS + + RETURN + END + +C********************************************************************** + SUBROUTINE MC64RD(N,NE,IP,IRN,A) + IMPLICIT NONE +C +C *** Copyright (c) 1999 Council for the Central Laboratory of the +C Research Councils *** +C *** Although every effort has been made to ensure robustness and *** +C *** reliability of the subroutines in this MC64 suite, we *** +C *** disclaim any liability arising through the use or misuse of *** +C *** any of the subroutines. *** +C *** Any problems? Contact ... *** +C Iain Duff (I.Duff@rl.ac.uk) or *** +C Jacko Koster (jacko.koster@uninett.no) *** +C + INTEGER N,NE + INTEGER IP(N+1),IRN(NE) + DOUBLE PRECISION A(NE) + +C This subroutine sorts the entries in each column of the +C sparse matrix (defined by N,NE,IP,IRN,A) by decreasing +C numerical value. + +C Local constants + INTEGER THRESH,TDLEN + PARAMETER (THRESH=15,TDLEN=50) +C Local variables + INTEGER J,IPJ,K,LEN,R,S,HI,FIRST,MID,LAST,TD + DOUBLE PRECISION HA,KEY +C Local arrays + INTEGER TODO(TDLEN) + + DO 100 J = 1,N + LEN = IP(J+1) - IP(J) + IF (LEN.LE.1) GO TO 100 + IPJ = IP(J) + +C Sort array roughly with partial quicksort + IF (LEN.LT.THRESH) GO TO 400 + TODO(1) = IPJ + TODO(2) = IPJ + LEN + TD = 2 + 500 CONTINUE + FIRST = TODO(TD-1) + LAST = TODO(TD) +C KEY is the smallest of two values present in interval [FIRST,LAST) + KEY = A((FIRST+LAST)/2) + DO 475 K = FIRST,LAST-1 + HA = A(K) + IF (HA.EQ.KEY) GO TO 475 + IF (HA.GT.KEY) GO TO 470 + KEY = HA + GO TO 470 + 475 CONTINUE +C Only one value found in interval, so it is already sorted + TD = TD - 2 + GO TO 425 + +C Reorder interval [FIRST,LAST) such that entries before MID are gt KEY + 470 MID = FIRST + DO 450 K = FIRST,LAST-1 + IF (A(K).LE.KEY) GO TO 450 + HA = A(MID) + A(MID) = A(K) + A(K) = HA + HI = IRN(MID) + IRN(MID) = IRN(K) + IRN(K) = HI + MID = MID + 1 + 450 CONTINUE +C Both subintervals [FIRST,MID), [MID,LAST) are nonempty +C Stack the longest of the two subintervals first + IF (MID-FIRST.GE.LAST-MID) THEN + TODO(TD+2) = LAST + TODO(TD+1) = MID + TODO(TD) = MID +C TODO(TD-1) = FIRST + ELSE + TODO(TD+2) = MID + TODO(TD+1) = FIRST + TODO(TD) = LAST + TODO(TD-1) = MID + ENDIF + TD = TD + 2 + + 425 CONTINUE + IF (TD.EQ.0) GO TO 400 +C There is still work to be done + IF (TODO(TD)-TODO(TD-1).GE.THRESH) GO TO 500 +C Next interval is already short enough for straightforward insertion + TD = TD - 2 + GO TO 425 + +C Complete sorting with straightforward insertion + 400 DO 200 R = IPJ+1,IPJ+LEN-1 + IF (A(R-1) .LT. A(R)) THEN + HA = A(R) + HI = IRN(R) + A(R) = A(R-1) + IRN(R) = IRN(R-1) + DO 300 S = R-1,IPJ+1,-1 + IF (A(S-1) .LT. HA) THEN + A(S) = A(S-1) + IRN(S) = IRN(S-1) + ELSE + A(S) = HA + IRN(S) = HI + GO TO 200 + END IF + 300 CONTINUE + A(IPJ) = HA + IRN(IPJ) = HI + END IF + 200 CONTINUE + + 100 CONTINUE + + RETURN + END + +C********************************************************************** + SUBROUTINE MC64SD(N,NE,IP,IRN,A,IPERM,NUMX, + & W,LEN,LENL,LENH,FC,IW,IW4) + IMPLICIT NONE +C +C *** Copyright (c) 1999 Council for the Central Laboratory of the +C Research Councils *** +C *** Although every effort has been made to ensure robustness and *** +C *** reliability of the subroutines in this MC64 suite, we *** +C *** disclaim any liability arising through the use or misuse of *** +C *** any of the subroutines. *** +C *** Any problems? Contact ... *** +C Iain Duff (I.Duff@rl.ac.uk) or *** +C Jacko Koster (jacko.koster@uninett.no) *** +C + INTEGER N,NE,NUMX + INTEGER IP(N+1),IRN(NE),IPERM(N), + & W(N),LEN(N),LENL(N),LENH(N),FC(N),IW(N),IW4(4*N) + DOUBLE PRECISION A(NE) + +C N, NE, IP, IRN, are described in MC64A/AD. +C A is a DOUBLE PRECISION array of length NE. +C A(K), K=1..NE, must be set to the value of the entry that +C corresponds to IRN(k). The entries in each column must be +C non-negative and ordered by decreasing value. +C IPERM is an INTEGER array of length N. On exit, it contains the +C bottleneck matching: IPERM(I) - 0 or row I is matched to column +C IPERM(I). +C NUMX is an INTEGER variable. On exit, it contains the cardinality +C of the matching stored in IPERM. +C IW is an INTEGER work array of length 10N. + +C FC is an integer array of length N that contains the list of +C unmatched columns. +C LEN(J), LENL(J), LENH(J) are integer arrays of length N that point +C to entries in matrix column J. +C In the matrix defined by the column parts IP(J)+LENL(J) we know +C a matching does not exist; in the matrix defined by the column +C parts IP(J)+LENH(J) we know one exists. +C LEN(J) lies between LENL(J) and LENH(J) and determines the matrix +C that is tested for a maximum matching. +C W is an integer array of length N and contains the indices of the +C columns for which LENL ne LENH. +C WLEN is number of indices stored in array W. +C IW is integer work array of length N. +C IW4 is integer work array of length 4N used by MC64U/UD. + + INTEGER NUM,NVAL,WLEN,II,I,J,K,L,CNT,MOD,IDUM1,IDUM2,IDUM3 + DOUBLE PRECISION BVAL,BMIN,BMAX,RINF + EXTERNAL MC64QD,MC64UD + +C BMIN and BMAX are such that a maximum matching exists for the input +C matrix in which all entries smaller than BMIN are dropped. +C For BMAX, a maximum matching does not exist. +C BVAL is a value between BMIN and BMAX. +C CNT is the number of calls made to MC64U/UD so far. +C NUM is the cardinality of last matching found. + +C Set RINF to largest positive real number + RINF = HUGE(RINF) + +C Compute a first maximum matching from scratch on whole matrix. + DO 20 J = 1,N + FC(J) = J + IW(J) = 0 + LEN(J) = IP(J+1) - IP(J) + 20 CONTINUE +C The first call to MC64U/UD + CNT = 1 + MOD = 1 + NUMX = 0 + CALL MC64UD(CNT,MOD,N,IRN,NE,IP,LEN,FC,IW,NUMX,N, + & IW4(1),IW4(N+1),IW4(2*N+1),IW4(3*N+1)) + +C IW contains a maximum matching of length NUMX. + NUM = NUMX + + IF (NUM.NE.N) THEN +C Matrix is structurally singular + BMAX = RINF + ELSE +C Matrix is structurally nonsingular, NUM=NUMX=N; +C Set BMAX just above the smallest of all the maximum absolute +C values of the columns + BMAX = RINF + DO 30 J = 1,N + BVAL = 0.0 + DO 25 K = IP(J),IP(J+1)-1 + IF (A(K).GT.BVAL) BVAL = A(K) + 25 CONTINUE + IF (BVAL.LT.BMAX) BMAX = BVAL + 30 CONTINUE + BMAX = 1.001 * BMAX + ENDIF + +C Initialize BVAL,BMIN + BVAL = 0.0 + BMIN = 0.0 +C Initialize LENL,LEN,LENH,W,WLEN according to BMAX. +C Set LEN(J), LENH(J) just after last entry in column J. +C Set LENL(J) just after last entry in column J with value ge BMAX. + WLEN = 0 + DO 48 J = 1,N + L = IP(J+1) - IP(J) + LENH(J) = L + LEN(J) = L + DO 45 K = IP(J),IP(J+1)-1 + IF (A(K).LT.BMAX) GO TO 46 + 45 CONTINUE +C Column J is empty or all entries are ge BMAX + K = IP(J+1) + 46 LENL(J) = K - IP(J) +C Add J to W if LENL(J) ne LENH(J) + IF (LENL(J).EQ.L) GO TO 48 + WLEN = WLEN + 1 + W(WLEN) = J + 48 CONTINUE + +C Main loop + DO 90 IDUM1 = 1,NE + IF (NUM.EQ.NUMX) THEN +C We have a maximum matching in IW; store IW in IPERM + DO 50 I = 1,N + IPERM(I) = IW(I) + 50 CONTINUE +C Keep going round this loop until matching IW is no longer maximum. + DO 80 IDUM2 = 1,NE + BMIN = BVAL + IF (BMAX .EQ. BMIN) GO TO 99 +C Find splitting value BVAL + CALL MC64QD(IP,LENL,LEN,W,WLEN,A,NVAL,BVAL) + IF (NVAL.LE.1) GO TO 99 +C Set LEN such that all matrix entries with value lt BVAL are +C discarded. Store old LEN in LENH. Do this for all columns W(K). +C Each step, either K is incremented or WLEN is decremented. + K = 1 + DO 70 IDUM3 = 1,N + IF (K.GT.WLEN) GO TO 71 + J = W(K) + DO 55 II = IP(J)+LEN(J)-1,IP(J)+LENL(J),-1 + IF (A(II).GE.BVAL) GO TO 60 + I = IRN(II) + IF (IW(I).NE.J) GO TO 55 +C Remove entry from matching + IW(I) = 0 + NUM = NUM - 1 + FC(N-NUM) = J + 55 CONTINUE + 60 LENH(J) = LEN(J) +C IP(J)+LEN(J)-1 is last entry in column ge BVAL + LEN(J) = II - IP(J) + 1 +C If LENH(J) = LENL(J), remove J from W + IF (LENL(J).EQ.LENH(J)) THEN + W(K) = W(WLEN) + WLEN = WLEN - 1 + ELSE + K = K + 1 + ENDIF + 70 CONTINUE + 71 IF (NUM.LT.NUMX) GO TO 81 + 80 CONTINUE +C End of dummy loop; this point is never reached +C Set mode for next call to MC64U/UD + 81 MOD = 1 + ELSE +C We do not have a maximum matching in IW. + BMAX = BVAL +C BMIN is the bottleneck value of a maximum matching; +C for BMAX the matching is not maximum, so BMAX>BMIN +C IF (BMAX .EQ. BMIN) GO TO 99 +C Find splitting value BVAL + CALL MC64QD(IP,LEN,LENH,W,WLEN,A,NVAL,BVAL) + IF (NVAL.EQ.0. OR. BVAL.EQ.BMIN) GO TO 99 +C Set LEN such that all matrix entries with value ge BVAL are +C inside matrix. Store old LEN in LENL. Do this for all columns W(K). +C Each step, either K is incremented or WLEN is decremented. + K = 1 + DO 87 IDUM3 = 1,N + IF (K.GT.WLEN) GO TO 88 + J = W(K) + DO 85 II = IP(J)+LEN(J),IP(J)+LENH(J)-1 + IF (A(II).LT.BVAL) GO TO 86 + 85 CONTINUE + 86 LENL(J) = LEN(J) + LEN(J) = II - IP(J) + IF (LENL(J).EQ.LENH(J)) THEN + W(K) = W(WLEN) + WLEN = WLEN - 1 + ELSE + K = K + 1 + ENDIF + 87 CONTINUE +C End of dummy loop; this point is never reached +C Set mode for next call to MC64U/UD + 88 MOD = 0 + ENDIF + CNT = CNT + 1 + CALL MC64UD(CNT,MOD,N,IRN,NE,IP,LEN,FC,IW,NUM,NUMX, + & IW4(1),IW4(N+1),IW4(2*N+1),IW4(3*N+1)) + +C IW contains maximum matching of length NUM + 90 CONTINUE +C End of dummy loop; this point is never reached + +C BMIN is bottleneck value of final matching + 99 IF (NUMX.EQ.N) GO TO 1000 +C The matrix is structurally singular, complete IPERM +C W, IW are work arrays + DO 300 J = 1,N + W(J) = 0 + 300 CONTINUE + K = 0 + DO 310 I = 1,N + IF (IPERM(I).EQ.0) THEN + K = K + 1 + IW(K) = I + ELSE + J = IPERM(I) + W(J) = I + ENDIF + 310 CONTINUE + K = 0 + DO 320 J = 1,N + IF (W(J).NE.0) GO TO 320 + K = K + 1 + IDUM1 = IW(K) + IPERM(IDUM1) = - J + 320 CONTINUE + + 1000 RETURN + END + +C********************************************************************** + SUBROUTINE MC64QD(IP,LENL,LENH,W,WLEN,A,NVAL,VAL) + IMPLICIT NONE +C +C *** Copyright (c) 1999 Council for the Central Laboratory of the +C Research Councils *** +C *** Although every effort has been made to ensure robustness and *** +C *** reliability of the subroutines in this MC64 suite, we *** +C *** disclaim any liability arising through the use or misuse of *** +C *** any of the subroutines. *** +C *** Any problems? Contact ... *** +C Iain Duff (I.Duff@rl.ac.uk) or *** +C Jacko Koster (jacko.koster@uninett.no) *** +C + INTEGER WLEN,NVAL + INTEGER IP(*),LENL(*),LENH(*),W(*) + DOUBLE PRECISION A(*),VAL + +C This routine searches for at most XX different numerical values +C in the columns W(1:WLEN). XX>=2. +C Each column J is scanned between IP(J)+LENL(J) and IP(J)+LENH(J)-1 +C until XX values are found or all columns have been considered. +C On output, NVAL is the number of different values that is found +C and SPLIT(1:NVAL) contains the values in decreasing order. +C If NVAL > 0, the routine returns VAL = SPLIT((NVAL+1)/2). +C + INTEGER XX,J,K,II,S,POS + PARAMETER (XX=10) + DOUBLE PRECISION SPLIT(XX),HA + +C Scan columns in W(1:WLEN). For each encountered value, if value not +C already present in SPLIT(1:NVAL), insert value such that SPLIT +C remains sorted by decreasing value. +C The sorting is done by straightforward insertion; therefore the use +C of this routine should be avoided for large XX (XX < 20). + NVAL = 0 + DO 10 K = 1,WLEN + J = W(K) + DO 15 II = IP(J)+LENL(J),IP(J)+LENH(J)-1 + HA = A(II) + IF (NVAL.EQ.0) THEN + SPLIT(1) = HA + NVAL = 1 + ELSE +C Check presence of HA in SPLIT + DO 20 S = NVAL,1,-1 + IF (SPLIT(S).EQ.HA) GO TO 15 + IF (SPLIT(S).GT.HA) THEN + POS = S + 1 + GO TO 21 + ENDIF + 20 CONTINUE + POS = 1 +C The insertion + 21 DO 22 S = NVAL,POS,-1 + SPLIT(S+1) = SPLIT(S) + 22 CONTINUE + SPLIT(POS) = HA + NVAL = NVAL + 1 + ENDIF +C Exit loop if XX values are found + IF (NVAL.EQ.XX) GO TO 11 + 15 CONTINUE + 10 CONTINUE +C Determine VAL + 11 IF (NVAL.GT.0) VAL = SPLIT((NVAL+1)/2) + + RETURN + END + +C********************************************************************** + SUBROUTINE MC64UD(ID,MOD,N,IRN,LIRN,IP,LENC,FC,IPERM,NUM,NUMX, + & PR,ARP,CV,OUT) + IMPLICIT NONE +C +C *** Copyright (c) 1999 Council for the Central Laboratory of the +C Research Councils *** +C *** Although every effort has been made to ensure robustness and *** +C *** reliability of the subroutines in this MC64 suite, we *** +C *** disclaim any liability arising through the use or misuse of *** +C *** any of the subroutines. *** +C *** Any problems? Contact ... *** +C Iain Duff (I.Duff@rl.ac.uk) or *** +C Jacko Koster (jacko.koster@uninett.no) *** +C + INTEGER ID,MOD,N,LIRN,NUM,NUMX + INTEGER ARP(N),CV(N),IRN(LIRN),IP(N), + & FC(N),IPERM(N),LENC(N),OUT(N),PR(N) + +C PR(J) is the previous column to J in the depth first search. +C Array PR is used as workspace in the sorting algorithm. +C Elements (I,IPERM(I)) I=1,..,N are entries at the end of the +C algorithm unless N assignments have not been made in which case +C N-NUM pairs (I,IPERM(I)) will not be entries in the matrix. +C CV(I) is the most recent loop number (ID+JORD) at which row I +C was visited. +C ARP(J) is the number of entries in column J which have been scanned +C when looking for a cheap assignment. +C OUT(J) is one less than the number of entries in column J which have +C not been scanned during one pass through the main loop. +C NUMX is maximum possible size of matching. + + INTEGER I,II,IN1,IN2,J,J1,JORD,K,KK,LAST,NFC, + & NUM0,NUM1,NUM2,ID0,ID1 + + IF (ID.EQ.1) THEN +C The first call to MC64U/UD. +C Initialize CV and ARP; parameters MOD, NUMX are not accessed + DO 5 I = 1,N + CV(I) = 0 + ARP(I) = 0 + 5 CONTINUE + NUM1 = N + NUM2 = N + ELSE +C Not the first call to MC64U/UD. +C Re-initialize ARP if entries were deleted since last call to MC64U/UD + IF (MOD.EQ.1) THEN + DO 8 I = 1,N + ARP(I) = 0 + 8 CONTINUE + ENDIF + NUM1 = NUMX + NUM2 = N - NUMX + ENDIF + NUM0 = NUM + +C NUM0 is size of input matching +C NUM1 is maximum possible size of matching +C NUM2 is maximum allowed number of unassigned rows/columns +C NUM is size of current matching + +C Quick return if possible +C IF (NUM.EQ.N) GO TO 199 +C NFC is number of rows/columns that could not be assigned + NFC = 0 +C Integers ID0+1 to ID0+N are unique numbers for call ID to MC64U/UD, +C so 1st call uses 1..N, 2nd call uses N+1..2N, etc + ID0 = (ID-1)*N + +C Main loop. Each pass round this loop either results in a new +C assignment or gives a column with no assignment + + DO 100 JORD = NUM0+1,N + +C Each pass uses unique number ID1 + ID1 = ID0 + JORD +C J is unmatched column + J = FC(JORD-NUM0) + PR(J) = -1 + DO 70 K = 1,JORD +C Look for a cheap assignment + IF (ARP(J).GE.LENC(J)) GO TO 30 + IN1 = IP(J) + ARP(J) + IN2 = IP(J) + LENC(J) - 1 + DO 20 II = IN1,IN2 + I = IRN(II) + IF (IPERM(I).EQ.0) GO TO 80 + 20 CONTINUE +C No cheap assignment in row + ARP(J) = LENC(J) +C Begin looking for assignment chain starting with row J + 30 OUT(J) = LENC(J) - 1 +C Inner loop. Extends chain by one or backtracks + DO 60 KK = 1,JORD + IN1 = OUT(J) + IF (IN1.LT.0) GO TO 50 + IN2 = IP(J) + LENC(J) - 1 + IN1 = IN2 - IN1 +C Forward scan + DO 40 II = IN1,IN2 + I = IRN(II) + IF (CV(I).EQ.ID1) GO TO 40 +C Column J has not yet been accessed during this pass + J1 = J + J = IPERM(I) + CV(I) = ID1 + PR(J) = J1 + OUT(J1) = IN2 - II - 1 + GO TO 70 + 40 CONTINUE +C Backtracking step. + 50 J1 = PR(J) + IF (J1.EQ.-1) THEN +C No augmenting path exists for column J. + NFC = NFC + 1 + FC(NFC) = J + IF (NFC.GT.NUM2) THEN +C A matching of maximum size NUM1 is not possible + LAST = JORD + GO TO 101 + ENDIF + GO TO 100 + ENDIF + J = J1 + 60 CONTINUE +C End of dummy loop; this point is never reached + 70 CONTINUE +C End of dummy loop; this point is never reached + +C New assignment is made. + 80 IPERM(I) = J + ARP(J) = II - IP(J) + 1 + NUM = NUM + 1 + DO 90 K = 1,JORD + J = PR(J) + IF (J.EQ.-1) GO TO 95 + II = IP(J) + LENC(J) - OUT(J) - 2 + I = IRN(II) + IPERM(I) = J + 90 CONTINUE +C End of dummy loop; this point is never reached + + 95 IF (NUM.EQ.NUM1) THEN +C A matching of maximum size NUM1 is found + LAST = JORD + GO TO 101 + ENDIF +C + 100 CONTINUE + +C All unassigned columns have been considered + LAST = N + +C Now, a transversal is computed or is not possible. +C Complete FC before returning. + 101 DO 110 JORD = LAST+1,N + NFC = NFC + 1 + FC(NFC) = FC(JORD-NUM0) + 110 CONTINUE + +C 199 RETURN + RETURN + END + +C********************************************************************** + SUBROUTINE MC64WD(N,NE,IP,IRN,A,IPERM,NUM, + & JPERM,OUT,PR,Q,L,U,D) + IMPLICIT NONE +C +C *** Copyright (c) 1999 Council for the Central Laboratory of the +C Research Councils *** +C *** Although every effort has been made to ensure robustness and *** +C *** reliability of the subroutines in this MC64 suite, we *** +C *** disclaim any liability arising through the use or misuse of *** +C *** any of the subroutines. *** +C *** Any problems? Contact ... *** +C Iain Duff (I.Duff@rl.ac.uk) or *** +C Jacko Koster (jacko.koster@uninett.no) *** +C + INTEGER N,NE,NUM + INTEGER IP(N+1),IRN(NE),IPERM(N), + & JPERM(N),OUT(N),PR(N),Q(N),L(N) + DOUBLE PRECISION A(NE),U(N),D(N) + +C N, NE, IP, IRN are described in MC64A/AD. +C A is a DOUBLE PRECISION array of length NE. +C A(K), K=1..NE, must be set to the value of the entry that +C corresponds to IRN(K). It is not altered. +C All values A(K) must be non-negative. +C IPERM is an INTEGER array of length N. On exit, it contains the +C weighted matching: IPERM(I) = 0 or row I is matched to column +C IPERM(I). +C NUM is an INTEGER variable. On exit, it contains the cardinality of +C the matching stored in IPERM. +C IW is an INTEGER work array of length 5N. +C DW is a DOUBLE PRECISION array of length 2N. +C On exit, U = D(1:N) contains the dual row variable and +C V = D(N+1:2N) contains the dual column variable. If the matrix +C is structurally nonsingular (NUM = N), the following holds: +C U(I)+V(J) <= A(I,J) if IPERM(I) |= J +C U(I)+V(J) = A(I,J) if IPERM(I) = J +C U(I) = 0 if IPERM(I) = 0 +C V(J) = 0 if there is no I for which IPERM(I) = J + +C Local variables + INTEGER I,I0,II,J,JJ,JORD,Q0,QLEN,JDUM,ISP,JSP, + & K,K0,K1,K2,KK,KK1,KK2,UP,LOW,LPOS + DOUBLE PRECISION CSP,DI,DMIN,DNEW,DQ0,VJ +C Local parameters + DOUBLE PRECISION RINF,ZERO + PARAMETER (ZERO=0.0D+0) +C External subroutines and/or functions + EXTERNAL MC64DD,MC64ED,MC64FD + + +C Set RINF to largest positive real number + RINF = HUGE(RINF) + +C Initialization + NUM = 0 + DO 10 K = 1,N + U(K) = RINF + D(K) = ZERO + IPERM(K) = 0 + JPERM(K) = 0 + PR(K) = IP(K) + L(K) = 0 + 10 CONTINUE +C Initialize U(I) + DO 30 J = 1,N + DO 20 K = IP(J),IP(J+1)-1 + I = IRN(K) + IF (A(K).GT.U(I)) GO TO 20 + U(I) = A(K) + IPERM(I) = J + L(I) = K + 20 CONTINUE + 30 CONTINUE + DO 40 I = 1,N + J = IPERM(I) + IF (J.EQ.0) GO TO 40 +C Row I is not empty + IPERM(I) = 0 + IF (JPERM(J).NE.0) GO TO 40 +C Don't choose cheap assignment from dense columns + IF (IP(J+1)-IP(J) .GT. N/10 .AND. N.GT.50) GO TO 40 +C Assignment of column J to row I + NUM = NUM + 1 + IPERM(I) = J + JPERM(J) = L(I) + 40 CONTINUE + IF (NUM.EQ.N) GO TO 1000 +C Scan unassigned columns; improve assignment + DO 95 J = 1,N +C JPERM(J) ne 0 iff column J is already assigned + IF (JPERM(J).NE.0) GO TO 95 + K1 = IP(J) + K2 = IP(J+1) - 1 +C Continue only if column J is not empty + IF (K1.GT.K2) GO TO 95 +C VJ = RINF +C Changes made to allow for NaNs + I0 = IRN(K1) + VJ = A(K1) - U(I0) + K0 = K1 + DO 50 K = K1+1,K2 + I = IRN(K) + DI = A(K) - U(I) + IF (DI.GT.VJ) GO TO 50 + IF (DI.LT.VJ .OR. DI.EQ.RINF) GO TO 55 + IF (IPERM(I).NE.0 .OR. IPERM(I0).EQ.0) GO TO 50 + 55 VJ = DI + I0 = I + K0 = K + 50 CONTINUE + D(J) = VJ + K = K0 + I = I0 + IF (IPERM(I).EQ.0) GO TO 90 + DO 60 K = K0,K2 + I = IRN(K) + IF (A(K)-U(I).GT.VJ) GO TO 60 + JJ = IPERM(I) +C Scan remaining part of assigned column JJ + KK1 = PR(JJ) + KK2 = IP(JJ+1) - 1 + IF (KK1.GT.KK2) GO TO 60 + DO 70 KK = KK1,KK2 + II = IRN(KK) + IF (IPERM(II).GT.0) GO TO 70 + IF (A(KK)-U(II).LE.D(JJ)) GO TO 80 + 70 CONTINUE + PR(JJ) = KK2 + 1 + 60 CONTINUE + GO TO 95 + 80 JPERM(JJ) = KK + IPERM(II) = JJ + PR(JJ) = KK + 1 + 90 NUM = NUM + 1 + JPERM(J) = K + IPERM(I) = J + PR(J) = K + 1 + 95 CONTINUE + IF (NUM.EQ.N) GO TO 1000 + +C Prepare for main loop + DO 99 I = 1,N + D(I) = RINF + L(I) = 0 + 99 CONTINUE + +C Main loop ... each pass round this loop is similar to Dijkstra's +C algorithm for solving the single source shortest path problem + + DO 100 JORD = 1,N + + IF (JPERM(JORD).NE.0) GO TO 100 +C JORD is next unmatched column +C DMIN is the length of shortest path in the tree + DMIN = RINF + QLEN = 0 + LOW = N + 1 + UP = N + 1 +C CSP is the cost of the shortest augmenting path to unassigned row +C IRN(ISP). The corresponding column index is JSP. + CSP = RINF +C Build shortest path tree starting from unassigned column (root) JORD + J = JORD + PR(J) = -1 + +C Scan column J + DO 115 K = IP(J),IP(J+1)-1 + I = IRN(K) + DNEW = A(K) - U(I) + IF (DNEW.GE.CSP) GO TO 115 + IF (IPERM(I).EQ.0) THEN + CSP = DNEW + ISP = K + JSP = J + ELSE + IF (DNEW.LT.DMIN) DMIN = DNEW + D(I) = DNEW + QLEN = QLEN + 1 + Q(QLEN) = K + ENDIF + 115 CONTINUE +C Initialize heap Q and Q2 with rows held in Q(1:QLEN) + Q0 = QLEN + QLEN = 0 + DO 120 KK = 1,Q0 + K = Q(KK) + I = IRN(K) + IF (CSP.LE.D(I)) THEN + D(I) = RINF + GO TO 120 + ENDIF + IF (D(I).LE.DMIN) THEN + LOW = LOW - 1 + Q(LOW) = I + L(I) = LOW + ELSE + QLEN = QLEN + 1 + L(I) = QLEN + CALL MC64DD(I,N,Q,D,L,2) + ENDIF +C Update tree + JJ = IPERM(I) + OUT(JJ) = K + PR(JJ) = J + 120 CONTINUE + + DO 150 JDUM = 1,NUM + +C If Q2 is empty, extract rows from Q + IF (LOW.EQ.UP) THEN + IF (QLEN.EQ.0) GO TO 160 + I = Q(1) + IF (D(I).GE.CSP) GO TO 160 + DMIN = D(I) + 152 CALL MC64ED(QLEN,N,Q,D,L,2) + LOW = LOW - 1 + Q(LOW) = I + L(I) = LOW + IF (QLEN.EQ.0) GO TO 153 + I = Q(1) + IF (D(I).GT.DMIN) GO TO 153 + GO TO 152 + ENDIF +C Q0 is row whose distance D(Q0) to the root is smallest + 153 Q0 = Q(UP-1) + DQ0 = D(Q0) +C Exit loop if path to Q0 is longer than the shortest augmenting path + IF (DQ0.GE.CSP) GO TO 160 + UP = UP - 1 + +C Scan column that matches with row Q0 + J = IPERM(Q0) + VJ = DQ0 - A(JPERM(J)) + U(Q0) + DO 155 K = IP(J),IP(J+1)-1 + I = IRN(K) + IF (L(I).GE.UP) GO TO 155 +C DNEW is new cost + DNEW = VJ + A(K)-U(I) +C Do not update D(I) if DNEW ge cost of shortest path + IF (DNEW.GE.CSP) GO TO 155 + IF (IPERM(I).EQ.0) THEN +C Row I is unmatched; update shortest path info + CSP = DNEW + ISP = K + JSP = J + ELSE +C Row I is matched; do not update D(I) if DNEW is larger + DI = D(I) + IF (DI.LE.DNEW) GO TO 155 + IF (L(I).GE.LOW) GO TO 155 + D(I) = DNEW + IF (DNEW.LE.DMIN) THEN + LPOS = L(I) + IF (LPOS.NE.0) + * CALL MC64FD(LPOS,QLEN,N,Q,D,L,2) + LOW = LOW - 1 + Q(LOW) = I + L(I) = LOW + ELSE + IF (L(I).EQ.0) THEN + QLEN = QLEN + 1 + L(I) = QLEN + ENDIF + CALL MC64DD(I,N,Q,D,L,2) + ENDIF +C Update tree + JJ = IPERM(I) + OUT(JJ) = K + PR(JJ) = J + ENDIF + 155 CONTINUE + 150 CONTINUE + +C If CSP = RINF, no augmenting path is found + 160 IF (CSP.EQ.RINF) GO TO 190 +C Find augmenting path by tracing backward in PR; update IPERM,JPERM + NUM = NUM + 1 + I = IRN(ISP) + IPERM(I) = JSP + JPERM(JSP) = ISP + J = JSP + DO 170 JDUM = 1,NUM + JJ = PR(J) + IF (JJ.EQ.-1) GO TO 180 + K = OUT(J) + I = IRN(K) + IPERM(I) = JJ + JPERM(JJ) = K + J = JJ + 170 CONTINUE +C End of dummy loop; this point is never reached + +C Update U for rows in Q(UP:N) + 180 DO 185 KK = UP,N + I = Q(KK) + U(I) = U(I) + D(I) - CSP + 185 CONTINUE + 190 DO 191 KK = LOW,N + I = Q(KK) + D(I) = RINF + L(I) = 0 + 191 CONTINUE + DO 193 KK = 1,QLEN + I = Q(KK) + D(I) = RINF + L(I) = 0 + 193 CONTINUE + + 100 CONTINUE +C End of main loop + + +C Set dual column variable in D(1:N) + 1000 DO 200 J = 1,N + K = JPERM(J) + IF (K.NE.0) THEN + D(J) = A(K) - U(IRN(K)) + ELSE + D(J) = ZERO + ENDIF + IF (IPERM(J).EQ.0) U(J) = ZERO + 200 CONTINUE + + IF (NUM.EQ.N) GO TO 1100 + +C The matrix is structurally singular, complete IPERM. +C JPERM, OUT are work arrays + DO 300 J = 1,N + JPERM(J) = 0 + 300 CONTINUE + K = 0 + DO 310 I = 1,N + IF (IPERM(I).EQ.0) THEN + K = K + 1 + OUT(K) = I + ELSE + J = IPERM(I) + JPERM(J) = I + ENDIF + 310 CONTINUE + K = 0 + DO 320 J = 1,N + IF (JPERM(J).NE.0) GO TO 320 + K = K + 1 + JDUM = OUT(K) + IPERM(JDUM) = - J + 320 CONTINUE + 1100 RETURN + END + + +* COPYRIGHT (c) 1988 AEA Technology and +* Council for the Central Laboratory of the Research Councils +C Original date 14 June 2001 +C June 2001: threadsafe version of MC41 +C 20/2/02 Cosmetic changes applied to reduce single/double differences + +C 12th July 2004 Version 1.0.0. Version numbering added. + + SUBROUTINE MC71AD(N,KASE,X,EST,W,IW,KEEP) +C +C MC71A/AD ESTIMATES THE 1-NORM OF A SQUARE MATRIX A. +C REVERSE COMMUNICATION IS USED FOR EVALUATING +C MATRIX-VECTOR PRODUCTS. +C +C +C N INTEGER +C THE ORDER OF THE MATRIX. N .GE. 1. +C +C KASE INTEGER +C SET INITIALLY TO ZERO . IF N .LE. 0 SET TO -1 +C ON INTERMEDIATE RETURN +C = 1 OR 2. +C ON FINAL RETURN +C = 0 ,IF SUCCESS +C = -1 ,IF N .LE.0 +C +C X DOUBLE PRECISION ARRAY OF DIMENSION (N) +C IF 1-NORM IS REQUIRED +C MUST BE OVERWRITTEN BY +C +C A*X, IF KASE=1, +C TRANSPOSE(A)*X, IF KASE=2, +C +C AND MC71 MUST BE RE-CALLED, WITH ALL THE OTHER +C PARAMETERS UNCHANGED. +C IF INFINITY-NORM IS REQUIRED +C MUST BE OVERWRITTEN BY +C +C TRANSPOSE(A)*X, IF KASE=1, +C A*X, IF KASE=2, +C +C AND MC71 MUST BE RE-CALLED, WITH ALL THE OTHER +C PARAMETERS UNCHANGED. +C +C EST DOUBLE PRECISION +C CONTAINS AN ESTIMATE (A LOWER BOUND) FOR NORM(A). +C +C W DOUBLE PRECISION ARRAY OF DIMENSION (N) +C = A*V, WHERE EST = NORM(W)/NORM(V) +C (V IS NOT RETURNED). +C IW INTEGER(N) USED AS WORKSPACE. +C +C KEEP INTEGER ARRAY LENGTH 5 USED TO PRESERVE PRIVATE +C DATA, JUMP, ITER, J AND JLAST BETWEEN CALLS, +C KEEP(5) IS SPARE. +C +C REFERENCE +C N.J. HIGHAM (1987) FORTRAN CODES FOR ESTIMATING +C THE ONE-NORM OF A +C REAL OR COMPLEX MATRIX, WITH APPLICATIONS +C TO CONDITION ESTIMATION, NUMERICAL ANALYSIS REPORT NO. 135, +C UNIVERSITY OF MANCHESTER, MANCHESTER M13 9PL, ENGLAND. +C +C SUBROUTINES AND FUNCTIONS +C +C +C INTERNAL VARIABLES +C +C .. Parameters .. + INTEGER ITMAX + PARAMETER (ITMAX=5) + DOUBLE PRECISION ZERO,ONE + PARAMETER (ZERO=0.0D0,ONE=1.0D0) +C .. +C .. Scalar Arguments .. + DOUBLE PRECISION EST + INTEGER KASE,N +C .. +C .. Array Arguments .. + DOUBLE PRECISION W(*),X(*) + INTEGER IW(*),KEEP(5) +C .. +C .. Local Scalars .. + DOUBLE PRECISION ALTSGN,TEMP + INTEGER I,ITER,J,JLAST,JUMP +C .. +C .. External Functions .. + INTEGER IDAMAX + EXTERNAL IDAMAX +C .. +C .. Intrinsic Functions .. + INTRINSIC ABS,SIGN,NINT,DBLE +C .. +C .. Executable Statements .. +C + IF (N.LE.0) THEN + KASE = -1 + RETURN + + END IF + + IF (KASE.EQ.0) THEN + DO 10 I = 1,N + X(I) = ONE/DBLE(N) + 10 CONTINUE + KASE = 1 + JUMP = 1 + KEEP(1) = JUMP + KEEP(2) = 0 + KEEP(3) = 0 + KEEP(4) = 0 + RETURN + + END IF +C + JUMP = KEEP(1) + ITER = KEEP(2) + J = KEEP(3) + JLAST = KEEP(4) +C + GO TO (100,200,300,400,500) JUMP +C +C ................ ENTRY (JUMP = 1) +C + 100 CONTINUE + IF (N.EQ.1) THEN + W(1) = X(1) + EST = ABS(W(1)) +C ... QUIT + GO TO 510 + + END IF +C + DO 110 I = 1,N + X(I) = SIGN(ONE,X(I)) + IW(I) = NINT(X(I)) + 110 CONTINUE + KASE = 2 + JUMP = 2 + GO TO 1010 +C +C ................ ENTRY (JUMP = 2) +C + 200 CONTINUE + J = IDAMAX(N,X,1) + ITER = 2 +C +C MAIN LOOP - ITERATIONS 2,3,...,ITMAX. +C + 220 CONTINUE + DO 230 I = 1,N + X(I) = ZERO + 230 CONTINUE + X(J) = ONE + KASE = 1 + JUMP = 3 + GO TO 1010 +C +C ................ ENTRY (JUMP = 3) +C + 300 CONTINUE +C +C COPY X INTO W +C + DO 310 I = 1,N + W(I) = X(I) + 310 CONTINUE + DO 320 I = 1,N + IF (NINT(SIGN(ONE,X(I))).NE.IW(I)) GO TO 330 + 320 CONTINUE +C +C REPEATED SIGN VECTOR DETECTED, HENCE ALGORITHM HAS CONVERGED. + GO TO 410 +C + 330 CONTINUE + DO 340 I = 1,N + X(I) = SIGN(ONE,X(I)) + IW(I) = NINT(X(I)) + 340 CONTINUE + KASE = 2 + JUMP = 4 + GO TO 1010 +C +C ................ ENTRY (JUMP = 4) +C + 400 CONTINUE + JLAST = J + J = IDAMAX(N,X,1) + IF ((ABS(X(JLAST)).NE.ABS(X(J))) .AND. (ITER.LT.ITMAX)) THEN + ITER = ITER + 1 + GO TO 220 + + END IF +C +C ITERATION COMPLETE. FINAL STAGE. +C + 410 CONTINUE + EST = ZERO + DO 420 I = 1,N + EST = EST + ABS(W(I)) + 420 CONTINUE +C + ALTSGN = ONE + DO 430 I = 1,N + X(I) = ALTSGN* (ONE+DBLE(I-1)/DBLE(N-1)) + ALTSGN = -ALTSGN + 430 CONTINUE + KASE = 1 + JUMP = 5 + GO TO 1010 +C +C ................ ENTRY (JUMP = 5) +C + 500 CONTINUE + TEMP = ZERO + DO 520 I = 1,N + TEMP = TEMP + ABS(X(I)) + 520 CONTINUE + TEMP = 2.0*TEMP/DBLE(3*N) + IF (TEMP.GT.EST) THEN +C +C COPY X INTO W +C + DO 530 I = 1,N + W(I) = X(I) + 530 CONTINUE + EST = TEMP + END IF +C + 510 KASE = 0 +C + 1010 CONTINUE + KEEP(1) = JUMP + KEEP(2) = ITER + KEEP(3) = J + KEEP(4) = JLAST + RETURN +C + END +C COPYRIGHT (c) 2002 ENSEEIHT-IRIT, Toulouse, France and +C Council for the Central Laboratory of the Research Councils. +C Version 1.0.0 July 2004 +C Version 1.0.1 March 2008 Comments reflowed with length < 73 +C AUTHOR Daniel Ruiz (Daniel.Ruiz@enseeiht.fr) +C *** Copyright (c) 2004 Council for the Central Laboratory of the +C Research Councils and Ecole Nationale Superieure +C d'Electrotechnique, d'Electronique, d'Informatique, +C d'Hydraulique et des Telecommunications de Toulouse. *** +C *** Although every effort has been made to ensure robustness and *** +C *** reliability of the subroutines in this MC77 suite, we *** +C *** disclaim any liability arising through the use or misuse of *** +C *** any of the subroutines. *** + +C********************************************************************** + SUBROUTINE MC77ID(ICNTL, CNTL) +C +C Purpose +C ======= +C +C The components of the array ICNTL control the action of MC77A/AD. +C Default values for these are set in this subroutine. +C +C Parameters +C ========== +C + INTEGER LICNTL, LCNTL + PARAMETER ( LICNTL=10, LCNTL=10 ) + INTEGER ICNTL(LICNTL) + DOUBLE PRECISION CNTL(LCNTL) +C +C Local variables and parameters + DOUBLE PRECISION ONE, ZERO + PARAMETER ( ONE=1.0D+00, ZERO=0.0D+00 ) + INTEGER I +C +C ICNTL(1) has default value 6. +C It is the output stream for error messages. If it +C is negative, these messages will be suppressed. +C +C ICNTL(2) has default value 6. +C It is the output stream for warning messages. +C If it is negative, these messages are suppressed. +C +C ICNTL(3) has default value -1. +C It is the output stream for monitoring printing. +C If it is negative, these messages are suppressed. +C +C ICNTL(4) has default value 0. +C If left at the default value, the incoming data is checked for +C out-of-range indices and duplicates, in which case the driver +C routine will exit with an error. Setting ICNTL(4) to any +C other value will avoid the checks but is likely to cause problems +C later if out-of-range indices or duplicates are present. +C The user should only set ICNTL(4) nonzero if the data is +C known to be in range without duplicates. +C +C ICNTL(5) has default value 0. +C If left at the default value, it indicates that A contains some +C negative entries, and it is necessary that their absolute values +C be computed internally. Otherwise, the values in the input +C matrix A will be considered as non-negative. +C +C ICNTL(6) has default value 0. +C If nonzero, the input matrix A is symmetric and the user must +C only supply the lower triangular part of A in the appropriate +C format. Entries in the upper triangular part of a symmetric +C matrix will be considered as out-of-range, and are also checked +C when ICNTL(4) is 0. +C +C ICNTL(7) has a default value of 10. +C It specifies the maximum number of scaling iterations that +C may be performed. +C Note that iteration "0", corresponding to the initial +C normalization of the data, is always performed. +C Restriction: ICNTL(7) > 0 +C (otherwise, the driver stops with an error) +C ( ... In future release : Restriction: ICNTL(7) >= 0 ... ) +C +C ICNTL(8) to ICNTL(15) are not currently used by MC77A/AD but are +C set to zero in this routine. +C +C +C CNTL(1) has a default value of 0. +C It specifies the tolerance value when to stopping the iterations, +C that is it is the desired value such that all row and column norms +C in the scaled matrix lie between (1 +/- CNTL(1)). +C If CNTL(1) is less than or equal to 0, tolerance is not checked, +C and the algorithm will stop when the maximum number of iterations +C given in ICNTL(7) is reached. +C +C CNTL(2) has a default value of 1. +C It is used in conjunction with parameter JOB set to -1, +C to specify a REAL value for the power of norm under consideration. +C Restriction: CNTL(2) >= 1 +C (otherwise, the driver stops with an error) +C +C CNTL(3) to CNTL(10) are not currently used by MC77A/AD but are +C set to zero in this routine. + +C Initialization of the ICNTL array. + ICNTL(1) = 6 + ICNTL(2) = 6 + ICNTL(3) = -1 + ICNTL(4) = 0 + ICNTL(5) = 0 + ICNTL(6) = 0 + ICNTL(7) = 10 +C Currently unused control variables: + DO 10 I = 8,LICNTL + ICNTL(I) = 0 + 10 CONTINUE + +C Initialization of the CNTL array. + CNTL(1) = ZERO + CNTL(2) = ONE +C Currently unused control variables: + DO 20 I = 3,LCNTL + CNTL(I) = ZERO + 20 CONTINUE + + RETURN + END + +C********************************************************************** +C*** DRIVER FOR THE HARWELL-BOEING SPARSE FORMAT *** +C********************************************************************** + SUBROUTINE MC77AD(JOB,M,N,NNZ,JCST,IRN,A,IW,LIW,DW,LDW, + & ICNTL,CNTL,INFO,RINFO) +C +C Purpose +C ======= +C +C This subroutine computes scaling factors D(i), i=1..M, and E(j), +C j=1..N, for an MxN sparse matrix A = {a_ij} so that the scaled matrix +C D^{-1}*A*E^{-1} has both rows and columns norms all equal or close to +C 1. The rectangular case (M/=N) is, for the moment, only allowed for +C equilibration in the infinity norm, a particular case for which the +C convergence is ensured in all cases and trivial to monitor. See [1]. +C +C Parameters +C ========== +C + INTEGER LICNTL, LCNTL, LINFO, LRINFO + PARAMETER ( LICNTL=10, LCNTL=10, LINFO=10, LRINFO=10 ) + INTEGER ICNTL(LICNTL),INFO(LINFO) + DOUBLE PRECISION CNTL(LCNTL),RINFO(LRINFO) +C + INTEGER JOB,M,N,NNZ,LIW,LDW + INTEGER JCST(N+1),IRN(NNZ),IW(LIW) + DOUBLE PRECISION A(NNZ),DW(LDW) +C +C JOB is an INTEGER variable which must be set by the user to +C control the action. It is not altered by the subroutine. +C Possible values for JOB are: +C 0 Equilibrate the infinity norm of rows and columns in matrix A. +C 1 Equilibrate the one norm of rows and columns in matrix A. +C p Equilibrate the p-th norm (p>=2) of rows and columns in matrix A. +C -1 Equilibrate the p-th norm of rows and columns in matrix A, with +C a strictly positive REAL parameter p given in CNTL(2). +C Restriction: JOB >= -1. +C +C M is an INTEGER variable which must be set by the user to the +C number of rows in matrix A. It is not altered by the subroutine. +C Restriction: M >= 1. +C +C N is an INTEGER variable which must be set by the user to the +C number of columns in matrix A. It is not altered by the subroutine. +C Restriction: N >= 1. +C If ICNTL(6) /= 0 (symmetric matrix), N must be equal to M. +C +C NNZ is an INTEGER variable which must be set by the user to the number +C of entries in the matrix. It is not altered by the subroutine. +C Restriction: NNZ >= 0. +C +C JCST is an INTEGER array of length N+1. +C JCST(J), J=1..N, must be set by the user to the position in array +C IRN of the first row index of an entry in column J. +C JCST(N+1) must be set to NNZ+1. +C The array JCST is not altered by the subroutine. +C +C IRN is an INTEGER array of length NNZ. +C IRN(K), K=1..NNZ, must be set by the user to hold the row indices of +C the entries in the matrix. +C The array IRN is not altered by the subroutine. +C Restrictions: +C The entries in A belonging to column J must be stored contiguously +C in the positions JCST(J)..JCST(J+1)-1. The ordering of the row +C indices within each column is unimportant. +C Out-of-range indices and duplicates are not allowed. +C +C A is a REAL (DOUBLE PRECISION in the D-version) array of length NNZ. +C The user must set A(K), K=1..NNZ, to the numerical value of the +C entry that corresponds to IRN(K). +C It is not altered by the subroutine. +C +C LIW is an INTEGER variable that must be set by the user to +C the length of array IW. It is not altered by the subroutine. +C Restriction: +C If ICNTL(6) == 0: LIW >= M+N +C If ICNTL(6) /= 0: LIW >= M +C +C IW is an INTEGER array of length LIW that is used for workspace. +C +C LDW is an INTEGER variable that must be set by the user to the +C length of array DW. It is not altered by the subroutine. +C Restriction: +C If ICNTL(5) = 0 and ICNTL(6) == 0: LDW >= NNZ + 2*(M+N) +C If ICNTL(5) = 1 and ICNTL(6) == 0: LDW >= 2*(M+N) +C If ICNTL(5) = 0 and ICNTL(6) /= 0: LDW >= NNZ + 2*M +C If ICNTL(5) = 1 and ICNTL(6) /= 0: LDW >= 2*M +C +C DW is a REAL (DOUBLE PRECISION in the D-version) array of length LDW +C that need not be set by the user. +C On return, DW(i) contains d_i, i=1..M, the diagonal entries in +C the row-scaling matrix D, and when the input matrix A is +C unsymmetric, DW(M+j) contains e_j, j=1..N, the diagonal entries in +C the column-scaling matrix E. +C +C ICNTL is an INTEGER array of length 10. Its components control the +C output of MC77A/AD and must be set by the user before calling +C MC77A/AD. They are not altered by the subroutine. +C See MC77I/ID for details. +C +C CNTL is a REAL (DOUBLE PRECISION in the D-version) array of length 10. +C Its components control the output of MC77A/AD and must be set by the +C user before calling MC77A/AD. They are not altered by the +C subroutine. +C See MC77I/ID for details. +C +C INFO is an INTEGER array of length 10 which need not be set by the +C user. INFO(1) is set non-negative to indicate success. A negative +C value is returned if an error occurred, a positive value if a +C warning occurred. INFO(2) holds further information on the error. +C On exit from the subroutine, INFO(1) will take one of the +C following values: +C 0 : successful entry (for structurally nonsingular matrix). +C +1 : The maximum number of iterations in ICNTL(7) has been reached. +C -1 : M < 1. Value of M held in INFO(2). +C -2 : N < 1. Value of N held in INFO(2). +C -3 : ICNTL(6) /= 0 (input matrix is symmetric) and N /= M. +C Value of (N-M) held in INFO(2). +C -4 : NNZ < 1. Value of NNZ held in INFO(2). +C -5 : the defined length LIW violates the restriction on LIW. +C Value of LIW required given by INFO(2). +C -6 : the defined length LDW violates the restriction on LDW. +C Value of LDW required given by INFO(2). +C -7 : entries are found whose row indices are out of range. INFO(2) +C contains the index of a column in which such an entry is found. +C -8 : repeated entries are found. INFO(2) contains the index +C of a column in which such an entry is found. +C -9 : An entry corresponding to an element in the upper triangular +C part of the matrix is found in the input data (ICNTL(6)} \= 0). +C -10 : ICNTL(7) is out of range and INFO(2) contains its value. +C -11 : CNTL(2) is out of range. +C -12 : JOB < -1. Value of JOB held in INFO(2). +C -13 : JOB /= 0 and N /= M. This is a restriction of the algorithm in +C its present stage, e.g. for rectangular matrices, only the +C scaling in infinity norm is allowed. Value of JOB held in +C INFO(2). +C INFO(3) returns the number of iterations performed. +C INFO(4) to INFO(10) are not currently used and are set to zero by +C the routine. +C +C RINFO is a REAL (DOUBLE PRECISION in the D-version) array of length 10 +C which need not be set by the user. +C When CNTL(1) is strictly positive, RINFO(1) will contain on exit the +C maximum distance of all row norms to 1, and RINFO(2) will contain on +C exit the maximum distance of all column norms to 1. +C If ICNTL(6) /= 0 (indicating that the input matrix is symmetric), +C RINFO(2) is not used since the row-scaling equals the column scaling +C in this case. +C RINFO(3) to RINFO(10) are not currently used and are set to zero. +C +C References: +C [1] D. R. Ruiz, (2001), +C "A scaling algorithm to equilibrate both rows and columns norms +C in matrices", +C Technical Report RAL-TR-2001-034, RAL, Oxfordshire, England, +C and Report RT/APO/01/4, ENSEEIHT-IRIT, Toulouse, France. + +C Local variables and parameters + DOUBLE PRECISION ONE, ZERO + PARAMETER ( ONE=1.0D+00, ZERO=0.0D+00 ) + DOUBLE PRECISION THRESH, DP + INTEGER I, J, K, MAXIT, CHECK, SETUP +C External routines and functions + EXTERNAL MC77ND,MC77OD,MC77PD,MC77QD +C Intrinsic functions + INTRINSIC ABS,MAX + +C Reset informational output values + INFO(1) = 0 + INFO(2) = 0 + INFO(3) = 0 + RINFO(1) = ZERO + RINFO(2) = ZERO +C Check value of JOB + IF (JOB.LT.-1) THEN + INFO(1) = -12 + INFO(2) = JOB + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9001) INFO(1),'JOB',JOB + GO TO 99 + ENDIF +C Check bad values in ICNTL +Cnew IF (ICNTL(7).LT.0) THEN + IF (ICNTL(7).LE.0) THEN + INFO(1) = -10 + INFO(2) = 7 + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9002) INFO(1),7,ICNTL(7) + GO TO 99 + ENDIF +C Check bad values in CNTL + IF ((JOB.EQ.-1) .AND. (CNTL(2).LT.ONE)) THEN + INFO(1) = -11 + INFO(2) = 2 + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9008) INFO(1),2,CNTL(2) + GO TO 99 + ENDIF +C Check value of M + IF (M.LT.1) THEN + INFO(1) = -1 + INFO(2) = M + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9001) INFO(1),'M',M + GO TO 99 + ENDIF +C Check value of N + IF (N.LT.1) THEN + INFO(1) = -2 + INFO(2) = N + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9001) INFO(1),'N',N + GO TO 99 + ENDIF +C Symmetric case: M must be equal to N + IF ( (ICNTL(6).NE.0) .AND. (N.NE.M) ) THEN + INFO(1) = -3 + INFO(2) = N-M + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9003) INFO(1),(N-M) + GO TO 99 + ENDIF +C For rectangular matrices, only scaling in infinity norm is allowed + IF ( (JOB.NE.0) .AND. (N.NE.M) ) THEN + INFO(1) = -13 + INFO(2) = JOB + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9009) INFO(1),JOB,M,N + GO TO 99 + ENDIF +C Check value of NNZ + IF (NNZ.LT.1) THEN + INFO(1) = -4 + INFO(2) = NNZ + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9001) INFO(1),'NNZ',NNZ + GO TO 99 + ENDIF +C Check LIW + K = M + IF (ICNTL(6).EQ.0) K = M+N + IF (LIW.LT.K) THEN + INFO(1) = -5 + INFO(2) = K + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9004) INFO(1),K + GO TO 99 + ENDIF +C Check LDW + K = 2*M + IF (ICNTL(6).EQ.0) K = 2*(M+N) + IF ( (ICNTL(5).EQ.0) .OR. (JOB.GE.2) .OR. (JOB.EQ.-1) ) + & K = K + NNZ + IF (LDW.LT.K) THEN + INFO(1) = -6 + INFO(2) = K + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9005) INFO(1),K + GO TO 99 + ENDIF +C Check row indices. Use IW(1:M) as workspace +C Harwell-Boeing sparse format : + IF (ICNTL(4).EQ.0) THEN + DO 3 I = 1,M + IW(I) = 0 + 3 CONTINUE + DO 5 J = 1,N + DO 4 K = JCST(J),JCST(J+1)-1 + I = IRN(K) +C Check for row indices that are out of range + IF (I.LT.1 .OR. I.GT.M) THEN + INFO(1) = -7 + INFO(2) = J + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9006) INFO(1),J,I + GO TO 99 + ENDIF + IF (ICNTL(6).NE.0 .AND. I.LT.J) THEN + INFO(1) = -9 + INFO(2) = J + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9006) INFO(1),J,I + GO TO 99 + ENDIF +C Check for repeated row indices within a column + IF (IW(I).EQ.J) THEN + INFO(1) = -8 + INFO(2) = J + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9007) INFO(1),J,I + GO TO 99 + ELSE + IW(I) = J + ENDIF + 4 CONTINUE + 5 CONTINUE + ENDIF + +C Print diagnostics on input +C ICNTL(9) could be set by the user to monitor the level of diagnostics + IF (ICNTL(3).GE.0) THEN + WRITE(ICNTL(3),9020) JOB,M,N,NNZ,ICNTL(7),CNTL(1) +C Harwell-Boeing sparse format : + IF (ICNTL(9).LT.1) THEN + WRITE(ICNTL(3),9021) (JCST(J),J=1,N+1) + WRITE(ICNTL(3),9023) (IRN(J),J=1,NNZ) + WRITE(ICNTL(3),9024) (A(J),J=1,NNZ) + ENDIF + ENDIF + +C Set components of INFO to zero + DO 10 I=1,10 + INFO(I) = 0 + RINFO(I) = ZERO + 10 CONTINUE + +C Set the convergence threshold and the maximum number of iterations + THRESH = MAX( ZERO, CNTL(1) ) + MAXIT = ICNTL(7) +C Check for the particular inconsistency between MAXIT and THRESH. +Cnew IF ( (MAXIT.LE.0) .AND. (CNTL(1).LE.ZERO) ) THEN +Cnew INFO(1) = -14 +Cnew IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9010) INFO(1),MAXIT,CNTL(1) +Cnew GO TO 99 +Cnew ENDIF + +C ICNTL(8) could be set by the user to indicate the frequency at which +C convergence should be checked when CNTL(1) is strictly positive. +C The default value used here 1 (e.g. check convergence every +C iteration). +C CHECK = ICNTL(8) + CHECK = 1 + IF (CNTL(1).LE.ZERO) CHECK = 0 + +C Prepare temporary data in working arrays as apropriate + K = 2*M + IF (ICNTL(6).EQ.0) K = 2*(M+N) + SETUP = 0 + IF ( (JOB.GE.2) .OR. (JOB.EQ.-1) ) THEN + SETUP = 1 +C Copy ABS(A(J))**JOB into DW(K+J), J=1..NNZ + IF (JOB.EQ.-1) THEN + DP = CNTL(2) + ELSE + DP = REAL(JOB) + ENDIF + DO 20 J = 1,NNZ + DW(K+J) = ABS(A(J))**DP + 20 CONTINUE +C Reset the Threshold to take into account the Hadamard p-th power + THRESH = ONE - (ABS(ONE-THRESH))**DP + ELSE + IF (ICNTL(5).EQ.0) THEN + SETUP = 1 +C Copy ABS(A(J)) into DW(K+J), J=1..NNZ + DO 30 J = 1,NNZ + DW(K+J) = ABS(A(J)) + 30 CONTINUE + ENDIF + ENDIF + +C Begin the computations (input matrix in Harwell-Boeing SPARSE format) +C We consider first the un-symmetric case : + IF (ICNTL(6).EQ.0) THEN +C +C Equilibrate matrix A in the infinity norm + IF (JOB.EQ.0) THEN +C IW(1:M+N), DW(M+N:2*(M+N)) are workspaces + IF (SETUP.EQ.1) THEN + CALL MC77ND(M,N,NNZ,JCST,IRN,DW(2*(M+N)+1),DW(1),DW(M+1), + & CHECK,THRESH,RINFO(1),MAXIT,INFO(3), + & IW(1),IW(M+1),DW(M+N+1),DW(2*M+N+1),INFO(1)) + ELSE + CALL MC77ND(M,N,NNZ,JCST,IRN,A,DW(1),DW(M+1), + & CHECK,THRESH,RINFO(1),MAXIT,INFO(3), + & IW(1),IW(M+1),DW(M+N+1),DW(2*M+N+1),INFO(1)) + ENDIF +C +C Equilibrate matrix A in the p-th norm, 1 <= p < +infinity + ELSE + IF (SETUP.EQ.1) THEN + CALL MC77OD(M,N,NNZ,JCST,IRN,DW(2*(M+N)+1),DW(1),DW(M+1), + & CHECK,THRESH,RINFO(1),MAXIT,INFO(3), + & IW(1),IW(M+1),DW(M+N+1),DW(2*M+N+1),INFO(1)) + ELSE + CALL MC77OD(M,N,NNZ,JCST,IRN,A,DW(1),DW(M+1), + & CHECK,THRESH,RINFO(1),MAXIT,INFO(3), + & IW(1),IW(M+1),DW(M+N+1),DW(2*M+N+1),INFO(1)) + ENDIF +C Reset the scaling factors to their Hadamard p-th root, if +C required and re-compute the actual value of the final error + IF ( (JOB.GE.2) .OR. (JOB.EQ.-1) ) THEN + IF (JOB.EQ.-1) THEN + DP = ONE / CNTL(2) + ELSE + DP = ONE / REAL(JOB) + ENDIF + RINFO(1) = ZERO + DO 40 I = 1,M + DW(I) = DW(I)**DP + IF (IW(I).NE.0) + & RINFO(1) = MAX( RINFO(1), ABS(ONE-DW(M+N+I)**DP) ) + 40 CONTINUE + RINFO(2) = ZERO + DO 50 J = 1,N + DW(M+J) = DW(M+J)**DP + IF (IW(M+J).NE.0) + & RINFO(2) = MAX( RINFO(2), ABS(ONE-DW(2*M+N+J)**DP) ) + 50 CONTINUE + ENDIF + ENDIF +C +C We treat then the symmetric (packed) case : + ELSE +C +C Equilibrate matrix A in the infinity norm + IF (JOB.EQ.0) THEN +C IW(1:M), DW(M:2*M) are workspaces + IF (SETUP.EQ.1) THEN + CALL MC77PD(M,NNZ,JCST,IRN,DW(2*M+1),DW(1), + & CHECK,THRESH,RINFO(1),MAXIT,INFO(3), + & IW(1),DW(M+1),INFO(1)) + ELSE + CALL MC77PD(M,NNZ,JCST,IRN,A,DW(1), + & CHECK,THRESH,RINFO(1),MAXIT,INFO(3), + & IW(1),DW(M+1),INFO(1)) + ENDIF +C +C Equilibrate matrix A in the p-th norm, 1 <= p < +infinity + ELSE + IF (SETUP.EQ.1) THEN + CALL MC77QD(M,NNZ,JCST,IRN,DW(2*M+1),DW(1), + & CHECK,THRESH,RINFO(1),MAXIT,INFO(3), + & IW(1),DW(M+1),INFO(1)) + ELSE + CALL MC77QD(M,NNZ,JCST,IRN,A,DW(1), + & CHECK,THRESH,RINFO(1),MAXIT,INFO(3), + & IW(1),DW(M+1),INFO(1)) + ENDIF +C Reset the scaling factors to their Hadamard p-th root, if +C required and re-compute the actual value of the final error + IF ( (JOB.GE.2) .OR. (JOB.EQ.-1) ) THEN + IF (JOB.EQ.-1) THEN + DP = ONE / CNTL(2) + ELSE + DP = ONE / REAL(JOB) + ENDIF + RINFO(1) = ZERO + DO 60 I = 1,M + DW(I) = DW(I)**DP + IF (IW(I).NE.0) + & RINFO(1) = MAX( RINFO(1), ABS(ONE-DW(M+I)**DP) ) + 60 CONTINUE + ENDIF + ENDIF + RINFO(2) = RINFO(1) +C + ENDIF +C End of the un-symmetric/symmetric IF statement +C The Harwell-Boeing sparse case has been treated + + +C Print diagnostics on output +C ICNTL(9) could be set by the user to monitor the level of diagnostics + IF (ICNTL(3).GE.0) THEN + WRITE(ICNTL(3),9030) (INFO(J),J=1,3),(RINFO(J),J=1,2) + IF (ICNTL(9).LT.2) THEN + WRITE(ICNTL(3),9031) (DW(I),I=1,M) + IF (ICNTL(6).EQ.0) + & WRITE(ICNTL(3),9032) (DW(M+J),J=1,N) + ENDIF + ENDIF + +C Return from subroutine. + 99 CONTINUE + RETURN + + 9001 FORMAT (' ****** Error in MC77A/AD. INFO(1) = ',I3, + & ' because ',(A),' = ',I10) + 9002 FORMAT (' ****** Error in MC77A/AD. INFO(1) = ',I3/ + & ' Bad input control flag.', + & ' Value of ICNTL(',I1,') = ',I8) + 9003 FORMAT (' ****** Error in MC77A/AD. INFO(1) = ',I3/ + & ' Input matrix is symmetric and N /= M.', + & ' Value of (N-M) = ',I8) + 9004 FORMAT (' ****** Error in MC77A/AD. INFO(1) = ',I3/ + & ' LIW too small, must be at least ',I8) + 9005 FORMAT (' ****** Error in MC77A/AD. INFO(1) = ',I3/ + & ' LDW too small, must be at least ',I8) + 9006 FORMAT (' ****** Error in MC77A/AD. INFO(1) = ',I3/ + & ' Column ',I8, + & ' contains an entry with invalid row index ',I8) + 9007 FORMAT (' ****** Error in MC77A/AD. INFO(1) = ',I3/ + & ' Column ',I8, + & ' contains two or more entries with row index ',I8) + 9008 FORMAT (' ****** Error in MC77A/AD. INFO(1) = ',I3/ + & ' Bad input REAL control parameter.', + & ' Value of CNTL(',I1,') = ',1PD14.4) + 9009 FORMAT (' ****** Error in MC77A/AD. INFO(1) = ',I3/ + & ' Only scaling in infinity norm is allowed', + & ' for rectangular matrices'/ + & ' JOB = ',I8/' M = ',I8/' N = ',I8) +C9010 FORMAT (' ****** Error in MC77A/AD. INFO(1) = ',I3/ +Cnew & ' Algorithm will loop indefinitely !!!', +Cnew & ' Check for inconsistency'/ +Cnew & ' Maximum number of iterations = ',I8/ +Cnew & ' Threshold for convergence = ',1PD14.4) + 9020 FORMAT (' ****** Input parameters for MC77A/AD:'/ + & ' JOB = ',I8/' M = ',I8/' N = ',I8/' NNZ = ',I8/ + & ' Max n.b. Iters. = ',I8/ + & ' Cvgce. Threshold = ',1PD14.4) + 9021 FORMAT (' JCST(1:N+1) = ',8I8/(15X,8I8)) + 9023 FORMAT (' IRN(1:NNZ) = ',8I8/(15X,8I8)) + 9024 FORMAT (' A(1:NNZ) = ',4(1PD14.4)/(15X,4(1PD14.4))) + 9030 FORMAT (' ****** Output parameters for MC77A/AD:'/ + & ' INFO(1:3) = ',3(2X,I8)/ + & ' RINFO(1:2) = ',2(1PD14.4)) + 9031 FORMAT (' DW(1:M) = ',4(1PD14.4)/(15X,4(1PD14.4))) + 9032 FORMAT (' DW(M+1:M+N) = ',4(1PD14.4)/(15X,4(1PD14.4))) +c9031 FORMAT (' DW(1:M) = ',5(F11.3)/(15X,5(F11.3))) +c9032 FORMAT (' DW(M+1:M+N) = ',5(F11.3)/(15X,5(F11.3))) + END + +C********************************************************************** + SUBROUTINE MC77ND(M,N,NNZ,JCST,IRN,A,D,E, + & CHECK,THRESH,ERR,MAXIT,NITER, + & IW,JW,DW,EW,INFO) +C +C ********************************************************************* +C *** Infinity norm --- The un-symmetric case *** +C *** Harwell-Boeing SPARSE format *** +C ********************************************************************* + INTEGER M,N,NNZ,MAXIT,NITER,CHECK,INFO + INTEGER JCST(N+1),IRN(NNZ),IW(M),JW(N) + DOUBLE PRECISION THRESH,ERR(2) + DOUBLE PRECISION A(NNZ),D(M),E(N),DW(M),EW(N) + +C Variables are described in MC77A/AD +C The un-symmetric matrix is stored in Harwell-Boeing sparse format. + +C Local variables and parameters + DOUBLE PRECISION ONE, ZERO + PARAMETER ( ONE=1.0D+00, ZERO=0.0D+00 ) + INTEGER I, J, K + DOUBLE PRECISION S +C Intrinsic functions + INTRINSIC SQRT, MAX, ABS + + INFO = 0 + NITER = 0 + ERR(1) = ZERO + ERR(2) = ZERO + +C Initialisations ... + DO 5 I = 1, M + IW(I) = 0 + DW(I) = ZERO + D(I) = ONE + 5 CONTINUE + DO 10 J = 1, N + JW(J) = 0 + EW(J) = ZERO + E(J) = ONE + 10 CONTINUE + +C Now, we compute the initial infinity-norm of each row and column. + DO 20 J=1,N + DO 30 K=JCST(J),JCST(J+1)-1 + I = IRN(K) + IF (EW(J).LT.A(K)) THEN + EW(J) = A(K) + JW(J) = I + ENDIF + IF (DW(I).LT.A(K)) THEN + DW(I) = A(K) + IW(I) = J + ENDIF + 30 CONTINUE + 20 CONTINUE + + DO 40 I=1,M + IF (IW(I).GT.0) D(I) = SQRT(DW(I)) + 40 CONTINUE + DO 45 J=1,N + IF (JW(J).GT.0) E(J) = SQRT(EW(J)) + 45 CONTINUE + + DO 50 J=1,N + I = JW(J) + IF (I.GT.0) THEN + IF (IW(I).EQ.J) THEN + IW(I) = -IW(I) + JW(J) = -JW(J) + ENDIF + ENDIF + 50 CONTINUE + + DO 60 I=1,M + IF (IW(I).GT.0) GOTO 99 + 60 CONTINUE + DO 65 J=1,N + IF (JW(J).GT.0) GOTO 99 + 65 CONTINUE + GOTO 200 + + +C Then, iterate on the normalisation of rows and columns. + 99 NITER = NITER + 1 + IF ( (NITER.GT.MAXIT) .AND. (MAXIT.GE.0) ) THEN + IF (CHECK.GT.0) INFO = 1 + NITER = NITER - 1 + GOTO 100 + ENDIF + + DO 110 I=1,M + DW(I) = ZERO + 110 CONTINUE + DO 115 J=1,N + EW(J) = ZERO + 115 CONTINUE + + DO 120 J=1,N + IF (JW(J).GT.0) THEN + DO 130 K=JCST(J),JCST(J+1)-1 + I = IRN(K) + S = A(K) / (D(I)*E(J)) + IF (EW(J).LT.S) THEN + EW(J) = S + JW(J) = I + ENDIF + IF (IW(I).GT.0) THEN + IF (DW(I).LT.S) THEN + DW(I) = S + IW(I) = J + ENDIF + ENDIF + 130 CONTINUE + ELSE + DO 140 K=JCST(J),JCST(J+1)-1 + I = IRN(K) + IF (IW(I).GT.0) THEN + S = A(K) / (D(I)*E(J)) + IF (DW(I).LT.S) THEN + DW(I) = S + IW(I) = J + ENDIF + ENDIF + 140 CONTINUE + ENDIF + 120 CONTINUE + + DO 150 I=1,M + IF (IW(I).GT.0) D(I) = D(I)*SQRT(DW(I)) + 150 CONTINUE + DO 155 J=1,N + IF (JW(J).GT.0) E(J) = E(J)*SQRT(EW(J)) + 155 CONTINUE + + DO 160 J=1,N + I = JW(J) + IF (I.GT.0) THEN + IF (IW(I).EQ.J) THEN + IW(I) = -IW(I) + JW(J) = -JW(J) + ENDIF + ENDIF + 160 CONTINUE + +C Stopping criterion : + IF (CHECK.LE.0) GOTO 99 +C IF (MOD(NITER,CHECK).NE.0) GOTO 99 + +C N.B. the test is performed on the basis of the values in arrays +C DW and EW which, in fact, correspond to the row and column +C norms of the scaled matrix at the previous iteration ... + 100 IF (INFO.NE.0) GOTO 200 + ERR(1) = ZERO + DO 170 I=1,M + IF (IW(I).GT.0) ERR(1) = MAX( ERR(1), ABS(ONE-DW(I)) ) + 170 CONTINUE + ERR(2) = ZERO + DO 175 J=1,N + IF (JW(J).GT.0) ERR(2) = MAX( ERR(2), ABS(ONE-EW(J)) ) + 175 CONTINUE + IF ( (ERR(1).LT.THRESH) .AND. (ERR(2).LT.THRESH) ) GOTO 200 + + IF (CHECK.GT.0) GOTO 99 + + 200 RETURN + END + +C********************************************************************** + SUBROUTINE MC77OD(M,N,NNZ,JCST,IRN,A,D,E, + & CHECK,THRESH,ERR,MAXIT,NITER, + & IW,JW,DW,EW,INFO) +C +C ********************************************************************* +C *** One norm --- The un-symmetric case *** +C *** Harwell-Boeing SPARSE format *** +C ********************************************************************* + INTEGER M,N,NNZ,MAXIT,NITER,CHECK,INFO + INTEGER JCST(N+1),IRN(NNZ),IW(M),JW(N) + DOUBLE PRECISION THRESH,ERR(2) + DOUBLE PRECISION A(NNZ),D(M),E(N),DW(M),EW(N) + +C Variables are described in MC77A/AD +C The un-symmetric matrix is stored in Harwell-Boeing sparse format. + +C Local variables and parameters + DOUBLE PRECISION ONE, ZERO + PARAMETER ( ONE=1.0D+00, ZERO=0.0D+00 ) + INTEGER I, J, K + DOUBLE PRECISION S +C Intrinsic functions + INTRINSIC SQRT, MAX, ABS + + INFO = 0 + NITER = 0 + ERR(1) = ZERO + ERR(2) = ZERO + +C Initialisations ... + DO 10 I = 1, M + IW(I) = 0 + DW(I) = ZERO + D(I) = ONE + 10 CONTINUE + DO 15 J = 1, N + JW(J) = 0 + EW(J) = ZERO + E(J) = ONE + 15 CONTINUE + +C Now, we compute the initial one-norm of each row and column. + DO 20 J=1,N + DO 30 K=JCST(J),JCST(J+1)-1 + IF (A(K).GT.ZERO) THEN + I = IRN(K) + EW(J) = EW(J) + A(K) + IF (JW(J).EQ.0) THEN + JW(J) = K + ELSE + JW(J) = -1 + ENDIF + DW(I) = DW(I) + A(K) + IF (IW(I).EQ.0) THEN + IW(I) = K + ELSE + IW(I) = -1 + ENDIF + ENDIF + 30 CONTINUE + 20 CONTINUE + + DO 40 K=1,M + IF (IW(K).NE.0) D(K) = SQRT(DW(K)) + 40 CONTINUE + DO 45 K=1,N + IF (JW(K).NE.0) E(K) = SQRT(EW(K)) + 45 CONTINUE + + DO 50 J=1,N + K = JW(J) + IF (K.GT.0) THEN + I = IRN(K) + IF (IW(I).EQ.K) THEN + IW(I) = 0 + JW(J) = 0 + ENDIF + ENDIF + 50 CONTINUE + + DO 60 K=1,M + IF ( (IW(K).NE.0) .OR. (JW(K).NE.0) ) GOTO 99 + 60 CONTINUE +C Since we enforce M=N in the case of the one-norm, the tests can be +C done in one shot. For future relases, (M/=N) we should incorporate +C instead : +Cnew DO 60 I=1,M +Cnew IF (IW(I).NE.0) GOTO 99 +Cne60 CONTINUE +Cnew DO 65 J=1,N +Cnew IF (JW(J).NE.0) GOTO 99 +Cne65 CONTINUE + GOTO 200 + + +C Then, iterate on the normalisation of rows and columns. + 99 NITER = NITER + 1 + IF ( (NITER.GT.MAXIT) .AND. (MAXIT.GE.0) ) THEN + IF (CHECK.GT.0) INFO = 1 + NITER = NITER - 1 + GOTO 100 + ENDIF + + DO 110 I=1,M + DW(I) = ZERO + 110 CONTINUE + DO 115 J=1,N + EW(J) = ZERO + 115 CONTINUE + + DO 120 J=1,N + IF (JW(J).NE.0) THEN + DO 130 K=JCST(J),JCST(J+1)-1 + I = IRN(K) + S = A(K) / (D(I)*E(J)) + EW(J) = EW(J) + S + DW(I) = DW(I) + S + 130 CONTINUE + ENDIF + 120 CONTINUE + + DO 150 I=1,M + IF (IW(I).NE.0) D(I) = D(I)*SQRT(DW(I)) + 150 CONTINUE + DO 155 J=1,N + IF (JW(J).NE.0) E(J) = E(J)*SQRT(EW(J)) + 155 CONTINUE + +C Stopping criterion : + IF (CHECK.LE.0) GOTO 99 +C IF (MOD(NITER,CHECK).NE.0) GOTO 99 + +C N.B. the test is performed on the basis of the values in arrays +C DW and EW which, in fact, correspond to the row and column +C norms of the scaled matrix at the previous iteration ... + 100 IF (INFO.NE.0) GOTO 200 + ERR(1) = ZERO + DO 170 I=1,M + IF (IW(I).NE.0) ERR(1) = MAX( ERR(1), ABS(ONE-DW(I)) ) + 170 CONTINUE + ERR(2) = ZERO + DO 175 J=1,N + IF (JW(J).NE.0) ERR(2) = MAX( ERR(2), ABS(ONE-EW(J)) ) + 175 CONTINUE + IF ( (ERR(1).LT.THRESH) .AND. (ERR(2).LT.THRESH) ) GOTO 200 + + IF (CHECK.GT.0) GOTO 99 + + 200 RETURN + END + +C********************************************************************** + SUBROUTINE MC77PD(N,NNZ,JCST,IRN,A,DE, + & CHECK,THRESH,ERR,MAXIT,NITER, + & IJW,DEW,INFO) +C +C ********************************************************************* +C *** Infinity norm --- The symmetric-packed case *** +C *** Harwell-Boeing SPARSE format *** +C ********************************************************************* + INTEGER N,NNZ,MAXIT,NITER,CHECK,INFO + INTEGER JCST(N+1),IRN(NNZ),IJW(N) + DOUBLE PRECISION THRESH,ERR + DOUBLE PRECISION A(NNZ),DE(N),DEW(N) + +C Variables are described in MC77A/AD +C The lower triangular part of the symmetric matrix is stored +C in Harwell-Boeing symmetric-packed sparse format. + +C Local variables and parameters + DOUBLE PRECISION ONE, ZERO + PARAMETER ( ONE=1.0D+00, ZERO=0.0D+00 ) + INTEGER I, J, K + DOUBLE PRECISION S +C Intrinsic functions + INTRINSIC SQRT, MAX, ABS + + INFO = 0 + NITER = 0 + ERR = ZERO + +C Initialisations ... + DO 10 K = 1, N + IJW(K) = 0 + DEW(K) = ZERO + DE(K) = ONE + 10 CONTINUE + +C Now, we compute the initial infinity-norm of each row and column. + DO 20 J=1,N + DO 30 K=JCST(J),JCST(J+1)-1 + I = IRN(K) + IF (DEW(J).LT.A(K)) THEN + DEW(J) = A(K) + IJW(J) = I + ENDIF + IF (DEW(I).LT.A(K)) THEN + DEW(I) = A(K) + IJW(I) = J + ENDIF + 30 CONTINUE + 20 CONTINUE + + DO 40 K=1,N + IF (IJW(K).GT.0) DE(K) = SQRT(DEW(K)) + 40 CONTINUE + + DO 50 J=1,N + I = IJW(J) + IF (I.GT.0) THEN + IF (IJW(I).EQ.J) THEN + IJW(I) = -IJW(I) + IF (I.NE.J) IJW(J) = -IJW(J) + ENDIF + ENDIF + 50 CONTINUE + + DO 60 K=1,N + IF (IJW(K).GT.0) GOTO 99 + 60 CONTINUE + GOTO 200 + + +C Then, iterate on the normalisation of rows and columns. + 99 NITER = NITER + 1 + IF ( (NITER.GT.MAXIT) .AND. (MAXIT.GE.0) ) THEN + IF (CHECK.GT.0) INFO = 1 + NITER = NITER - 1 + GOTO 100 + ENDIF + + DO 110 K=1,N + DEW(K) = ZERO + 110 CONTINUE + + DO 120 J=1,N + IF (IJW(J).GT.0) THEN + DO 130 K=JCST(J),JCST(J+1)-1 + I = IRN(K) + S = A(K) / (DE(I)*DE(J)) + IF (DEW(J).LT.S) THEN + DEW(J) = S + IJW(J) = I + ENDIF + IF (IJW(I).GT.0) THEN + IF (DEW(I).LT.S) THEN + DEW(I) = S + IJW(I) = J + ENDIF + ENDIF + 130 CONTINUE + ELSE + DO 140 K=JCST(J),JCST(J+1)-1 + I = IRN(K) + IF (IJW(I).GT.0) THEN + S = A(K) / (DE(I)*DE(J)) + IF (DEW(I).LT.S) THEN + DEW(I) = S + IJW(I) = J + ENDIF + ENDIF + 140 CONTINUE + ENDIF + 120 CONTINUE + + DO 150 K=1,N + IF (IJW(K).GT.0) DE(K) = DE(K)*SQRT(DEW(K)) + 150 CONTINUE + + DO 160 J=1,N + I = IJW(J) + IF (I.GT.0) THEN + IF (IJW(I).EQ.J) THEN + IJW(I) = -IJW(I) + IF (I.NE.J) IJW(J) = -IJW(J) + ENDIF + ENDIF + 160 CONTINUE + +C Stopping criterion : + IF (CHECK.LE.0) GOTO 99 +C IF (MOD(NITER,CHECK).NE.0) GOTO 99 + +C N.B. the test is performed on the basis of the values in array +C DEW which, in fact, correspond to the row and column +C norms of the scaled matrix at the previous iteration ... + 100 IF (INFO.NE.0) GOTO 200 + ERR = ZERO + DO 170 K=1,N + IF (IJW(K).GT.0) ERR = MAX( ERR, ABS(ONE-DEW(K)) ) + 170 CONTINUE + IF (ERR.LT.THRESH) GOTO 200 + + IF (CHECK.GT.0) GOTO 99 + + 200 RETURN + END + +C********************************************************************** + SUBROUTINE MC77QD(N,NNZ,JCST,IRN,A,DE, + & CHECK,THRESH,ERR,MAXIT,NITER, + & IJW,DEW,INFO) +C +C ********************************************************************* +C *** One norm --- The symmetric-packed case *** +C *** Harwell-Boeing SPARSE format *** +C ********************************************************************* + INTEGER N,NNZ,MAXIT,NITER,CHECK,INFO + INTEGER JCST(N+1),IRN(NNZ),IJW(N) + DOUBLE PRECISION THRESH,ERR + DOUBLE PRECISION A(NNZ),DE(N),DEW(N) + +C Variables are described in MC77A/AD +C The lower triangular part of the symmetric matrix is stored +C in Harwell-Boeing symmetric-packed sparse format. + +C Local variables and parameters + DOUBLE PRECISION ONE, ZERO + PARAMETER ( ONE=1.0D+00, ZERO=0.0D+00 ) + INTEGER I, J, K + DOUBLE PRECISION S +C Intrinsic functions + INTRINSIC SQRT, MAX, ABS + + INFO = 0 + NITER = 0 + ERR = ZERO + +C Initialisations ... + DO 10 K = 1, N + IJW(K) = 0 + DEW(K) = ZERO + DE(K) = ONE + 10 CONTINUE + +C Now, we compute the initial one-norm of each row and column. + DO 20 J=1,N + DO 30 K=JCST(J),JCST(J+1)-1 + IF (A(K).GT.ZERO) THEN + DEW(J) = DEW(J) + A(K) + IF (IJW(J).EQ.0) THEN + IJW(J) = K + ELSE + IJW(J) = -1 + ENDIF + I = IRN(K) + IF (I.NE.J) THEN + DEW(I) = DEW(I) + A(K) + IJW(I) = IJW(I) + 1 + IF (IJW(I).EQ.0) THEN + IJW(I) = K + ELSE + IJW(I) = -1 + ENDIF + ENDIF + ENDIF + 30 CONTINUE + 20 CONTINUE + + DO 40 K=1,N + IF (IJW(K).NE.0) DE(K) = SQRT(DEW(K)) + 40 CONTINUE + + DO 50 J=1,N + K = IJW(J) + IF (K.GT.0) THEN + I = IRN(K) + IF (IJW(I).EQ.K) THEN + IJW(I) = 0 + IJW(J) = 0 + ENDIF + ENDIF + 50 CONTINUE + + DO 60 K=1,N + IF (IJW(K).NE.0) GOTO 99 + 60 CONTINUE + GOTO 200 + + +C Then, iterate on the normalisation of rows and columns. + 99 NITER = NITER + 1 + IF ( (NITER.GT.MAXIT) .AND. (MAXIT.GE.0) ) THEN + IF (CHECK.GT.0) INFO = 1 + NITER = NITER - 1 + GOTO 100 + ENDIF + + DO 110 K=1,N + DEW(K) = ZERO + 110 CONTINUE + + DO 120 J=1,N + IF (IJW(J).NE.0) THEN + DO 130 K=JCST(J),JCST(J+1)-1 + I = IRN(K) + S = A(K) / (DE(I)*DE(J)) + DEW(J) = DEW(J) + S + IF (I.NE.J) DEW(I) = DEW(I) + S + 130 CONTINUE + ENDIF + 120 CONTINUE + + DO 150 K=1,N + IF (IJW(K).NE.0) DE(K) = DE(K)*SQRT(DEW(K)) + 150 CONTINUE + +C Stopping criterion : + IF (CHECK.LE.0) GOTO 99 +C IF (MOD(NITER,CHECK).NE.0) GOTO 99 + +C N.B. the test is performed on the basis of the values in array +C DEW which, in fact, correspond to the row and column +C norms of the scaled matrix at the previous iteration ... + 100 IF (INFO.NE.0) GOTO 200 + ERR = ZERO + DO 170 K=1,N + IF (IJW(K).NE.0) ERR = MAX( ERR, ABS(ONE-DEW(K)) ) + 170 CONTINUE + IF (ERR.LT.THRESH) GOTO 200 + + IF (CHECK.GT.0) GOTO 99 + + 200 RETURN + END + +C********************************************************************** +C*** DRIVER FOR THE GENERAL SPARSE FORMAT *** +C********************************************************************** + SUBROUTINE MC77BD(JOB,M,N,NNZ,IRN,JCN,A,IW,LIW,DW,LDW, + & ICNTL,CNTL,INFO,RINFO) +C +C Purpose +C ======= +C +C This subroutine computes scaling factors D(i), i=1..M, and E(j), +C j=1..N, for an MxN sparse matrix A = {a_ij} so that the scaled matrix +C D^{-1}*A*E^{-1} has both rows and columns norms all equal or close to +C 1. The rectangular case (M/=N) is, for the moment, only allowed for +C equilibration in the infinity norm, a particular case for which the +C convergence is ensured in all cases and trivial to monitor. See [1]. +C +C Parameters +C ========== +C + INTEGER LICNTL, LCNTL, LINFO, LRINFO + PARAMETER ( LICNTL=10, LCNTL=10, LINFO=10, LRINFO=10 ) + INTEGER ICNTL(LICNTL),INFO(LINFO) + DOUBLE PRECISION CNTL(LCNTL),RINFO(LRINFO) +C + INTEGER JOB,M,N,NNZ,LIW,LDW + INTEGER JCN(NNZ),IRN(NNZ),IW(LIW) + DOUBLE PRECISION A(NNZ),DW(LDW) +C +C JOB is an INTEGER variable which must be set by the user to +C control the action. It is not altered by the subroutine. +C Possible values for JOB are: +C 0 Equilibrate the infinity norm of rows and columns in matrix A. +C 1 Equilibrate the one norm of rows and columns in matrix A. +C p Equilibrate the p-th norm (p>=2) of rows and columns in matrix A. +C -1 Equilibrate the p-th norm of rows and columns in matrix A, with +C a strictly positive REAL parameter p given in CNTL(2). +C Restriction: JOB >= -1. +C +C M is an INTEGER variable which must be set by the user to the +C number of rows in matrix A. It is not altered by the subroutine. +C Restriction: M >= 1. +C +C N is an INTEGER variable which must be set by the user to the +C number of columns in matrix A. It is not altered by the subroutine. +C Restriction: N >= 1. +C If ICNTL(6) /= 0 (symmetric matrix), N must be equal to M. +C +C NNZ is an INTEGER variable which must be set by the user to the number +C of entries in the matrix. It is not altered by the subroutine. +C Restriction: NNZ >= 1. +C +C IRN is an INTEGER array of length NNZ. +C IRN(K), K=1..NNZ, must be set by the user to hold the row indices +C of the entries in the matrix. +C The array IRN is not altered by the subroutine. +C Restriction: +C Out-of-range indices and duplicates are not allowed. +C +C JCN is an INTEGER array of NNZ. +C JCN(J), J=1..NNZ, must be set by the user to hold the column indices +C of the entries in the matrix. +C The array JCN is not altered by the subroutine. +C Restriction: +C Out-of-range indices and duplicates are not allowed. +C +C A is a REAL (DOUBLE PRECISION in the D-version) array of length NNZ. +C The user must set A(K), K=1..NNZ, to the numerical value of the +C entry that corresponds to IRN(K). +C It is not altered by the subroutine. +C +C LIW is an INTEGER variable that must be set by the user to +C the length of array IW. It is not altered by the subroutine. +C Restriction: +C If ICNTL(6) == 0: LIW >= M+N +C If ICNTL(6) /= 0: LIW >= M +C +C IW is an INTEGER array of length LIW that is used for workspace. +C +C LDW is an INTEGER variable that must be set by the user to the +C length of array DW. It is not altered by the subroutine. +C Restriction: +C If ICNTL(5) = 0 and ICNTL(6) == 0: LDW >= NNZ + 2*(M+N) +C If ICNTL(5) = 1 and ICNTL(6) == 0: LDW >= 2*(M+N) +C If ICNTL(5) = 0 and ICNTL(6) /= 0: LDW >= NNZ + 2*M +C If ICNTL(5) = 1 and ICNTL(6) /= 0: LDW >= 2*M +C +C DW is a REAL (DOUBLE PRECISION in the D-version) array of length LDW +C that need not be set by the user. +C On return, DW(i) contains d_i, i=1..M, the diagonal entries in +C the row-scaling matrix D, and when the input matrix A is +C unsymmetric, DW(M+j) contains e_j, j=1..N, the diagonal entries in +C the column-scaling matrix E. +C +C ICNTL is an INTEGER array of length 10. Its components control the +C output of MC77A/AD and must be set by the user before calling +C MC77A/AD. They are not altered by the subroutine. +C See MC77I/ID for details. +C +C CNTL is a REAL (DOUBLE PRECISION in the D-version) array of length 10. +C Its components control the output of MC77A/AD and must be set by the +C user before calling MC77A/AD. They are not altered by the +C subroutine. +C See MC77I/ID for details. +C +C INFO is an INTEGER array of length 10 which need not be set by the +C user. INFO(1) is set non-negative to indicate success. A negative +C value is returned if an error occurred, a positive value if a +C warning occurred. INFO(2) holds further information on the error. +C On exit from the subroutine, INFO(1) will take one of the +C following values: +C 0 : successful entry (for structurally nonsingular matrix). +C +1 : The maximum number of iterations in ICNTL(7) has been reached. +C -1 : M < 1. Value of M held in INFO(2). +C -2 : N < 1. Value of N held in INFO(2). +C -3 : ICNTL(6) /= 0 (input matrix is symmetric) and N /= M. +C Value of (N-M) held in INFO(2). +C -4 : NNZ < 1. Value of NNZ held in INFO(2). +C -5 : the defined length LIW violates the restriction on LIW. +C Value of LIW required given by INFO(2). +C -6 : the defined length LDW violates the restriction on LDW. +C Value of LDW required given by INFO(2). +C -7 : entries are found whose row indices are out of range. +C INFO(2) contains an index pointing to a value in +C IRN and JCN in which such an entry is found. +C -8 : repeated entries are found. +C INFO(2) contains an index pointing to a value in +C IRN and JCN in which such an entry is found. +C -9 : An entry corresponding to an element in the upper triangular +C part of the matrix is found in the input data (ICNTL(6)} \= 0). +C -10 : ICNTL(7) is out of range and INFO(2) contains its value. +C -11 : CNTL(2) is out of range. +C -12 : JOB < -1. Value of JOB held in INFO(2). +C -13 : JOB /= 0 and N /= M. This is a restriction of the algorithm in +C its present stage, e.g. for rectangular matrices, only the +C scaling in infinity norm is allowed. Value of JOB held in +C INFO(2). +C INFO(3) returns the number of iterations performed. +C INFO(4) to INFO(10) are not currently used and are set to zero by +C the routine. +C +C RINFO is a REAL (DOUBLE PRECISION in the D-version) array of length 10 +C which need not be set by the user. +C When CNTL(1) is strictly positive, RINFO(1) will contain on exit the +C maximum distance of all row norms to 1, and RINFO(2) will contain on +C exit the maximum distance of all column norms to 1. +C If ICNTL(6) /= 0 (indicating that the input matrix is symmetric), +C RINFO(2) is not used since the row-scaling equals the column scaling +C in this case. +C RINFO(3) to RINFO(10) are not currently used and are set to zero. +C +C References: +C [1] D. R. Ruiz, (2001), +C "A scaling algorithm to equilibrate both rows and columns norms +C in matrices", +C Technical Report RAL-TR-2001-034, RAL, Oxfordshire, England, +C and Report RT/APO/01/4, ENSEEIHT-IRIT, Toulouse, France. + +C Local variables and parameters + DOUBLE PRECISION ONE, ZERO + PARAMETER ( ONE=1.0D+00, ZERO=0.0D+00 ) + DOUBLE PRECISION THRESH, DP + INTEGER I, J, K, MAXIT, CHECK, SETUP +C External routines and functions + EXTERNAL MC77RD,MC77SD,MC77TD,MC77UD +C Intrinsic functions + INTRINSIC ABS,MAX + +C Reset informational output values + INFO(1) = 0 + INFO(2) = 0 + INFO(3) = 0 + RINFO(1) = ZERO + RINFO(2) = ZERO +C Check value of JOB + IF (JOB.LT.-1) THEN + INFO(1) = -12 + INFO(2) = JOB + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9001) INFO(1),'JOB',JOB + GO TO 99 + ENDIF +C Check bad values in ICNTL +Cnew IF (ICNTL(7).LT.0) THEN + IF (ICNTL(7).LE.0) THEN + INFO(1) = -10 + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9002) INFO(1),7,ICNTL(7) + GO TO 99 + ENDIF +C Check bad values in CNTL + IF ((JOB.EQ.-1) .AND. (CNTL(2).LT.ONE)) THEN + INFO(1) = -11 + INFO(2) = 2 + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9008) INFO(1),2,CNTL(2) + GO TO 99 + ENDIF +C Check value of M + IF (M.LT.1) THEN + INFO(1) = -1 + INFO(2) = M + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9001) INFO(1),'M',M + GO TO 99 + ENDIF +C Check value of N + IF (N.LT.1) THEN + INFO(1) = -2 + INFO(2) = N + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9001) INFO(1),'N',N + GO TO 99 + ENDIF +C Symmetric case: M must be equal to N + IF ( (ICNTL(6).NE.0) .AND. (N.NE.M) ) THEN + INFO(1) = -3 + INFO(2) = N-M + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9003) INFO(1),(N-M) + GO TO 99 + ENDIF +C For rectangular matrices, only scaling in infinity norm is allowed + IF ( (JOB.NE.0) .AND. (N.NE.M) ) THEN + INFO(1) = -13 + INFO(2) = JOB + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9009) INFO(1),JOB,M,N + GO TO 99 + ENDIF +C Check value of NNZ + IF (NNZ.LT.1) THEN + INFO(1) = -4 + INFO(2) = NNZ + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9001) INFO(1),'NNZ',NNZ + GO TO 99 + ENDIF +C Check LIW + K = M + IF (ICNTL(6).EQ.0) K = M+N + IF (LIW.LT.K) THEN + INFO(1) = -5 + INFO(2) = K + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9004) INFO(1),K + GO TO 99 + ENDIF +C Check LDW + K = 2*M + IF (ICNTL(6).EQ.0) K = 2*(M+N) + IF ( (ICNTL(5).EQ.0) .OR. (JOB.GE.2) .OR. (JOB.EQ.-1) ) + & K = K + NNZ + IF (LDW.LT.K) THEN + INFO(1) = -6 + INFO(2) = K + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9005) INFO(1),K + GO TO 99 + ENDIF +C Check row indices. Use IW(1:M) as workspace +C General sparse format : + IF (ICNTL(4).EQ.0) THEN + DO 6 K = 1,NNZ + I = IRN(K) + J = JCN(K) +C Check for row indices that are out of range + IF (I.LT.1 .OR. I.GT.M .OR. J.LT.1 .OR. J.GT.N) THEN + INFO(1) = -7 + INFO(2) = K + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9006) INFO(1),K,I,J + GO TO 99 + ENDIF + IF (ICNTL(6).NE.0 .AND. I.LT.J) THEN + INFO(1) = -9 + INFO(2) = K + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9006) INFO(1),K,I,J + GO TO 99 + ENDIF + 6 CONTINUE +C Check for repeated row indices within a column + DO 7 I = 1,M + IW(I) = 0 + 7 CONTINUE + DO 9 J = 1,N + DO 8 K = 1,NNZ + IF (JCN(K).EQ.J) THEN + I = IRN(K) + IF (IW(I).EQ.J) THEN + INFO(1) = -8 + INFO(2) = K + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9007) INFO(1),K,I,J + GO TO 99 + ELSE + IW(I) = J + ENDIF + ENDIF + 8 CONTINUE + 9 CONTINUE + ENDIF + +C Print diagnostics on input +C ICNTL(9) could be set by the user to monitor the level of diagnostics + IF (ICNTL(3).GE.0) THEN + WRITE(ICNTL(3),9020) JOB,M,N,NNZ,ICNTL(7),CNTL(1) +C General sparse format : + IF (ICNTL(9).LT.1) THEN + WRITE(ICNTL(3),9022) (JCN(J),J=1,NNZ) + WRITE(ICNTL(3),9023) (IRN(J),J=1,NNZ) + WRITE(ICNTL(3),9024) (A(J),J=1,NNZ) + ENDIF + ENDIF + +C Set components of INFO to zero + DO 10 I=1,10 + INFO(I) = 0 + RINFO(I) = ZERO + 10 CONTINUE + +C Set the convergence threshold and the maximum number of iterations + THRESH = MAX( ZERO, CNTL(1) ) + MAXIT = ICNTL(7) +C Check for the particular inconsistency between MAXIT and THRESH. +Cnew IF ( (MAXIT.LE.0) .AND. (CNTL(1).LE.ZERO) ) THEN +Cnew INFO(1) = -14 +Cnew IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9010) INFO(1),MAXIT,CNTL(1) +Cnew GO TO 99 +Cnew ENDIF + +C ICNTL(8) could be set by the user to indicate the frequency at which +C convergence should be checked when CNTL(1) is strictly positive. The +C default value used here 1 (e.g. check convergence every iteration). +C CHECK = ICNTL(8) + CHECK = 1 + IF (CNTL(1).LE.ZERO) CHECK = 0 + +C Prepare temporary data in working arrays as apropriate + K = 2*M + IF (ICNTL(6).EQ.0) K = 2*(M+N) + SETUP = 0 + IF ( (JOB.GE.2) .OR. (JOB.EQ.-1) ) THEN + SETUP = 1 +C Copy ABS(A(J))**JOB into DW(K+J), J=1..NNZ + IF (JOB.EQ.-1) THEN + DP = CNTL(2) + ELSE + DP = REAL(JOB) + ENDIF + DO 20 J = 1,NNZ + DW(K+J) = ABS(A(J))**DP + 20 CONTINUE +C Reset the Threshold to take into account the Hadamard p-th power + THRESH = ONE - (ABS(ONE-THRESH))**DP + ELSE + IF (ICNTL(5).EQ.0) THEN + SETUP = 1 +C Copy ABS(A(J)) into DW(K+J), J=1..NNZ + DO 30 J = 1,NNZ + DW(K+J) = ABS(A(J)) + 30 CONTINUE + ENDIF + ENDIF + +C Begin the computations (input matrix in general SPARSE format) ... +C We consider first the un-symmetric case : + IF (ICNTL(6).EQ.0) THEN +C +C Equilibrate matrix A in the infinity norm + IF (JOB.EQ.0) THEN +C IW(1:M+N), DW(M+N:2*(M+N)) are workspaces + IF (SETUP.EQ.1) THEN + CALL MC77RD(M,N,NNZ,JCN,IRN,DW(2*(M+N)+1),DW(1),DW(M+1), + & CHECK,THRESH,RINFO(1),MAXIT,INFO(3), + & IW(1),IW(M+1),DW(M+N+1),DW(2*M+N+1),INFO(1)) + ELSE + CALL MC77RD(M,N,NNZ,JCN,IRN,A,DW(1),DW(M+1), + & CHECK,THRESH,RINFO(1),MAXIT,INFO(3), + & IW(1),IW(M+1),DW(M+N+1),DW(2*M+N+1),INFO(1)) + ENDIF +C +C Equilibrate matrix A in the p-th norm, 1 <= p < +infinity + ELSE + IF (SETUP.EQ.1) THEN + CALL MC77SD(M,N,NNZ,JCN,IRN,DW(2*(M+N)+1),DW(1),DW(M+1), + & CHECK,THRESH,RINFO(1),MAXIT,INFO(3), + & IW(1),IW(M+1),DW(M+N+1),DW(2*M+N+1),INFO(1)) + ELSE + CALL MC77SD(M,N,NNZ,JCN,IRN,A,DW(1),DW(M+1), + & CHECK,THRESH,RINFO(1),MAXIT,INFO(3), + & IW(1),IW(M+1),DW(M+N+1),DW(2*M+N+1),INFO(1)) + ENDIF +C Reset the scaling factors to their Hadamard p-th root, if +C required and re-compute the actual value of the final error + IF ( (JOB.GE.2) .OR. (JOB.EQ.-1) ) THEN + IF (JOB.EQ.-1) THEN + DP = ONE / CNTL(2) + ELSE + DP = ONE / REAL(JOB) + ENDIF + RINFO(1) = ZERO + DO 40 I = 1,M + DW(I) = DW(I)**DP + IF (IW(I).NE.0) + & RINFO(1) = MAX( RINFO(1), ABS(ONE-DW(M+N+I)**DP) ) + 40 CONTINUE + RINFO(2) = ZERO + DO 50 J = 1,N + DW(M+J) = DW(M+J)**DP + IF (IW(M+J).NE.0) + & RINFO(2) = MAX( RINFO(2), ABS(ONE-DW(2*M+N+J)**DP) ) + 50 CONTINUE + ENDIF + ENDIF +C +C We treat then the symmetric (packed) case : + ELSE +C +C Equilibrate matrix A in the infinity norm + IF (JOB.EQ.0) THEN +C IW(1:M), DW(M:2*M) are workspaces + IF (SETUP.EQ.1) THEN + CALL MC77TD(M,NNZ,JCN,IRN,DW(2*M+1),DW(1), + & CHECK,THRESH,RINFO(1),MAXIT,INFO(3), + & IW(1),DW(M+1),INFO(1)) + ELSE + CALL MC77TD(M,NNZ,JCN,IRN,A,DW(1), + & CHECK,THRESH,RINFO(1),MAXIT,INFO(3), + & IW(1),DW(M+1),INFO(1)) + ENDIF +C +C Equilibrate matrix A in the p-th norm, 1 <= p < +infinity + ELSE + IF (SETUP.EQ.1) THEN + CALL MC77UD(M,NNZ,JCN,IRN,DW(2*M+1),DW(1), + & CHECK,THRESH,RINFO(1),MAXIT,INFO(3), + & IW(1),DW(M+1),INFO(1)) + ELSE + CALL MC77UD(M,NNZ,JCN,IRN,A,DW(1), + & CHECK,THRESH,RINFO(1),MAXIT,INFO(3), + & IW(1),DW(M+1),INFO(1)) + ENDIF +C Reset the scaling factors to their Hadamard p-th root, if +C required and re-compute the actual value of the final error + IF ( (JOB.GE.2) .OR. (JOB.EQ.-1) ) THEN + IF (JOB.EQ.-1) THEN + DP = ONE / CNTL(2) + ELSE + DP = ONE / REAL(JOB) + ENDIF + RINFO(1) = ZERO + DO 60 I = 1,M + DW(I) = DW(I)**DP + IF (IW(I).NE.0) + & RINFO(1) = MAX( RINFO(1), ABS(ONE-DW(M+I)**DP) ) + 60 CONTINUE + ENDIF + ENDIF + RINFO(2) = RINFO(1) +C + ENDIF +C End of the un-symmetric/symmetric IF statement +C The general sparse case has been treated + + +C Print diagnostics on output +C ICNTL(9) could be set by the user to monitor the level of diagnostics + IF (ICNTL(3).GE.0) THEN + WRITE(ICNTL(3),9030) (INFO(J),J=1,3),(RINFO(J),J=1,2) + IF (ICNTL(9).LT.2) THEN + WRITE(ICNTL(3),9031) (DW(I),I=1,M) + IF (ICNTL(6).EQ.0) + & WRITE(ICNTL(3),9032) (DW(M+J),J=1,N) + ENDIF + ENDIF + +C Return from subroutine. + 99 CONTINUE + RETURN + + 9001 FORMAT (' ****** Error in MC77B/BD. INFO(1) = ',I3, + & ' because ',(A),' = ',I10) + 9002 FORMAT (' ****** Error in MC77B/BD. INFO(1) = ',I3/ + & ' Bad input control flag.', + & ' Value of ICNTL(',I1,') = ',I8) + 9003 FORMAT (' ****** Error in MC77B/BD. INFO(1) = ',I3/ + & ' Input matrix is symmetric and N /= M.', + & ' Value of (N-M) = ',I8) + 9004 FORMAT (' ****** Error in MC77B/BD. INFO(1) = ',I3/ + & ' LIW too small, must be at least ',I8) + 9005 FORMAT (' ****** Error in MC77B/BD. INFO(1) = ',I3/ + & ' LDW too small, must be at least ',I8) + 9006 FORMAT (' ****** Error in MC77B/BD. INFO(1) = ',I3/ + & ' Entry ',I8, + & ' has invalid row index ',I8, ' or column index ',I8) + 9007 FORMAT (' ****** Error in MC77B/BD. INFO(1) = ',I3/ + & ' Duplicate entry ',I8, ' with row index ',I8/ + & ' and column index ',I8) + 9008 FORMAT (' ****** Error in MC77B/BD. INFO(1) = ',I3/ + & ' Bad input REAL control parameter.', + & ' Value of CNTL(',I1,') = ',1PD14.4) + 9009 FORMAT (' ****** Error in MC77B/BD. INFO(1) = ',I3/ + & ' Only scaling in infinity norm is allowed', + & ' for rectangular matrices'/ + & ' JOB = ',I8/' M = ',I8/' N = ',I8) +C9010 FORMAT (' ****** Error in MC77B/BD. INFO(1) = ',I3/ +Cnew & ' Algorithm will loop indefinitely !!!', +Cnew & ' Check for inconsistency'/ +Cnew & ' Maximum number of iterations = ',I8/ +Cnew & ' Threshold for convergence = ',1PD14.4) + 9020 FORMAT (' ****** Input parameters for MC77B/BD:'/ + & ' JOB = ',I8/' M = ',I8/' N = ',I8/' NNZ = ',I8/ + & ' Max n.b. Iters. = ',I8/ + & ' Cvgce. Threshold = ',1PD14.4) + 9022 FORMAT (' JCN(1:NNZ) = ',8I8/(15X,8I8)) + 9023 FORMAT (' IRN(1:NNZ) = ',8I8/(15X,8I8)) + 9024 FORMAT (' A(1:NNZ) = ',4(1PD14.4)/(15X,4(1PD14.4))) + 9030 FORMAT (' ****** Output parameters for MC77B/BD:'/ + & ' INFO(1:3) = ',3(2X,I8)/ + & ' RINFO(1:2) = ',2(1PD14.4)) + 9031 FORMAT (' DW(1:M) = ',4(1PD14.4)/(15X,4(1PD14.4))) + 9032 FORMAT (' DW(M+1:M+N) = ',4(1PD14.4)/(15X,4(1PD14.4))) +c9031 FORMAT (' DW(1:M) = ',5(F11.3)/(15X,5(F11.3))) +c9032 FORMAT (' DW(M+1:M+N) = ',5(F11.3)/(15X,5(F11.3))) + END + +C********************************************************************** + SUBROUTINE MC77RD(M,N,NNZ,JCN,IRN,A,D,E, + & CHECK,THRESH,ERR,MAXIT,NITER, + & IW,JW,DW,EW,INFO) +C +C ********************************************************************* +C *** Infinity norm --- The un-symmetric case *** +C *** General SPARSE format *** +C ********************************************************************* + INTEGER M,N,NNZ,MAXIT,NITER,CHECK,INFO + INTEGER JCN(NNZ),IRN(NNZ),IW(M),JW(N) + DOUBLE PRECISION THRESH,ERR(2) + DOUBLE PRECISION A(NNZ),D(M),E(N),DW(M),EW(N) + +C Variables are described in MC77A/AD +C The un-symmetric matrix is stored in general sparse format. + +C Local variables and parameters + DOUBLE PRECISION ONE, ZERO + PARAMETER ( ONE=1.0D+00, ZERO=0.0D+00 ) + INTEGER I, J, K + DOUBLE PRECISION S +C Intrinsic functions + INTRINSIC SQRT, MAX, ABS + + INFO = 0 + NITER = 0 + ERR(1) = ZERO + ERR(2) = ZERO + +C Initialisations ... + DO 5 I = 1, M + IW(I) = 0 + DW(I) = ZERO + D(I) = ONE + 5 CONTINUE + DO 10 J = 1, N + JW(J) = 0 + EW(J) = ZERO + E(J) = ONE + 10 CONTINUE + +C Now, we compute the initial infinity-norm of each row and column. + DO 20 K=1,NNZ + I = IRN(K) + J = JCN(K) + IF (EW(J).LT.A(K)) THEN + EW(J) = A(K) + JW(J) = I + ENDIF + IF (DW(I).LT.A(K)) THEN + DW(I) = A(K) + IW(I) = J + ENDIF + 20 CONTINUE + + DO 40 I=1,M + IF (IW(I).GT.0) D(I) = SQRT(DW(I)) + 40 CONTINUE + DO 45 J=1,N + IF (JW(J).GT.0) E(J) = SQRT(EW(J)) + 45 CONTINUE + + DO 50 J=1,N + I = JW(J) + IF (I.GT.0) THEN + IF (IW(I).EQ.J) THEN + IW(I) = -IW(I) + JW(J) = -JW(J) + ENDIF + ENDIF + 50 CONTINUE + + DO 60 I=1,M + IF (IW(I).GT.0) GOTO 99 + 60 CONTINUE + DO 65 J=1,N + IF (JW(J).GT.0) GOTO 99 + 65 CONTINUE + GOTO 200 + + +C Then, iterate on the normalisation of rows and columns. + 99 NITER = NITER + 1 + IF ( (NITER.GT.MAXIT) .AND. (MAXIT.GE.0) ) THEN + IF (CHECK.GT.0) INFO = 1 + NITER = NITER - 1 + GOTO 100 + ENDIF + + DO 110 I=1,M + DW(I) = ZERO + 110 CONTINUE + DO 115 J=1,N + EW(J) = ZERO + 115 CONTINUE + + DO 120 K=1,NNZ + I = IRN(K) + J = JCN(K) + IF (JW(J).GT.0) THEN + S = A(K) / (D(I)*E(J)) + IF (EW(J).LT.S) THEN + EW(J) = S + JW(J) = I + ENDIF + IF (IW(I).GT.0) THEN + IF (DW(I).LT.S) THEN + DW(I) = S + IW(I) = J + ENDIF + ENDIF + ELSE + IF (IW(I).GT.0) THEN + S = A(K) / (D(I)*E(J)) + IF (DW(I).LT.S) THEN + DW(I) = S + IW(I) = J + ENDIF + ENDIF + ENDIF + 120 CONTINUE + + DO 150 I=1,M + IF (IW(I).GT.0) D(I) = D(I)*SQRT(DW(I)) + 150 CONTINUE + DO 155 J=1,N + IF (JW(J).GT.0) E(J) = E(J)*SQRT(EW(J)) + 155 CONTINUE + + DO 160 J=1,N + I = JW(J) + IF (I.GT.0) THEN + IF (IW(I).EQ.J) THEN + IW(I) = -IW(I) + JW(J) = -JW(J) + ENDIF + ENDIF + 160 CONTINUE + +C Stopping criterion : + IF (CHECK.LE.0) GOTO 99 +C IF (MOD(NITER,CHECK).NE.0) GOTO 99 + +C N.B. the test is performed on the basis of the values in arrays +C DW and EW which, in fact, correspond to the row and column +C norms of the scaled matrix at the previous iteration ... + 100 IF (INFO.NE.0) GOTO 200 + ERR(1) = ZERO + DO 170 I=1,M + IF (IW(I).GT.0) ERR(1) = MAX( ERR(1), ABS(ONE-DW(I)) ) + 170 CONTINUE + ERR(2) = ZERO + DO 175 J=1,N + IF (JW(J).GT.0) ERR(2) = MAX( ERR(2), ABS(ONE-EW(J)) ) + 175 CONTINUE + IF ( (ERR(1).LT.THRESH) .AND. (ERR(2).LT.THRESH) ) GOTO 200 + + IF (CHECK.GT.0) GOTO 99 + + 200 RETURN + END + +C********************************************************************** + SUBROUTINE MC77SD(M,N,NNZ,JCN,IRN,A,D,E, + & CHECK,THRESH,ERR,MAXIT,NITER, + & IW,JW,DW,EW,INFO) +C +C ********************************************************************* +C *** One norm --- The un-symmetric case *** +C *** General SPARSE format *** +C ********************************************************************* + INTEGER M,N,NNZ,MAXIT,NITER,CHECK,INFO + INTEGER JCN(NNZ),IRN(NNZ),IW(M),JW(N) + DOUBLE PRECISION THRESH,ERR(2) + DOUBLE PRECISION A(NNZ),D(M),E(N),DW(M),EW(N) + +C Variables are described in MC77A/AD +C The un-symmetric matrix is stored in general sparse format. + +C Local variables and parameters + DOUBLE PRECISION ONE, ZERO + PARAMETER ( ONE=1.0D+00, ZERO=0.0D+00 ) + INTEGER I, J, K + DOUBLE PRECISION S +C Intrinsic functions + INTRINSIC SQRT, MAX, ABS + + INFO = 0 + NITER = 0 + ERR(1) = ZERO + ERR(2) = ZERO + +C Initialisations ... + DO 10 I = 1, M + IW(I) = 0 + DW(I) = ZERO + D(I) = ONE + 10 CONTINUE + DO 15 J = 1, N + JW(J) = 0 + EW(J) = ZERO + E(J) = ONE + 15 CONTINUE + +C Now, we compute the initial one-norm of each row and column. + DO 20 K=1,NNZ + IF (A(K).GT.ZERO) THEN + I = IRN(K) + J = JCN(K) + EW(J) = EW(J) + A(K) + IF (JW(J).EQ.0) THEN + JW(J) = K + ELSE + JW(J) = -1 + ENDIF + DW(I) = DW(I) + A(K) + IF (IW(I).EQ.0) THEN + IW(I) = K + ELSE + IW(I) = -1 + ENDIF + ENDIF + 20 CONTINUE + + DO 40 I=1,M + IF (IW(I).NE.0) D(I) = SQRT(DW(I)) + 40 CONTINUE + DO 45 J=1,N + IF (JW(J).NE.0) E(J) = SQRT(EW(J)) + 45 CONTINUE + + DO 50 J=1,N + K = JW(J) + IF (K.GT.0) THEN + I = IRN(K) + IF (IW(I).EQ.K) THEN + IW(I) = 0 + JW(J) = 0 + ENDIF + ENDIF + 50 CONTINUE + + DO 60 K=1,M + IF ( (IW(K).NE.0) .OR. (JW(K).NE.0) ) GOTO 99 + 60 CONTINUE +C Since we enforce M=N in the case of the one-norm, the tests can be +C done in one shot. For future relases, (M/=N) we should incorporate +C instead : +Cnew DO 60 I=1,M +Cnew IF (IW(I).NE.0) GOTO 99 +Cne60 CONTINUE +Cnew DO 65 J=1,N +Cnew IF (JW(J).NE.0) GOTO 99 +Cne65 CONTINUE + GOTO 200 + + +C Then, iterate on the normalisation of rows and columns. + 99 NITER = NITER + 1 + IF ( (NITER.GT.MAXIT) .AND. (MAXIT.GE.0) ) THEN + IF (CHECK.GT.0) INFO = 1 + NITER = NITER - 1 + GOTO 100 + ENDIF + + DO 110 I=1,M + DW(I) = ZERO + 110 CONTINUE + DO 115 J=1,N + EW(J) = ZERO + 115 CONTINUE + + DO 120 K=1,NNZ + J = JCN(K) + I = IRN(K) + S = A(K) / (D(I)*E(J)) + EW(J) = EW(J) + S + DW(I) = DW(I) + S + 120 CONTINUE + + DO 150 I=1,M + IF (IW(I).NE.0) D(I) = D(I)*SQRT(DW(I)) + 150 CONTINUE + DO 155 J=1,N + IF (JW(J).NE.0) E(J) = E(J)*SQRT(EW(J)) + 155 CONTINUE + +C Stopping criterion : + IF (CHECK.LE.0) GOTO 99 +C IF (MOD(NITER,CHECK).NE.0) GOTO 99 + +C N.B. the test is performed on the basis of the values in arrays +C DW and EW which, in fact, correspond to the row and column +C norms of the scaled matrix at the previous iteration ... + 100 IF (INFO.NE.0) GOTO 200 + ERR(1) = ZERO + DO 170 I=1,M + IF (IW(I).NE.0) ERR(1) = MAX( ERR(1), ABS(ONE-DW(I)) ) + 170 CONTINUE + ERR(2) = ZERO + DO 175 J=1,N + IF (JW(J).NE.0) ERR(2) = MAX( ERR(2), ABS(ONE-EW(J)) ) + 175 CONTINUE + IF ( (ERR(1).LT.THRESH) .AND. (ERR(2).LT.THRESH) ) GOTO 200 + + IF (CHECK.GT.0) GOTO 99 + + 200 RETURN + END + +C********************************************************************** + SUBROUTINE MC77TD(N,NNZ,JCN,IRN,A,DE, + & CHECK,THRESH,ERR,MAXIT,NITER, + & IJW,DEW,INFO) +C +C ********************************************************************* +C *** Infinity norm --- The symmetric-packed case *** +C *** General SPARSE format *** +C ********************************************************************* + INTEGER N,NNZ,MAXIT,NITER,CHECK,INFO + INTEGER JCN(NNZ),IRN(NNZ),IJW(N) + DOUBLE PRECISION THRESH,ERR + DOUBLE PRECISION A(NNZ),DE(N),DEW(N) + +C Variables are described in MC77A/AD +C The lower triangular part of the symmetric matrix is stored +C in general symmetric-packed sparse format. + +C Local variables and parameters + DOUBLE PRECISION ONE, ZERO + PARAMETER ( ONE=1.0D+00, ZERO=0.0D+00 ) + INTEGER I, J, K + DOUBLE PRECISION S +C Intrinsic functions + INTRINSIC SQRT, MAX, ABS + + INFO = 0 + NITER = 0 + ERR = ZERO + +C Initialisations ... + DO 10 K = 1, N + IJW(K) = 0 + DEW(K) = ZERO + DE(K) = ONE + 10 CONTINUE + +C Now, we compute the initial infinity-norm of each row and column. + DO 20 K=1,NNZ + I = IRN(K) + J = JCN(K) + IF (DEW(J).LT.A(K)) THEN + DEW(J) = A(K) + IJW(J) = I + ENDIF + IF (DEW(I).LT.A(K)) THEN + DEW(I) = A(K) + IJW(I) = J + ENDIF + 20 CONTINUE + + DO 40 K=1,N + IF (IJW(K).GT.0) DE(K) = SQRT(DEW(K)) + 40 CONTINUE + + DO 50 J=1,N + I = IJW(J) + IF (I.GT.0) THEN + IF (IJW(I).EQ.J) THEN + IJW(I) = -IJW(I) + IF (I.NE.J) IJW(J) = -IJW(J) + ENDIF + ENDIF + 50 CONTINUE + + DO 60 K=1,N + IF (IJW(K).GT.0) GOTO 99 + 60 CONTINUE + GOTO 200 + + +C Then, iterate on the normalisation of rows and columns. + 99 NITER = NITER + 1 + IF ( (NITER.GT.MAXIT) .AND. (MAXIT.GE.0) ) THEN + IF (CHECK.GT.0) INFO = 1 + NITER = NITER - 1 + GOTO 100 + ENDIF + + DO 110 K=1,N + DEW(K) = ZERO + 110 CONTINUE + + DO 120 K=1,NNZ + I = IRN(K) + J = JCN(K) + IF (IJW(J).GT.0) THEN + S = A(K) / (DE(I)*DE(J)) + IF (DEW(J).LT.S) THEN + DEW(J) = S + IJW(J) = I + ENDIF + IF (IJW(I).GT.0) THEN + IF (DEW(I).LT.S) THEN + DEW(I) = S + IJW(I) = J + ENDIF + ENDIF + ELSE + IF (IJW(I).GT.0) THEN + S = A(K) / (DE(I)*DE(J)) + IF (DEW(I).LT.S) THEN + DEW(I) = S + IJW(I) = J + ENDIF + ENDIF + ENDIF + 120 CONTINUE + + DO 150 K=1,N + IF (IJW(K).GT.0) DE(K) = DE(K)*SQRT(DEW(K)) + 150 CONTINUE + + DO 160 J=1,N + I = IJW(J) + IF (I.GT.0) THEN + IF (IJW(I).EQ.J) THEN + IJW(I) = -IJW(I) + IF (I.NE.J) IJW(J) = -IJW(J) + ENDIF + ENDIF + 160 CONTINUE + +C Stopping criterion : + IF (CHECK.LE.0) GOTO 99 +C IF (MOD(NITER,CHECK).NE.0) GOTO 99 + +C N.B. the test is performed on the basis of the values in array +C DEW which, in fact, correspond to the row and column +C norms of the scaled matrix at the previous iteration ... + 100 IF (INFO.NE.0) GOTO 200 + ERR = ZERO + DO 170 K=1,N + IF (IJW(K).GT.0) ERR = MAX( ERR, ABS(ONE-DEW(K)) ) + 170 CONTINUE + IF (ERR.LT.THRESH) GOTO 200 + + IF (CHECK.GT.0) GOTO 99 + + 200 RETURN + END + +C********************************************************************** + SUBROUTINE MC77UD(N,NNZ,JCN,IRN,A,DE, + & CHECK,THRESH,ERR,MAXIT,NITER, + & IJW,DEW,INFO) +C +C ********************************************************************* +C *** One norm --- The symmetric-packed case *** +C *** General SPARSE format *** +C ********************************************************************* + INTEGER N,NNZ,MAXIT,NITER,CHECK,INFO + INTEGER JCN(NNZ),IRN(NNZ),IJW(N) + DOUBLE PRECISION THRESH,ERR + DOUBLE PRECISION A(NNZ),DE(N),DEW(N) + +C Variables are described in MC77A/AD +C The lower triangular part of the symmetric matrix is stored +C in general symmetric-packed sparse format. + +C Local variables and parameters + DOUBLE PRECISION ONE, ZERO + PARAMETER ( ONE=1.0D+00, ZERO=0.0D+00 ) + INTEGER I, J, K + DOUBLE PRECISION S +C Intrinsic functions + INTRINSIC SQRT, MAX, ABS + + INFO = 0 + NITER = 0 + ERR = ZERO + +C Initialisations ... + DO 10 K = 1, N + IJW(K) = 0 + DEW(K) = ZERO + DE(K) = ONE + 10 CONTINUE + +C Now, we compute the initial one-norm of each row and column. + DO 20 K=1,NNZ + IF (A(K).GT.ZERO) THEN + J = JCN(K) + DEW(J) = DEW(J) + A(K) + IF (IJW(J).EQ.0) THEN + IJW(J) = K + ELSE + IJW(J) = -1 + ENDIF + I = IRN(K) + IF (I.NE.J) THEN + DEW(I) = DEW(I) + A(K) + IF (IJW(I).EQ.0) THEN + IJW(I) = K + ELSE + IJW(I) = -1 + ENDIF + ENDIF + ENDIF + 20 CONTINUE + + DO 40 K=1,N + IF (IJW(K).NE.0) DE(K) = SQRT(DEW(K)) + 40 CONTINUE + + DO 50 J=1,N + K = IJW(J) + IF (K.GT.0) THEN + I = IRN(K) + IF (IJW(I).EQ.K) THEN + IJW(I) = 0 + IJW(J) = 0 + ENDIF + ENDIF + 50 CONTINUE + + DO 60 K=1,N + IF (IJW(K).NE.0) GOTO 99 + 60 CONTINUE + GOTO 200 + + +C Then, iterate on the normalisation of rows and columns. + 99 NITER = NITER + 1 + IF ( (NITER.GT.MAXIT) .AND. (MAXIT.GE.0) ) THEN + IF (CHECK.GT.0) INFO = 1 + NITER = NITER - 1 + GOTO 100 + ENDIF + + DO 110 K=1,N + DEW(K) = ZERO + 110 CONTINUE + + DO 120 K=1,NNZ + J = JCN(K) + I = IRN(K) + S = A(K) / (DE(I)*DE(J)) + DEW(J) = DEW(J) + S + IF (I.NE.J) DEW(I) = DEW(I) + S + 120 CONTINUE + + DO 150 K=1,N + IF (IJW(K).NE.0) DE(K) = DE(K)*SQRT(DEW(K)) + 150 CONTINUE + +C Stopping criterion : + IF (CHECK.LE.0) GOTO 99 +C IF (MOD(NITER,CHECK).NE.0) GOTO 99 + +C N.B. the test is performed on the basis of the values in array +C DEW which, in fact, correspond to the row and column +C norms of the scaled matrix at the previous iteration ... + 100 IF (INFO.NE.0) GOTO 200 + ERR = ZERO + DO 170 K=1,N + IF (IJW(K).NE.0) ERR = MAX( ERR, ABS(ONE-DEW(K)) ) + 170 CONTINUE + IF (ERR.LT.THRESH) GOTO 200 + + IF (CHECK.GT.0) GOTO 99 + + 200 RETURN + END + +C********************************************************************** +C*** DRIVER FOR THE CASE OF DENSE MATRICES *** +C********************************************************************** + SUBROUTINE MC77CD(JOB,M,N,A,LDA,IW,LIW,DW,LDW, + & ICNTL,CNTL,INFO,RINFO) +C +C Purpose +C ======= +C +C This subroutine computes scaling factors D(i), i=1..M, and E(j), +C j=1..N, for an MxN sparse matrix A = {a_ij} so that the scaled matrix +C D^{-1}*A*E^{-1} has both rows and columns norms all equal or close to +C 1. The rectangular case (M/=N) is, for the moment, only allowed for +C equilibration in the infinity norm, a particular case for which the +C convergence is ensured in all cases and trivial to monitor. See [1]. +C +C Parameters +C ========== +C + INTEGER LICNTL, LCNTL, LINFO, LRINFO + PARAMETER ( LICNTL=10, LCNTL=10, LINFO=10, LRINFO=10 ) + INTEGER ICNTL(LICNTL),INFO(LINFO) + DOUBLE PRECISION CNTL(LCNTL),RINFO(LRINFO) +C + INTEGER JOB,M,N,LDA,LIW,LDW + INTEGER IW(LIW) + DOUBLE PRECISION A(LDA,*),DW(LDW) +C +C JOB is an INTEGER variable which must be set by the user to +C control the action. It is not altered by the subroutine. +C Possible values for JOB are: +C 0 Equilibrate the infinity norm of rows and columns in matrix A. +C 1 Equilibrate the one norm of rows and columns in matrix A. +C p Equilibrate the p-th norm (p>=2) of rows and columns in matrix A. +C -1 Equilibrate the p-th norm of rows and columns in matrix A, with +C a strictly positive REAL parameter p given in CNTL(2). +C Restriction: JOB >= -1. +C +C M is an INTEGER variable which must be set by the user to the +C number of rows in matrix A. It is not altered by the subroutine. +C Restriction: M >= 1. +C +C N is an INTEGER variable which must be set by the user to the +C number of columns in matrix A. It is not altered by the subroutine. +C Restriction: N >= 1. +C If ICNTL(6) /= 0 (symmetric matrix), N must be equal to M. +C +C A is a REAL (DOUBLE PRECISION in the D-version) array containing +C the numerical values A(i,j), i=1..M, j=1..N, of the input matrix A. +C It is not altered by the subroutine. +C +C LIW is an INTEGER variable that must be set by the user to +C the length of array IW. It is not altered by the subroutine. +C Restriction: +C If ICNTL(6) == 0: LIW >= M+N +C If ICNTL(6) /= 0: LIW >= M +C +C IW is an INTEGER array of length LIW that is used for workspace. +C +C LDW is an INTEGER variable that must be set by the user to the +C length of array DW. It is not altered by the subroutine. +C Restriction: +C If ICNTL(5) = 0 and ICNTL(6) == 0: LDW >= (LDA*N) + 2*(M+N) +C If ICNTL(5) = 1 and ICNTL(6) == 0: LDW >= 2*(M+N) +C If ICNTL(5) = 0 and ICNTL(6) /= 0: LDW >= M*(M+1)/2 + 2*M +C If ICNTL(5) = 1 and ICNTL(6) /= 0: LDW >= 2*M +C +C DW is a REAL (DOUBLE PRECISION in the D-version) array of length LDW +C that need not be set by the user. +C On return, DW(i) contains d_i, i=1..M, the diagonal entries in +C the row-scaling matrix D, and when the input matrix A is +C unsymmetric, DW(M+j) contains e_j, j=1..N, the diagonal entries in +C the column-scaling matrix E. +C +C ICNTL is an INTEGER array of length 10. Its components control the +C output of MC77A/AD and must be set by the user before calling +C MC77A/AD. They are not altered by the subroutine. +C See MC77I/ID for details. +C +C CNTL is a REAL (DOUBLE PRECISION in the D-version) array of length 10. +C Its components control the output of MC77A/AD and must be set by the +C user before calling MC77A/AD. They are not altered by the +C subroutine. +C See MC77I/ID for details. +C +C INFO is an INTEGER array of length 10 which need not be set by the +C user. INFO(1) is set non-negative to indicate success. A negative +C value is returned if an error occurred, a positive value if a +C warning occurred. INFO(2) holds further information on the error. +C On exit from the subroutine, INFO(1) will take one of the +C following values: +C 0 : successful entry (for structurally nonsingular matrix). +C +1 : The maximum number of iterations in ICNTL(7) has been reached. +C -1 : M < 1. Value of M held in INFO(2). +C -2 : N < 1. Value of N held in INFO(2). +C -3 : ICNTL(6) /= 0 (input matrix is symmetric) and N /= M. +C Value of (N-M) held in INFO(2). +C -5 : the defined length LIW violates the restriction on LIW. +C Value of LIW required given by INFO(2). +C -6 : the defined length LDW violates the restriction on LDW. +C Value of LDW required given by INFO(2). +C -10 : ICNTL(7) is out of range and INFO(2) contains its value. +C -11 : CNTL(2) is out of range. +C -12 : JOB < -1. Value of JOB held in INFO(2). +C -13 : JOB /= 0 and N /= M. This is a restriction of the algorithm in +C its present stage, e.g. for rectangular matrices, only the +C scaling in infinity norm is allowed. Value of JOB held in +C INFO(2). +C INFO(3) returns the number of iterations performed. +C INFO(4) to INFO(10) are not currently used and are set to zero by +C the routine. +C +C RINFO is a REAL (DOUBLE PRECISION in the D-version) array of length 10 +C which need not be set by the user. +C When CNTL(1) is strictly positive, RINFO(1) will contain on exit the +C maximum distance of all row norms to 1, and RINFO(2) will contain on +C exit the maximum distance of all column norms to 1. +C If ICNTL(6) /= 0 (indicating that the input matrix is symmetric), +C RINFO(2) is not used since the row-scaling equals the column scaling +C in this case. +C RINFO(3) to RINFO(10) are not currently used and are set to zero. +C +C References: +C [1] D. R. Ruiz, (2001), +C "A scaling algorithm to equilibrate both rows and columns norms +C in matrices", +C Technical Report RAL-TR-2001-034, RAL, Oxfordshire, England, +C and Report RT/APO/01/4, ENSEEIHT-IRIT, Toulouse, France. + +C Local variables and parameters + DOUBLE PRECISION ONE, ZERO + PARAMETER ( ONE=1.0D+00, ZERO=0.0D+00 ) + DOUBLE PRECISION THRESH, DP + INTEGER I, J, K, NNZ, MAXIT, CHECK, SETUP +C External routines and functions + EXTERNAL MC77JD,MC77KD,MC77LD,MC77MD +C Intrinsic functions + INTRINSIC ABS,MAX + +C Reset informational output values + INFO(1) = 0 + INFO(2) = 0 + INFO(3) = 0 + RINFO(1) = ZERO + RINFO(2) = ZERO +C Check value of JOB + IF (JOB.LT.-1) THEN + INFO(1) = -12 + INFO(2) = JOB + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9001) INFO(1),'JOB',JOB + GO TO 99 + ENDIF +C Check bad values in ICNTL +Cnew IF (ICNTL(7).LT.0) THEN + IF (ICNTL(7).LE.0) THEN + INFO(1) = -10 + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9002) INFO(1),7,ICNTL(7) + GO TO 99 + ENDIF +C Check bad values in CNTL + IF ((JOB.EQ.-1) .AND. (CNTL(2).LT.ONE)) THEN + INFO(1) = -11 + INFO(2) = 2 + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9008) INFO(1),2,CNTL(2) + GO TO 99 + ENDIF +C Check value of M + IF (M.LT.1) THEN + INFO(1) = -1 + INFO(2) = M + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9001) INFO(1),'M',M + GO TO 99 + ENDIF +C Check value of N + IF (N.LT.1) THEN + INFO(1) = -2 + INFO(2) = N + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9001) INFO(1),'N',N + GO TO 99 + ENDIF +C Symmetric case: M must be equal to N + IF ( (ICNTL(6).NE.0) .AND. (N.NE.M) ) THEN + INFO(1) = -3 + INFO(2) = N-M + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9003) INFO(1),(N-M) + GO TO 99 + ENDIF +C For rectangular matrices, only scaling in infinity norm is allowed + IF ( (JOB.NE.0) .AND. (N.NE.M) ) THEN + INFO(1) = -13 + INFO(2) = JOB + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9009) INFO(1),JOB,M,N + GO TO 99 + ENDIF +C Check LDA + IF (ICNTL(6).EQ.0) THEN + IF (M.GT.LDA) THEN + INFO(1) = -4 + INFO(2) = LDA-M + IF (ICNTL(1).GE.0) + & WRITE(ICNTL(1),9001) INFO(1),'LDA < M; (LDA-M)',INFO(2) + GO TO 99 + ENDIF + ELSE + IF (((M*(M+1))/2).GT.LDA) THEN + INFO(1) = -4 + INFO(2) = LDA-((M*(M+1))/2) + IF (ICNTL(1).GE.0) + & WRITE(ICNTL(1),9001) INFO(1), + & 'LDA < M*(M+1)/2; (LDA-(M*(M+1)/2))',INFO(2) + GO TO 99 + ENDIF + ENDIF +C Check LIW + K = M + IF (ICNTL(6).EQ.0) K = M+N + IF (LIW.LT.K) THEN + INFO(1) = -5 + INFO(2) = K + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9004) INFO(1),K + GO TO 99 + ENDIF +C Check LDW + K = 2*M + NNZ = (M*(M+1))/2 + IF (ICNTL(6).EQ.0) THEN + K = 2*(M+N) + NNZ = LDA*N + ENDIF + IF ( (ICNTL(5).EQ.0) .OR. (JOB.GE.2) .OR. (JOB.EQ.-1) ) + & K = K + NNZ + IF (LDW.LT.K) THEN + INFO(1) = -6 + INFO(2) = K + IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9005) INFO(1),K + GO TO 99 + ENDIF + +C Print diagnostics on input +C ICNTL(9) could be set by the user to monitor the level of diagnostics + IF (ICNTL(3).GE.0) THEN + WRITE(ICNTL(3),9020) JOB,M,N,ICNTL(7),CNTL(1) + IF (ICNTL(9).LT.1) THEN + K = 1 + DO 5 I=1,M +C General case : + IF (ICNTL(6).EQ.0) + & WRITE(ICNTL(3),9021) I,(A(I,J),J=1,N) +C Dense symmetric packed format : + IF (ICNTL(6).NE.0) THEN + WRITE(ICNTL(3),9022) I,(A(J,1),J=K,K+M-I) + K = K+M-I+1 + ENDIF + 5 CONTINUE + ENDIF + ENDIF + +C Set components of INFO to zero + DO 10 I=1,10 + INFO(I) = 0 + RINFO(I) = ZERO + 10 CONTINUE + +C Set the convergence threshold and the maximum number of iterations + THRESH = MAX( ZERO, CNTL(1) ) + MAXIT = ICNTL(7) +C Check for the particular inconsistency between MAXIT and THRESH. +Cnew IF ( (MAXIT.LE.0) .AND. (CNTL(1).LE.ZERO) ) THEN +Cnew INFO(1) = -14 +Cnew IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9010) INFO(1),MAXIT,CNTL(1) +Cnew GO TO 99 +Cnew ENDIF + +C ICNTL(8) could be set by the user to indicate the frequency at which +C convergence should be checked when CNTL(1) is strictly positive. +C The default value used here 1 (e.g. check convergence every +C iteration). +C CHECK = ICNTL(8) + CHECK = 1 + IF (CNTL(1).LE.ZERO) CHECK = 0 + +C Prepare temporary data in working arrays as apropriate + K = 2*M + IF (ICNTL(6).EQ.0) K = 2*(M+N) + SETUP = 0 + IF ( (JOB.GE.2) .OR. (JOB.EQ.-1) ) THEN + SETUP = 1 +C Copy ABS(A(J))**JOB into DW(K+J), J=1..NNZ + IF (JOB.EQ.-1) THEN + DP = CNTL(2) + ELSE + DP = REAL(JOB) + ENDIF + IF (ICNTL(6).EQ.0) THEN + DO 25 J = 1,N + DO 20 I = 1,M + DW(K+(J-1)*LDA+I) = ABS(A(I,J))**DP + 20 CONTINUE + 25 CONTINUE + ELSE + NNZ = (M*(M+1))/2 + DO 30 J = 1,NNZ + DW(K+J) = ABS(A(J,1))**DP + 30 CONTINUE + ENDIF +C Reset the Threshold to take into account the Hadamard p-th power + THRESH = ONE - (ABS(ONE-THRESH))**DP + ELSE + IF (ICNTL(5).EQ.0) THEN + SETUP = 1 +C Copy ABS(A(J)) into DW(K+J), J=1..NNZ + IF (ICNTL(6).EQ.0) THEN + DO 40 J = 1,N + DO 35 I = 1,M + DW(K+(J-1)*LDA+I) = ABS(A(I,J)) + 35 CONTINUE + 40 CONTINUE + ELSE + NNZ = (M*(M+1))/2 + DO 45 J = 1,NNZ + DW(K+J) = ABS(A(J,1)) + 45 CONTINUE + ENDIF + ENDIF + ENDIF + +C Begin the computations (input matrix in DENSE format) ... +C We consider first the un-symmetric case : + IF (ICNTL(6).EQ.0) THEN +C +C Equilibrate matrix A in the infinity norm + IF (JOB.EQ.0) THEN +C IW(1:M+N), DW(M+N:2*(M+N)) are workspaces + IF (SETUP.EQ.1) THEN + CALL MC77JD(M,N,DW(2*(M+N)+1),LDA,DW(1),DW(M+1), + & CHECK,THRESH,RINFO(1),MAXIT,INFO(3), + & IW(1),IW(M+1),DW(M+N+1),DW(2*M+N+1),INFO(1)) + ELSE + CALL MC77JD(M,N,A,LDA,DW(1),DW(M+1), + & CHECK,THRESH,RINFO(1),MAXIT,INFO(3), + & IW(1),IW(M+1),DW(M+N+1),DW(2*M+N+1),INFO(1)) + ENDIF +C +C Equilibrate matrix A in the p-th norm, 1 <= p < +infinity + ELSE + IF (SETUP.EQ.1) THEN + CALL MC77KD(M,N,DW(2*(M+N)+1),LDA,DW(1),DW(M+1), + & CHECK,THRESH,RINFO(1),MAXIT,INFO(3), + & IW(1),IW(M+1),DW(M+N+1),DW(2*M+N+1),INFO(1)) + ELSE + CALL MC77KD(M,N,A,LDA,DW(1),DW(M+1), + & CHECK,THRESH,RINFO(1),MAXIT,INFO(3), + & IW(1),IW(M+1),DW(M+N+1),DW(2*M+N+1),INFO(1)) + ENDIF +C Reset the scaling factors to their Hadamard p-th root, if +C required and re-compute the actual value of the final error + IF ( (JOB.GE.2) .OR. (JOB.EQ.-1) ) THEN + IF (JOB.EQ.-1) THEN + DP = ONE / CNTL(2) + ELSE + DP = ONE / REAL(JOB) + ENDIF + RINFO(1) = ZERO + DO 50 I = 1,M + DW(I) = DW(I)**DP + IF (IW(I).NE.0) + & RINFO(1) = MAX( RINFO(1), ABS(ONE-DW(M+N+I)**DP) ) + 50 CONTINUE + RINFO(2) = ZERO + DO 55 J = 1,N + DW(M+J) = DW(M+J)**DP + IF (IW(M+J).NE.0) + & RINFO(2) = MAX( RINFO(2), ABS(ONE-DW(2*M+N+J)**DP) ) + 55 CONTINUE + ENDIF + ENDIF +C +C We treat then the symmetric (packed) case : + ELSE +C +C Equilibrate matrix A in the infinity norm + IF (JOB.EQ.0) THEN +C IW(1:M), DW(M:2*M) are workspaces + IF (SETUP.EQ.1) THEN + CALL MC77LD(M,DW(2*M+1),DW(1), + & CHECK,THRESH,RINFO(1),MAXIT,INFO(3), + & IW(1),DW(M+1),INFO(1)) + ELSE + CALL MC77LD(M,A,DW(1), + & CHECK,THRESH,RINFO(1),MAXIT,INFO(3), + & IW(1),DW(M+1),INFO(1)) + ENDIF +C +C Equilibrate matrix A in the p-th norm, 1 <= p < +infinity + ELSE + IF (SETUP.EQ.1) THEN + CALL MC77MD(M,DW(2*M+1),DW(1), + & CHECK,THRESH,RINFO(1),MAXIT,INFO(3), + & IW(1),DW(M+1),INFO(1)) + ELSE + CALL MC77MD(M,A,DW(1), + & CHECK,THRESH,RINFO(1),MAXIT,INFO(3), + & IW(1),DW(M+1),INFO(1)) + ENDIF +C Reset the scaling factors to their Hadamard p-th root, if +C required and re-compute the actual value of the final error + IF ( (JOB.GE.2) .OR. (JOB.EQ.-1) ) THEN + IF (JOB.EQ.-1) THEN + DP = ONE / CNTL(2) + ELSE + DP = ONE / REAL(JOB) + ENDIF + RINFO(1) = ZERO + DO 60 I = 1,M + DW(I) = DW(I)**DP + IF (IW(I).NE.0) + & RINFO(1) = MAX( RINFO(1), ABS(ONE-DW(M+I)**DP) ) + 60 CONTINUE + ENDIF + ENDIF + RINFO(2) = RINFO(1) +C + ENDIF +C End of the un-symmetric/symmetric IF statement + + +C Print diagnostics on output +C ICNTL(9) could be set by the user to monitor the level of diagnostics + IF (ICNTL(3).GE.0) THEN + WRITE(ICNTL(3),9030) (INFO(J),J=1,3),(RINFO(J),J=1,2) + IF (ICNTL(9).LT.2) THEN + WRITE(ICNTL(3),9031) (DW(I),I=1,M) + IF (ICNTL(6).EQ.0) + & WRITE(ICNTL(3),9032) (DW(M+J),J=1,N) + ENDIF + ENDIF + +C Return from subroutine. + 99 CONTINUE + RETURN + + 9001 FORMAT (' ****** Error in MC77C/CD. INFO(1) = ',I3, + & ' because ',(A),' = ',I10) + 9002 FORMAT (' ****** Error in MC77C/CD. INFO(1) = ',I3/ + & ' Bad input control flag.', + & ' Value of ICNTL(',I1,') = ',I8) + 9003 FORMAT (' ****** Error in MC77C/CD. INFO(1) = ',I3/ + & ' Input matrix is symmetric and N /= M.', + & ' Value of (N-M) = ',I8) + 9004 FORMAT (' ****** Error in MC77C/CD. INFO(1) = ',I3/ + & ' LIW too small, must be at least ',I8) + 9005 FORMAT (' ****** Error in MC77C/CD. INFO(1) = ',I3/ + & ' LDW too small, must be at least ',I8) + 9008 FORMAT (' ****** Error in MC77C/CD. INFO(1) = ',I3/ + & ' Bad input REAL control parameter.', + & ' Value of CNTL(',I1,') = ',1PD14.4) + 9009 FORMAT (' ****** Error in MC77C/CD. INFO(1) = ',I3/ + & ' Only scaling in infinity norm is allowed', + & ' for rectangular matrices'/ + & ' JOB = ',I8/' M = ',I8/' N = ',I8) +C9010 FORMAT (' ****** Error in MC77C/CD. INFO(1) = ',I3/ +Cnew & ' Algorithm will loop indefinitely !!!', +Cnew & ' Check for inconsistency'/ +Cnew & ' Maximum number of iterations = ',I8/ +Cnew & ' Threshold for convergence = ',1PD14.4) + 9020 FORMAT (' ****** Input parameters for MC77C/CD:'/ + & ' JOB = ',I8/' M = ',I8/' N = ',I8/ + & ' Max n.b. Iters. = ',I8/ + & ' Cvgce. Threshold = ',1PD14.4) + 9021 FORMAT (' ROW (I) = ',I8/ + & ' A(I,1:N) = ',4(1PD14.4)/(15X,4(1PD14.4))) + 9022 FORMAT (' ROW (I) = ',I8/ + & ' A(I,I:N) = ',4(1PD14.4)/(15X,4(1PD14.4))) + 9030 FORMAT (' ****** Output parameters for MC77C/CD:'/ + & ' INFO(1:3) = ',3(2X,I8)/ + & ' RINFO(1:2) = ',2(1PD14.4)) + 9031 FORMAT (' DW(1:M) = ',4(1PD14.4)/(15X,4(1PD14.4))) + 9032 FORMAT (' DW(M+1:M+N) = ',4(1PD14.4)/(15X,4(1PD14.4))) +c9031 FORMAT (' DW(1:M) = ',5(F11.3)/(15X,5(F11.3))) +c9032 FORMAT (' DW(M+1:M+N) = ',5(F11.3)/(15X,5(F11.3))) + END + +C********************************************************************** + SUBROUTINE MC77JD(M,N,A,LDA,D,E, + & CHECK,THRESH,ERR,MAXIT,NITER, + & IW,JW,DW,EW,INFO) +C +C ********************************************************************* +C *** Infinity norm --- The un-symmetric case *** +C *** DENSE format *** +C ********************************************************************* + INTEGER M,N,LDA,MAXIT,NITER,CHECK,INFO + INTEGER IW(M),JW(N) + DOUBLE PRECISION THRESH,ERR(2) + DOUBLE PRECISION A(LDA,N),D(M),E(N),DW(M),EW(N) + +C Variables are described in MC77B/BD +C The input matrix A is dense and un-symmetric. + +C Local variables and parameters + DOUBLE PRECISION ONE, ZERO + PARAMETER ( ONE=1.0D+00, ZERO=0.0D+00 ) + INTEGER I, J + DOUBLE PRECISION S +C Intrinsic functions + INTRINSIC SQRT, MAX, ABS + + INFO = 0 + NITER = 0 + ERR(1) = ZERO + ERR(2) = ZERO + +C Initialisations ... + DO 5 I = 1, M + IW(I) = 0 + DW(I) = ZERO + D(I) = ONE + 5 CONTINUE + DO 10 J = 1, N + JW(J) = 0 + EW(J) = ZERO + E(J) = ONE + 10 CONTINUE + +C Now, we compute the initial infinity-norm of each row and column. + DO 20 J=1,N + DO 30 I=1,M + IF (EW(J).LT.A(I,J)) THEN + EW(J) = A(I,J) + JW(J) = I + ENDIF + IF (DW(I).LT.A(I,J)) THEN + DW(I) = A(I,J) + IW(I) = J + ENDIF + 30 CONTINUE + 20 CONTINUE + + DO 40 I=1,M + IF (IW(I).GT.0) D(I) = SQRT(DW(I)) + 40 CONTINUE + DO 45 J=1,N + IF (JW(J).GT.0) E(J) = SQRT(EW(J)) + 45 CONTINUE + + DO 50 J=1,N + I = JW(J) + IF (I.GT.0) THEN + IF (IW(I).EQ.J) THEN + IW(I) = -IW(I) + JW(J) = -JW(J) + ENDIF + ENDIF + 50 CONTINUE + + DO 60 I=1,M + IF (IW(I).GT.0) GOTO 99 + 60 CONTINUE + DO 65 J=1,N + IF (JW(J).GT.0) GOTO 99 + 65 CONTINUE + GOTO 200 + + +C Then, iterate on the normalisation of rows and columns. + 99 NITER = NITER + 1 + IF ( (NITER.GT.MAXIT) .AND. (MAXIT.GE.0) ) THEN + IF (CHECK.GT.0) INFO = 1 + NITER = NITER - 1 + GOTO 100 + ENDIF + + DO 110 I=1,M + DW(I) = ZERO + 110 CONTINUE + DO 115 J=1,N + EW(J) = ZERO + 115 CONTINUE + + DO 120 J=1,N + IF (JW(J).GT.0) THEN + DO 130 I=1,M + S = A(I,J) / (D(I)*E(J)) + IF (EW(J).LT.S) THEN + EW(J) = S + JW(J) = I + ENDIF + IF (IW(I).GT.0) THEN + IF (DW(I).LT.S) THEN + DW(I) = S + IW(I) = J + ENDIF + ENDIF + 130 CONTINUE + ELSE + DO 140 I=1,M + IF (IW(I).GT.0) THEN + S = A(I,J) / (D(I)*E(J)) + IF (DW(I).LT.S) THEN + DW(I) = S + IW(I) = J + ENDIF + ENDIF + 140 CONTINUE + ENDIF + 120 CONTINUE + + DO 150 I=1,M + IF (IW(I).GT.0) D(I) = D(I)*SQRT(DW(I)) + 150 CONTINUE + DO 155 J=1,N + IF (JW(J).GT.0) E(J) = E(J)*SQRT(EW(J)) + 155 CONTINUE + + DO 160 J=1,N + I = JW(J) + IF (I.GT.0) THEN + IF (IW(I).EQ.J) THEN + IW(I) = -IW(I) + JW(J) = -JW(J) + ENDIF + ENDIF + 160 CONTINUE + +C Stopping criterion : + IF (CHECK.LE.0) GOTO 99 +C IF (MOD(NITER,CHECK).NE.0) GOTO 99 + +C N.B. the test is performed on the basis of the values in arrays +C DW and EW which, in fact, correspond to the row and column +C norms of the scaled matrix at the previous iteration ... + 100 IF (INFO.NE.0) GOTO 200 + ERR(1) = ZERO + DO 170 I=1,M + IF (IW(I).GT.0) ERR(1) = MAX( ERR(1), ABS(ONE-DW(I)) ) + 170 CONTINUE + ERR(2) = ZERO + DO 175 J=1,N + IF (JW(J).GT.0) ERR(2) = MAX( ERR(2), ABS(ONE-EW(J)) ) + 175 CONTINUE + IF ( (ERR(1).LT.THRESH) .AND. (ERR(2).LT.THRESH) ) GOTO 200 + + IF (CHECK.GT.0) GOTO 99 + + 200 RETURN + END + +C********************************************************************** + SUBROUTINE MC77KD(M,N,A,LDA,D,E, + & CHECK,THRESH,ERR,MAXIT,NITER, + & IW,JW,DW,EW,INFO) +C +C ********************************************************************* +C *** One norm --- The un-symmetric case *** +C *** DENSE format *** +C ********************************************************************* + INTEGER M,N,LDA,MAXIT,NITER,CHECK,INFO + INTEGER IW(M),JW(N) + DOUBLE PRECISION THRESH,ERR(2) + DOUBLE PRECISION A(LDA,N),D(M),E(N),DW(M),EW(N) + +C Variables are described in MC77B/BD +C The input matrix A is dense and un-symmetric. + +C Local variables and parameters + DOUBLE PRECISION ONE, ZERO + PARAMETER ( ONE=1.0D+00, ZERO=0.0D+00 ) + INTEGER I, J, K + DOUBLE PRECISION S +C Intrinsic functions + INTRINSIC SQRT, MAX, ABS + + INFO = 0 + NITER = 0 + ERR(1) = ZERO + ERR(2) = ZERO + +C Initialisations ... + DO 10 I = 1, M + IW(I) = 0 + DW(I) = ZERO + D(I) = ONE + 10 CONTINUE + DO 15 J = 1, N + JW(J) = 0 + EW(J) = ZERO + E(J) = ONE + 15 CONTINUE + +C Now, we compute the initial one-norm of each row and column. + DO 20 J=1,N + DO 30 I=1,M + IF (A(I,J).GT.ZERO) THEN + DW(I) = DW(I) + A(I,J) + IW(I) = IW(I) + 1 + EW(J) = EW(J) + A(I,J) + JW(J) = JW(J) + 1 + ENDIF + 30 CONTINUE + 20 CONTINUE + + DO 40 I=1,M + IF (IW(I).GT.0) D(I) = SQRT(DW(I)) + 40 CONTINUE + DO 45 J=1,N + IF (JW(J).GT.0) E(J) = SQRT(EW(J)) + 45 CONTINUE + + DO 60 K=1,M + IF ( (IW(K).GT.0) .OR. (JW(K).GT.0) ) GOTO 99 + 60 CONTINUE +C Since we enforce M=N in the case of the one-norm, the tests can be +C done in one shot. For future relases, (M/=N) we should incorporate +C instead : +Cnew DO 60 I=1,M +Cnew IF (IW(I).GT.0) GOTO 99 +Cne60 CONTINUE +Cnew DO 65 J=1,N +Cnew IF (JW(J).GT.0) GOTO 99 +Cne65 CONTINUE + GOTO 200 + + +C Then, iterate on the normalisation of rows and columns. + 99 NITER = NITER + 1 + IF ( (NITER.GT.MAXIT) .AND. (MAXIT.GE.0) ) THEN + IF (CHECK.GT.0) INFO = 1 + NITER = NITER - 1 + GOTO 100 + ENDIF + + DO 110 I=1,M + DW(I) = ZERO + 110 CONTINUE + DO 115 J=1,N + EW(J) = ZERO + 115 CONTINUE + + DO 120 J=1,N + IF (JW(J).GT.0) THEN + DO 130 I=1,M + S = A(I,J) / (D(I)*E(J)) + EW(J) = EW(J) + S + DW(I) = DW(I) + S + 130 CONTINUE + ENDIF + 120 CONTINUE + + DO 150 I=1,M + IF (IW(I).GT.0) D(I) = D(I)*SQRT(DW(I)) + 150 CONTINUE + DO 155 J=1,N + IF (JW(J).GT.0) E(J) = E(J)*SQRT(EW(J)) + 155 CONTINUE + +C Stopping criterion : + IF (CHECK.LE.0) GOTO 99 +C IF (MOD(NITER,CHECK).NE.0) GOTO 99 + +C N.B. the test is performed on the basis of the values in arrays +C DW and EW which, in fact, correspond to the row and column +C norms of the scaled matrix at the previous iteration ... + 100 IF (INFO.NE.0) GOTO 200 + ERR(1) = ZERO + DO 170 I=1,M + IF (IW(I).GT.0) ERR(1) = MAX( ERR(1), ABS(ONE-DW(I)) ) + 170 CONTINUE + ERR(2) = ZERO + DO 175 J=1,N + IF (JW(J).GT.0) ERR(2) = MAX( ERR(2), ABS(ONE-EW(J)) ) + 175 CONTINUE + IF ( (ERR(1).LT.THRESH) .AND. (ERR(2).LT.THRESH) ) GOTO 200 + + IF (CHECK.GT.0) GOTO 99 + + 200 RETURN + END + +C********************************************************************** + SUBROUTINE MC77LD(N,A,DE, + & CHECK,THRESH,ERR,MAXIT,NITER, + & IJW,DEW,INFO) +C +C ********************************************************************* +C *** Infinity norm --- The symmetric-packed case *** +C *** DENSE format *** +C ********************************************************************* + INTEGER N,MAXIT,NITER,CHECK,INFO + INTEGER IJW(N) + DOUBLE PRECISION THRESH,ERR + DOUBLE PRECISION A(*),DE(N),DEW(N) + +C Variables are described in MC77B/BD +C The lower triangular part of the dense symmetric matrix A +C is stored contiguously column by column. + +C Local variables and parameters + DOUBLE PRECISION ONE, ZERO + PARAMETER ( ONE=1.0D+00, ZERO=0.0D+00 ) + INTEGER I, J, K + DOUBLE PRECISION S +C Intrinsic functions + INTRINSIC SQRT, MAX, ABS + + INFO = 0 + NITER = 0 + ERR = ZERO + +C Initialisations ... + DO 10 K = 1, N + IJW(K) = 0 + DEW(K) = ZERO + DE(K) = ONE + 10 CONTINUE + +C Now, we compute the initial infinity-norm of each row and column. + K = 1 + DO 20 J=1,N + DO 30 I=J,N + IF (DEW(J).LT.A(K)) THEN + DEW(J) = A(K) + IJW(J) = I + ENDIF + IF (DEW(I).LT.A(K)) THEN + DEW(I) = A(K) + IJW(I) = J + ENDIF + K = K+1 + 30 CONTINUE + 20 CONTINUE + + DO 40 K=1,N + IF (IJW(K).GT.0) DE(K) = SQRT(DEW(K)) + 40 CONTINUE + + DO 50 J=1,N + I = IJW(J) + IF (I.GT.0) THEN + IF (IJW(I).EQ.J) THEN + IJW(I) = -IJW(I) + IF (I.NE.J) IJW(J) = -IJW(J) + ENDIF + ENDIF + 50 CONTINUE + + DO 60 K=1,N + IF (IJW(K).GT.0) GOTO 99 + 60 CONTINUE + GOTO 200 + + +C Then, iterate on the normalisation of rows and columns. + 99 NITER = NITER + 1 + IF ( (NITER.GT.MAXIT) .AND. (MAXIT.GE.0) ) THEN + IF (CHECK.GT.0) INFO = 1 + NITER = NITER - 1 + GOTO 100 + ENDIF + + DO 110 K=1,N + DEW(K) = ZERO + 110 CONTINUE + + K = 1 + DO 120 J=1,N + IF (IJW(J).GT.0) THEN + DO 130 I=J,N + S = A(K) / (DE(I)*DE(J)) + IF (DEW(J).LT.S) THEN + DEW(J) = S + IJW(J) = I + ENDIF + IF (IJW(I).GT.0) THEN + IF (DEW(I).LT.S) THEN + DEW(I) = S + IJW(I) = J + ENDIF + ENDIF + K = K+1 + 130 CONTINUE + ELSE + DO 140 I=J,N + IF (IJW(I).GT.0) THEN + S = A(K) / (DE(I)*DE(J)) + IF (DEW(I).LT.S) THEN + DEW(I) = S + IJW(I) = J + ENDIF + ENDIF + K = K+1 + 140 CONTINUE + ENDIF + 120 CONTINUE + + DO 150 K=1,N + IF (IJW(K).GT.0) DE(K) = DE(K)*SQRT(DEW(K)) + 150 CONTINUE + + DO 160 J=1,N + I = IJW(J) + IF (I.GT.0) THEN + IF (IJW(I).EQ.J) THEN + IJW(I) = -IJW(I) + IF (I.NE.J) IJW(J) = -IJW(J) + ENDIF + ENDIF + 160 CONTINUE + +C Stopping criterion : + IF (CHECK.LE.0) GOTO 99 +C IF (MOD(NITER,CHECK).NE.0) GOTO 99 + +C N.B. the test is performed on the basis of the values in array +C DEW which, in fact, correspond to the row and column +C norms of the scaled matrix at the previous iteration ... + 100 IF (INFO.NE.0) GOTO 200 + ERR = ZERO + DO 170 K=1,N + IF (IJW(K).GT.0) ERR = MAX( ERR, ABS(ONE-DEW(K)) ) + 170 CONTINUE + IF (ERR.LT.THRESH) GOTO 200 + + IF (CHECK.GT.0) GOTO 99 + + 200 RETURN + END + +C********************************************************************** + SUBROUTINE MC77MD(N,A,DE, + & CHECK,THRESH,ERR,MAXIT,NITER, + & IJW,DEW,INFO) +C +C ********************************************************************* +C *** One norm --- The symmetric-packed case *** +C *** DENSE format *** +C ********************************************************************* + INTEGER N,MAXIT,NITER,CHECK,INFO + INTEGER IJW(N) + DOUBLE PRECISION THRESH,ERR + DOUBLE PRECISION A(*),DE(N),DEW(N) + +C Variables are described in MC77B/BD +C The lower triangular part of the dense symmetric matrix A +C is stored contiguously column by column. + +C Local variables and parameters + DOUBLE PRECISION ONE, ZERO + PARAMETER ( ONE=1.0D+00, ZERO=0.0D+00 ) + INTEGER I, J, K + DOUBLE PRECISION S +C Intrinsic functions + INTRINSIC SQRT, MAX, ABS + + INFO = 0 + NITER = 0 + ERR = ZERO + +C Initialisations ... + DO 10 K = 1, N + IJW(K) = 0 + DEW(K) = ZERO + DE(K) = ONE + 10 CONTINUE + +C Now, we compute the initial one-norm of each row and column. + K = 1 + DO 20 J=1,N + DO 30 I=J,N + IF (A(K).GT.ZERO) THEN + DEW(J) = DEW(J) + A(K) + IJW(J) = IJW(J) + 1 + IF (I.NE.J) THEN + DEW(I) = DEW(I) + A(K) + IJW(I) = IJW(I) + 1 + ENDIF + ENDIF + K = K+1 + 30 CONTINUE + 20 CONTINUE + + DO 40 K=1,N + IF (IJW(K).GT.0) DE(K) = SQRT(DEW(K)) + 40 CONTINUE + + DO 60 K=1,N + IF (IJW(K).GT.0) GOTO 99 + 60 CONTINUE + GOTO 200 + + +C Then, iterate on the normalisation of rows and columns. + 99 NITER = NITER + 1 + IF ( (NITER.GT.MAXIT) .AND. (MAXIT.GE.0) ) THEN + IF (CHECK.GT.0) INFO = 1 + NITER = NITER - 1 + GOTO 100 + ENDIF + + DO 110 K=1,N + DEW(K) = ZERO + 110 CONTINUE + + K = 1 + DO 120 J=1,N + IF (IJW(J).GT.0) THEN + DO 130 I=J,N + S = A(K) / (DE(I)*DE(J)) + DEW(J) = DEW(J) + S + IF (I.NE.J) DEW(I) = DEW(I) + S + K = K+1 + 130 CONTINUE + ENDIF + 120 CONTINUE + + DO 150 K=1,N + IF (IJW(K).GT.0) DE(K) = DE(K)*SQRT(DEW(K)) + 150 CONTINUE + +C Stopping criterion : + IF (CHECK.LE.0) GOTO 99 +C IF (MOD(NITER,CHECK).NE.0) GOTO 99 + +C N.B. the test is performed on the basis of the values in array +C DEW which, in fact, correspond to the row and column +C norms of the scaled matrix at the previous iteration ... + 100 IF (INFO.NE.0) GOTO 200 + ERR = ZERO + DO 170 K=1,N + IF (IJW(K).GT.0) ERR = MAX( ERR, ABS(ONE-DEW(K)) ) + 170 CONTINUE + IF (ERR.LT.THRESH) GOTO 200 + + IF (CHECK.GT.0) GOTO 99 + + 200 RETURN + END +C COPYRIGHT (c) 2000 Council for the Central Laboratory +* of the Research Councils +C Original date 3 September 1997 +C April 2001: call to MC49 changed to MC59 to make routine threadsafe + +C 12th July 2004 Version 1.0.0. Version numbering added. +C 28 February 2008. Version 1.0.1. Comments flowed to column 72. + + SUBROUTINE MC54AD(ICNTL,TITLE,KEY,M,N,NE,IP,IND,VALUE,IW,INFO) + INTEGER ICNTL(10) + CHARACTER TITLE*72,KEY*8 + INTEGER M,N,NE,IP(*),IND(*) + DOUBLE PRECISION VALUE(*) + INTEGER IW(*),INFO(5) + +C ================================================================ +C Code for writing a sparse matrix in Rutherford-Boeing format, +C input matrix can be assembled (row ptr/col index or coordinate +C form) or unassembled (finite-element form). +C For matrices with complex entries MC54AC/AZ should be used. +C For matrices with integer entries MC54AI should be used. +C ================================================================ + +C There follows a quick resume of the arguments ... full details follow. +C ICNTL(1) = output unit +C ICNTL(2) = precision of real data +C ICNTL(3) = numerical values or only pattern +C ICNTL(4) = shape/symmetry +C ICNTL(5) = type of input +C TITLE = descriptive title for matrix +C KEY = matrix identifier +C M = number of rows or maximum index +C N = number of columns or number of elements +C NE = number of nonzeros or elemental indices +C IP = pointer array +C IND = index array +C VALUE = numerical values +C IW = work array +C INFO = information and error flags +C +C ICNTL is an INTEGER array of length 10 that must be set by the user. +C It holds information on the input matrix and output file and controls +C the action of the subroutine. This argument is not altered by the +C subroutine. +C ICNTL(1) must be set by the user to the stream number for the output +C file on which the Rutherford-Boeing format will be written. +C ICNTL(2) must be set by the user to indicate the precision of the +C output reals. It should be set to the number of significant +C decimal digits in the numerical value of the entries. +C Values of ICNTL(2) less than or equal to one or greater +C than 17 are treated as if they were 17. ICNTL(2) is not +C accessed +C if ICNTL(3)=0. +C ICNTL(3) must be set by the user to indicate whether only the +C pattern is being supplied (ICNTL(3)=0) or whether real +C values are supplied (ICNTL(3) not equal to 0). +C ICNTL(4) must be set by the user to indicate whether matrix is +C symmetric (ICNTL(4)=0), skew symmetric (ICNTL(4)=1), +C rectangular (ICNTL(4)=2), or unsymmetric (ICNTL(4)=3). +C A value of ICNTL(4)=1 is invalid if ICNTL(3)=0. +C An error flag is set if ICNTL(4) < 0 or > 3. +C ICNTL(5) must be set by the user to indicate the format of the input +C matrix: ICNTL(5)=0 for an assembled matrix in +C column-oriented form, ICNTL(5)=1 for an assembled matrix in +C coordinate form, and ICNTL(5)=2 for an unassembled +C finite-element matrix. +C An error flag is set if ICNTL(5) < 0 or > 2. +C ICNTL(6) to ICNTL(10) are not accessed by the routine. +C +C TITLE is a CHARACTER*72 variable that must be set by the user to the +C text for the title line for the matrix. This argument is not altered +C by the subroutine. +C +C KEY is a CHARACTER*8 variable that must be set by the user to the +C identifying key for the matrix. If the keepers of the Collection +C find that this is identical to an already existing matrix, it will +C be changed after consultation with submitter. +C This argument is not altered by the subroutine. +C +C M is an INTEGER variable that must be set by the user. If the matrix +C is assembled, M is the number of rows of the matrix; if the matrix is +C an unassembled finite-element matrix, M is the value of the largest +C index used. +C This argument is not altered by the subroutine. +C +C N is an INTEGER variable that must be set by the user. If the matrix +C is assembled, N is the number of columns of the matrix; if the matrix +C is an unassembled finite-element matrix, N is the number of elements. +C This argument is not altered by the subroutine. +C +C NE is an INTEGER variable that must be set by the user. If the matrix +C is assembled, NE is the number of entries in the matrix; if the matrix +C is an unassembled finite-element matrix, NE is the number of indices +C in the element lists. +C This argument is not altered by the subroutine. +C +C IP is an INTEGER array of size MAX(M,N)+1 or 2*N+1 if input is a +C rectangular elemental matrix. If the matrix is stored in +C column-oriented form, IP must be set by the user so that IP(J), +C J=1, ..., N holds the position in IND of the first entry in column J +C and IP(N+1)-1 holds the position of the last entry in column N. +C For unassembled finite-element problems (ICNTL(5) not equal to 0 +C or 1), IP(I) must point to the start of the list of indices for +C element I in array IND. +C If elements are rectangular, then the row indices for element I +C are in positions IP(2*I-1) to IP(2*I)-1 of IND and the column +C indices for element I are in positions IP(2*I) to IP(2*I+1)-1. +C In these cases, this argument is not altered by the subroutine. +C If the matrix is held in coordinate form, IP need not be set on entry +C and, on exit, IP(J) will be set to the position in IND of the first +C row index in column J in the reordered matrix. +C +C IND is an INTEGER array whose first NE positions must be set by +C the user. If the matrix is assembled, IND must hold the row indices +C of the entries. If storage is column-oriented, these must be ordered +C by columns. If storage is in coordinate form, the corresponding column +C indices must be in positions IND(NE+I), I=1, ... NE. In this case, +C the matrix entries can be in any order. For a symmetric matrix, only +C the lower triangle should be stored. If the matrix is an unassembled +C finite-element matrix, IND must hold the list of indices of the +C variables in each element in turn. IND is not altered by the +C subroutine, unless input is in coordinate form (ICNTL(5)=1), in which +C case it will hold row indices of the reordered matrix. +C +C VALUE is a DOUBLE PRECISION array. If ICNTL(3) is equal to 1, it +C must be set by the user to contain the numerical values of the +C entries. For an assembled matrix, the first NE positions must contain +C the values of the entries whose row indices are in corresponding +C positions in IND. For an unassembled finite-element matrix, the first +C entries of VALUE must contain contiguously the numerical values of +C each element. If these are symmetric only the lower triangle should be +C held ordered by columns. VALUE is not altered by the subroutine, +C unless matrix is input in coordinate form (ICNTL(5)=1), in which case +C it will hold the values for the reordered matrix. + +C IW is an INTEGER work array of length MAX(M,N)+1 that is only accessed +C if the matrix is input in coordinate form (ICNTL(5)=1). +C +C INFO is an INTEGER array that need not be set by the user. On exit, +C INFO(1) will be zero if no error is detected, and negative otherwise. +C Possible nonzero values are: +C -1 M <= 0. INFO(2) holds value of M. +C -2 N <= 0. INFO(2) holds value of N. +C -3 NE <= 0. INFO(2) holds value of NE. +C -4 ICNTL(4) out of range. INFO(2) holds value of ICNTL(4). +C -5 ICNTL(5) out of range. INFO(2) holds value of ICNTL(5). +C -6 ICNTL(4) = 1 but ICNTL(3) = 0. INFO(2) = 0. +C -7 Matrix was submitted in column-oriented form with IP(I+1) < IP(I) +C for some I, 1<= I <= N. INFO(2) holds the value of I. +C -8 Index out-of-range. INFO(2) holds index of component. +C -9 Matrix was submitted in column-oriented form with rows not in +C order within each column. INFO(2) holds index of column. + +C Internal variables + CHARACTER INDFMT*16, MXTYPE*3, PTRFMT*16, VALFMI*20, VALFMO*20 + LOGICAL YESA + INTEGER DEC,I,INDN,INDCRD,J,K,NELTVL,NN,OUTFIL,PTRCRD, + * PTRN,TOTCRD,VALCRD,ICT59(10),INFO59(10) + EXTERNAL MC54BD,MC54CD,MC54DD,MC54ED,MC59AD + +C Check for trivial error returns + INFO(1) = 0 + INFO(2) = 0 + IF (M.LE.0) THEN + INFO(1) = -1 + INFO(2) = M + GO TO 500 + ENDIF + IF (N.LE.0) THEN + INFO(1) = -2 + INFO(2) = N + GO TO 500 + ENDIF + IF (NE.LE.0) THEN + INFO(1) = -3 + INFO(2) = NE + GO TO 500 + ENDIF + IF (ICNTL(4).LT.0 .OR. ICNTL(4).GT.3) THEN + INFO(1) = -4 + INFO(2) = ICNTL(4) + GO TO 500 + ENDIF + IF (ICNTL(5).LT.0 .OR. ICNTL(5).GT.2) THEN + INFO(1) = -5 + INFO(2) = ICNTL(5) + GO TO 500 + ENDIF + IF (ICNTL(3).EQ.0 .AND. ICNTL(4).EQ.1) THEN + INFO(1) = -6 + GO TO 500 + ENDIF + + IF (ICNTL(5).NE.1) THEN + NN = N + IF ((ICNTL(5).NE.1 .AND. ICNTL(5).NE.0) .AND. ICNTL(4).EQ.2) + * NN = 2*N + DO 10 I = 1,NN + IF (IP(I+1).LT.IP(I)) THEN + INFO(1) = -7 + INFO(2) = I + GO TO 500 + ENDIF + 10 CONTINUE + ENDIF + + DO 20 I = 1,NE + IF (IND(I).LE.0 .OR. IND(I).GT.M) THEN + INFO(1) = -8 + INFO(2) = I + GO TO 500 + ENDIF + IF (ICNTL(5).EQ.1) THEN + IF (IND(NE+I).LE.0 .OR. IND(NE+I).GT.N) THEN + INFO(1) = -8 + INFO(2) = I + GO TO 500 + ENDIF + ENDIF + 20 CONTINUE + +C If input is by columns, check that rows are in order. + IF (ICNTL(5).EQ.0) THEN + DO 40 J=1,N + DO 30 K=IP(J),IP(J+1)-2 + IF (IND(K).GE.IND(K+1)) THEN + INFO(1) = -9 + INFO(2) = J + GO TO 500 + ENDIF + 30 CONTINUE + 40 CONTINUE + ENDIF + +C Set MXTYPE and determine form of input + IF (ICNTL(3).EQ.0) THEN + MXTYPE(1:1) = 'p' + YESA = .FALSE. + ELSE + MXTYPE(1:1) = 'r' + YESA = .TRUE. + ENDIF + IF (ICNTL(4).EQ.0) MXTYPE(2:2) = 's' + IF (ICNTL(4).EQ.1) MXTYPE(2:2) = 'z' + IF (ICNTL(4).EQ.2) MXTYPE(2:2) = 'r' + IF (ICNTL(4).EQ.3) MXTYPE(2:2) = 'u' + + IF (ICNTL(5).EQ.0 .OR. ICNTL(5).EQ.1) THEN + MXTYPE(3:3) = 'a' +C Generate Col ptr/row index form if not input + IF (ICNTL(5).EQ.1) THEN + ICT59(1) = 1 + ICT59(2) = 1 + ICT59(3) = 1 + IF (YESA) ICT59(3) = 0 + ICT59(4) = -1 + ICT59(5) = -1 + ICT59(6) = 0 + CALL MC59AD(ICT59,N,M,NE,IND,NE,IND(NE+1),NE,VALUE, + * MAX(M,N)+1,IP,MAX(M,N)+1,IW,INFO59) + ENDIF + NELTVL = NE + ELSE + MXTYPE(3:3) = 'e' +C Calculate NELTVL + NELTVL = 0 + DO 50 I=1,N + IF (MXTYPE(2:2) .EQ. 'u') THEN + NELTVL = NELTVL+(IP(I+1)-IP(I))*(IP(I+1)-IP(I)) + ELSE IF (MXTYPE(2:2) .EQ. 'r') THEN +C Rectangular element matrices + NELTVL = NELTVL+((IP(2*I)-IP(2*I-1))*(IP(2*I+1)-IP(2*I))) + ELSE +C Symmetric or skew-symmetric element matrices + NELTVL = NELTVL+((IP(I+1)-IP(I))*(IP(I+1)-IP(I)+1))/2 + ENDIF + 50 CONTINUE + ENDIF + + OUTFIL = ICNTL(1) + +C Set format and number card images for pointer array + CALL MC54DD(NE+1,PTRN,PTRFMT) + PTRCRD = N/PTRN + 1 + IF (MXTYPE(3:3).EQ.'e' .AND. MXTYPE(2:2) .EQ. 'r') + *PTRCRD = (2*N)/PTRN + 1 + +C Set format and number card images for index array + CALL MC54DD(M,INDN,INDFMT) + INDCRD = (NE-1)/INDN + 1 + +C Set number of card images for matrix entries + IF (YESA) THEN +C DEC is set to number of significant decimal digits in matrix reals + DEC = ICNTL(2) + IF (DEC.LE.1 .OR. DEC.GT.17) DEC = 17 + CALL MC54ED(DEC,VALFMI,VALFMO,VALCRD) + VALCRD = (NELTVL-1)/VALCRD + 1 + ELSE + VALCRD = 0 + VALFMI = ' ' + ENDIF + + TOTCRD = PTRCRD + INDCRD + VALCRD + +C Write header card + IF (MXTYPE(3:3).EQ.'a') NELTVL = 0 + WRITE( OUTFIL, 999 ) TITLE, KEY, + 1 TOTCRD, PTRCRD, INDCRD, VALCRD, + 2 MXTYPE, M, N, NE, NELTVL, + 3 PTRFMT, INDFMT, VALFMI + 999 FORMAT ( A72, A8 / I14, 3(1X,I13) / A3, 11X, 4(1X,I13) / + 1 2A16, A20 ) + +C Write pointer array + NN = N + IF (MXTYPE(3:3).EQ.'e' .AND. MXTYPE(2:2) .EQ. 'r') NN = 2*N + CALL MC54BD(NN+1,IP,PTRFMT,OUTFIL) + +C Write indices + CALL MC54BD(NE,IND,INDFMT,OUTFIL) + +C Write matrix entries + IF (MXTYPE(3:3).EQ.'a') NELTVL = NE + IF (YESA) CALL MC54CD(NELTVL,VALUE,VALFMO,OUTFIL) + + + 500 RETURN + END + + SUBROUTINE MC54BD(N,IND,FMTIND,LUNIT) + INTEGER N,LUNIT,IND(N) + CHARACTER*16 FMTIND + WRITE(LUNIT,FMTIND) IND + RETURN + END + + SUBROUTINE MC54CD(N,A,FMTA,LUNIT) + INTEGER N,LUNIT + DOUBLE PRECISION A(N) + CHARACTER*20 FMTA + WRITE(LUNIT,FMTA) A + RETURN + END + + SUBROUTINE MC54DD(N,NLIN,FMT) + INTEGER N,NLIN,NN,K,NL(11) + CHARACTER*16 FMT,FMTAB(11) + DATA FMTAB / '(40I2)', '(26I3)', '(20I4)', '(16I5)', + * '(13I6)', '(11I7)', '(10I8)', '(8I9)', + * '(8I10)', '(7I11)', '(4I20)'/, + * NL / 40,26,20,16,13,11,10,8,8,7,4 / +C Note that any signed 32-bit integer can be held in a field of length +C 11, and any signed 64-bit integer can be held in a field of length 20, +C both allowing a space for the sign. + NN = N + DO 10 K=1,N + IF (NN.LT.10) GO TO 20 + NN = NN/10 + 10 CONTINUE + 20 IF (K.LE.10) THEN + FMT = FMTAB(K) + NLIN = NL(K) + ELSE + FMT = FMTAB(11) + NLIN = NL(11) + ENDIF + RETURN + END + + SUBROUTINE MC54ED(DEC,VALFMI,VALFMO,VALCRD) + INTEGER DEC + CHARACTER*20 VALFMI,VALFMO + INTEGER VALCRD + CHARACTER*20 FMT(16),FMT1(16) + INTEGER LEN(16) + DATA FMT / '(8E10.1E3)', '(7E11.2E3)', '(6E12.3E3)', + * '(6E13.4E3)', + * '(5E14.5E3)', '(5E15.6E3)', '(5E16.7E3)', + * '(4E17.8E3)', '(4E18.9E3)', '(4E19.10E3)', + * '(4E20.11E3)', '(3E21.12E3)', '(3E22.13E3)', + * '(3E23.14E3)', '(3E24.15E3)', '(3E25.16E3)'/, + * FMT1 / '(1P,8E10.1E3)', '(1P,7E11.2E3)', '(1P,6E12.3E3)', + * '(1P,6E13.4E3)', + * '(1P,5E14.5E3)', '(1P,5E15.6E3)', '(1P,5E16.7E3)', + * '(1P,4E17.8E3)', '(1P,4E18.9E3)', '(1P,4E19.10E3)', + * '(1P,4E20.11E3)', '(1P,3E21.12E3)', '(1P,3E22.13E3)', + * '(1P,3E23.14E3)', '(1P,3E24.15E3)', '(1P,3E25.16E3)'/, + * LEN / 8,7,6,6,5,5,5,4,4,4,4,3,3,3,3,3/ + VALFMI = FMT(DEC-1) + VALFMO = FMT1(DEC-1) + VALCRD = LEN(DEC-1) + RETURN + END diff --git a/coinhsl/common/deps.lo b/coinhsl/common/deps.lo new file mode 100644 index 0000000..d922992 --- /dev/null +++ b/coinhsl/common/deps.lo @@ -0,0 +1,12 @@ +# coinhsl/common/deps.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4.6 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/deps.o' + +# Name of the non-PIC object +non_pic_object=none + diff --git a/coinhsl/common/deps90.f90 b/coinhsl/common/deps90.f90 new file mode 100644 index 0000000..d75ac82 --- /dev/null +++ b/coinhsl/common/deps90.f90 @@ -0,0 +1,23010 @@ +! F90 dependencies +! COPYRIGHT (c) 2006 Council for the Central Laboratory +! of the Research Councils +! Original date 21 August 2006. Version 1.0.0. +! +! Version 1.4.1 +! See ChangeLog for history + +module hsl_ma54_double + + implicit none + EXTERNAL dgemm, dtrsm, dsyrk, dcopy, dtpsv, dgemv + + integer,parameter,private :: wp = kind(1.0d0) ! Precision parameter. + integer,parameter,private :: long = selected_int_kind(18) ! Long integer. + real(wp),parameter,private :: unity = 1.0_wp + integer(long),parameter,private :: one = 1_long + + interface ma54_to_block + module procedure ma54_to_block_double + end interface + + interface ma54_from_block + module procedure ma54_from_block_double + end interface + + interface ma54_factor + module procedure ma54_factor_double + end interface + + interface ma54_solve1 + module procedure ma54_solve1_double + end interface + + interface ma54_solve2 + module procedure ma54_solve2_double + end interface + + interface ma54_forward1 + module procedure ma54_forward1_double + end interface + + interface ma54_forward2 + module procedure ma54_forward2_double + end interface + + interface ma54_back1 + module procedure ma54_back1_double + end interface + + interface ma54_back2 + module procedure ma54_back2_double + end interface + + interface ma54_diag + module procedure ma54_diag_double + end interface + +contains + +subroutine ma54_to_block_double(n,p,nb,ap,buf,info,partial) +! Rearrange a packed triangular matrix to blocked hybrid format + integer, intent (in) :: n ! Specifies the matrix order + integer, intent (in) :: p ! Column p is be at the end of a block + integer, intent (in) :: nb ! Block size for the blocked hybrid format. + real (wp), intent (inout) :: ap((n*(n+one))/2) +! Holds the matrix, which is rearranged to the new format. + real (wp) :: buf(nb*int(n,long)) ! Work array. + integer, intent (out) :: info ! set to unity of these values: +! 0 Successful solution. +! < 0 Failure + logical, optional, intent(in) :: partial ! Ignored. + +! Local variables + integer :: jb ! Length of block + integer :: j1 ! First column of block + integer :: i, j ! Row, column index within the block column + integer(long) :: ijap, ijbuf ! Positions of entry in ap and buf + integer(long) :: ac ! Position in ap of start of block column + integer :: l ! Length of row or column + integer :: lb ! Length of block column + + intrinsic min + + info = 0 + if (p > n) info = -3 + if (n < 0) info = -1 + if (p < 0) info = -2 + if (nb < 1) info = -5 + if (info/=0 .or. n==0) return + + ijap = 1 +! Main loop over block columns + do j1 = 1,p,nb + jb = min(nb,p-j1+1) + lb = n - j1 + 1 + ac = ijap +! Copy to the buffer + ijbuf = 1 + do j = 1, jb + l = lb - j + 1 + call dcopy(l,ap(ijap),1,buf(ijbuf),1) + ijbuf = ijbuf + lb + 1 + ijap = ijap + l + end do + +! Copy array back from buffer + ijap = ac + do i = 1, lb + l = min(i,jb) + call dcopy(l,buf(i),lb,ap(ijap),1) + ijap = ijap + l + end do + end do + +end subroutine ma54_to_block_double + +subroutine ma54_factor_double(n,p,nb,ap,buf,info,n_threads) +! Cholesky part factorization of a symmetric positive-definite matrix held +! in packed blocked hybrid format. + +!$ use omp_lib + + integer, intent (in) :: n ! Specifies the matrix order + integer, intent (in) :: p ! Factorize to column p + integer, intent (in) :: nb ! Block size for the blocked hybrid format. + real (wp), intent (inout) :: ap(0:(n*(n+one))/2-1) ! Holds the matrix +! A in packed blocked hybrid format. The ma54_factor of A is +! contained in packed blocked hybrid format on exit. + real (wp) :: buf(nb*int(n,long)) ! Work array. + integer, intent (out) :: info ! set to unity of these values: +! 0 Successful solution. +! /= 0 Failure: +! > 0. The leading minor of order info is not positive +! definite, and the factorization could not be completed. + integer, intent (inout), optional :: n_threads ! Controls the number of +! threads used in OpenMP parallel regions. Its value may be changed +! by another thread during the execution of this subroutine. +! 0 Execute on omp_get_num_threads() threads. +! 1 Execute on a single thread without reference to OpenMP. +! >1 Execute on n_threads threads. +! Absence is treated as equivalent to presence with the value 0. + +! Local variables + integer i ! Temporary variable + integer ib ! Length of block row + integer(long) ii ! Position in ap of diagonal entry + integer j ! First column of current block column + integer jb ! Number of columns in current block column + integer(long) jbt ! Size of packed triangle of order jb + integer(long) jj ! Position in ap of start of current diagonal block + integer(long) jk ! Position in ap of start of current block + integer kb ! Number of columns in earlier block column + integer k ! First column of current block + integer l ! Length of column + integer lb ! Length of block column + integer(long) kk ! Position in buf of diagonal entry + integer nt ! Number of threads + + intrinsic min + + info = 0 + if (p > n) info = -3 + if (n < 0) info = -1 + if (p < 0) info = -2 + if (nb <= 0) info = -5 + if (info/=0 .or. n==0) return + + jj = 0 +! Loop over leading block columns + do j = 1, p, nb + jb = min(nb,p-j+1) + jbt = (jb*(jb+one))/2 + ii = jj + kk = 1 +! Move diagonal block to buf in full upper format + do i = 1, jb +! Transfer i-th row of ap to i-th col of buf, if n > nb + call dcopy(i,ap(ii),1,buf(kk),1) + ii = ii + i + kk = kk + jb + end do + +! Choose the number of threads for the next parallel loop + nt = 1 +!$ nt = omp_get_max_threads() + if( nt>1 ) then + if ( present(n_threads) ) then + if( n_threads>0 ) nt = n_threads + end if + end if +!$ if (nt>0) call omp_set_num_threads(nt) + +! Apply the previous elimination operations to the block column +!$omp parallel default(none) & +!$omp private(i, k, jk, kb, ib) & +!$omp shared(ap, j, jb, n, nb, jj, jbt, p, buf, info, lb) +! Note that the implied barrier at end of single avoids write-write +! data races in the syrk updates, allowing a NOWAIT on the gemm loop + jk = 0 + do k = 1, min(j-1,p), nb ! Loop over block columns + kb = min(nb,p-k+1) + jk = jk + (j-k)*int(kb,long) - (kb*(kb-one))/2 +! Update the diagonal block, held in buf +!$omp single + call dsyrk('U','T',jb,kb,-unity,ap(jk),kb,unity,buf,jb) +!$omp end single +!$omp do + do i = j+jb, n, nb + ib = min(n+1-i, nb) + call dgemm('T','N',jb,ib,kb,-unity,ap(jk),kb, & + ap(jk+kb*int(i-j,long)),kb,unity, & + ap(jj+jbt+jb*int(i-j-jb)),jb) + end do +!$omp end do nowait + jk = jk + (n+one-j)*kb + end do +! Cholesky factorization of diagonal block +!$omp single + call dkcf(jb,buf,jb,i) +! call dpotrf('u',jb,buf,jb,i) + if (i>0) info = i + j - 1 +!$omp end single +! Important: implied barrier at end of single flushes info + if(info.eq.0) then +! Calculate the sub-diagonal blocks of L in the current block column +!$omp do + do i = j+jb, n, nb + ib = min(n+1-i, nb) + call dtrsm('L','U','T','N',jb,ib,unity,buf,jb, & + ap(jj+jbt+jb*int(i-j-jb)),jb) + end do +!$omp end do + end if +!$omp end parallel + if(info.ne.0) return + + ii = jj + kk = 1 +! Move diagonal block back from buf to ap + do i = 1, jb + call dcopy(i,buf(kk),1,ap(ii),1) + ii = ii + i + kk = kk + jb + end do + + jj = jj + jb*(n-j+one) - (jb*(jb-one))/2 + end do + +! Loop over trailing block columns + do j = p+1, n, nb + jb = min(nb,n-j+1) + jbt = (jb*(jb+one))/2 + ii = jj + kk = 1 +! Move block column to buf in rectangular format + lb = n - j + 1 + do i = 1, jb + l = lb - i + 1 + call dcopy(l,ap(ii),1,buf(kk),1) + ii = ii + l + kk = kk + lb + 1 + end do + +! Choose the number of threads for the next parallel loop + nt = 1 +!$ nt = omp_get_max_threads() + if( nt>1 ) then + if ( present(n_threads) ) then + if( n_threads>0 ) nt = n_threads + end if + end if +!$ if (nt>0) call omp_set_num_threads(nt) + +! Apply the previous elimination operations to the block column +!$omp parallel default(none) & +!$omp private(i, k, jk, kb, ib) & +!$omp shared(ap, j, jb, n, nb, jj, jbt, p, buf, info, lb) +! Note that the implied barrier at end of single avoids write-write +! data races in the syrk updates, allowing a NOWAIT on the gemm loop + jk = 0 + do k = 1, min(j-1,p), nb ! Loop over block columns + kb = min(nb,p-k+1) + jk = jk + (j-k)*int(kb,long) - (kb*(kb-one))/2 +! Update the diagonal block, held in buf +!$omp single + call dsyrk('L','T',jb,kb,-unity,ap(jk),kb,unity,buf,lb) +!$omp end single +! Update the off-diagonal part of the block column +!$omp do + do i = j+jb, n, nb + ib = min(n+1-i, nb) + call dgemm('T','N',ib,jb,kb,-unity, & + ap(jk+kb*int(i-j,long)),kb,ap(jk),kb, unity,buf(i-j+1),lb) + end do +!$omp end do nowait + + jk = jk + (n+one-j)*kb + end do +!$omp end parallel + if(info.ne.0) return + + ii = jj + kk = 1 +! Move block column back from buf to ap + do i = 1, jb + l = lb - i + 1 + call dcopy(l,buf(kk),1,ap(ii),1) + ii = ii + l + kk = kk + lb + 1 + end do + + jj = jj + jb*(n-j+one) - (jb*(jb-one))/2 + end do + +end subroutine ma54_factor_double + + +subroutine ma54_from_block_double(n,p,nb,ap,buf,info,partial) +! Rearrange blocked dhybrid packed matrix to packed triangular format + integer, intent (in) :: n ! Specifies the matrix order + integer, intent (in) :: p ! Column p is at the end of a block + integer, intent (in) :: nb ! Block size for the blocked hybrid format. + real (wp), intent (inout) :: ap((n*(n+one))/2) ! Holds the matrix, which +! is rearranged to the packed triangular format. + real (wp) :: buf(nb*int(n,long)) ! Work array. + integer, intent (out) :: info ! set to unity of these values: +! 0 Successful solution. +! < 0 Failure: + logical, optional, intent(in) :: partial ! Ignored + + integer :: jb ! Column length of block + integer :: j1 ! First column of block + integer :: i, j ! Row, column index within the block + integer(long) :: ijap, ijbuf ! Positions of ap(i1+i-1,j1+j-1), buf(i,j) + integer(long) :: ac ! Position in ap of start of block + integer :: l ! Length of row or column + integer :: lb ! Length of block column + intrinsic min + + info = 0 + if (p > n) info = -3 + if (n < 0) info = -1 + if (p < 0) info = -2 + if (nb < 1) info = -5 + if (info/=0 .or. n==0) return + + ijap = 1 +! Main loop over block columns + do j1 = 1, p, nb + jb = min(nb,p-j1+1) + lb = n - j1 + 1 + +! Copy to buffer + ac = ijap + do i = 1, lb + l = min(i,jb) + call dcopy(l,ap(ijap),1,buf(i),lb) + ijap = ijap + l + end do + +! Copy from the buffer + ijap = ac + ijbuf = 1 + do j = 1, jb + l = lb - j + 1 + call dcopy(l,buf(ijbuf),1,ap(ijap),1) + ijbuf = ijbuf + lb + 1 + ijap = ijap + l + end do + end do + +end subroutine ma54_from_block_double + + +subroutine ma54_forward2_double(n,p,nbo,nrhs,ap,b,ldb,mbo,buf,info) +! Partial forward substitution for unity or more sets of equations, given a +! partial Cholesky factorization in blocked hybrid format. + integer, intent (in) :: n ! Specifies the matrix order + integer, intent (in) :: p ! Number of columns + integer, intent (in) :: nbo ! Block size for the blocked hybrid format. + integer, intent (in) :: nrhs ! The number of right-hand sides. + real (wp), intent (in) :: ap(0:(p*(n*2-p+one))/2-1) ! Holds the matrix. + integer, intent (in) :: ldb ! The first dimension of the array b. + real (wp), intent (inout) :: b(ldb,*) ! Holds the right-hand sides on +! entry and is overwritten by the solution. + integer, intent (in) :: mbo ! Block size for the right-hand sides. + real (wp) :: buf(int(p,long)*nbo + int(n,long)*mbo) + ! Work array (needed if nrhs >=4) + integer, intent (out) :: info ! set to unity of these values: +! 0 Successful solution. +! < 0 Failure + +! Local variables + integer(long) :: bufb ! Position in buf that holds a buffer for b + integer :: i ! Row index + integer :: ib ! Number of columns in current block column of b + integer(long) :: ibp ! Current position in bufb + integer(long) :: ii ! Position in ap of diagonal entry + integer(long) :: ij ! Position in ap + integer :: j ! Column index + integer :: jb ! Number of columns in current block column of ap + integer(long) :: jbp ! Current position in bufb + integer(long) :: jbd ! nb*int(kb,long), increment for jbp + integer(long) :: jd ! size of current trapezoid / increment for jj + integer(long) :: jj ! Position in ap of start of current diagonal block + integer :: k ! First column of current block + integer :: kb ! ! Number of columns in current block column of b + integer(long) :: kk ! Position in buf of diagonal entry + integer(long) :: kks ! Current position in buf + integer :: mb ! block size used for the blocked rhs:min(m,mbo) + integer :: nb ! block size used for the blocked hybrid format: min(n,nbo) + integer(long) :: nb2 ! nb*int(nb,long) + integer(long) :: nbt ! Size of packed triangle of order nb + integer(long) :: nb1 ! Size of packed triangle of order nb-1 + + info = 0 + if (p>n) info = -3 + if (n<0) info = -1 + if (p<0) info = -2 + if (nrhs<0) info = -4 + if (nbo<1) info = -5 + if (ldb next triangle in ap + jd = jd - nb2 ! next delta for jj + kks = kks + nb2 ! -> next triangle of ap in buf + end do ! do j + +! Main loop over the block columns of b + do k = 1, nrhs, mb + kks = 1 + jd = n*int(nb,long) - nb1 + jj = 0 + kb = min(nrhs-k+1,mb) + +! Copy kb RHS from b(1:n,k:k+kb-1) to buffer bufb + jbp = 1 + do i = 1, p, nb + ib = min(p-i+1,nb) + do j = k, k + kb - 1 + call dcopy(ib,b(i,j),1,buf(bufb+jbp),1) + jbp = jbp + ib + end do + end do + do i = p+1, n, nb + ib = min(n-i+1,nb) + do j = k, k + kb - 1 + call dcopy(ib,b(i,j),1,buf(bufb+jbp),1) + jbp = jbp + ib + end do + end do + +! Solve U'*Y=B + jbd = nb*int(kb,long) ! delta for jbp + jbp = 1 + do j = 1, p, nb + jb = min(p-j+1,nb) + call dtrsm('L','U','T','N',jb,kb,unity,buf(kks),jb,buf(bufb+jbp),jb) + ibp = jbp + jb*int(kb,long) ! -> starting block of B + ij = jj + (jb*(jb+one))/2 ! -> starting block of AP + do i = j + nb, p, nb + ib = min(p-i+1,nb) + call dgemm('T','N',ib,kb,jb,-unity,ap(ij),jb,buf(bufb+jbp),jb,unity, & + buf(bufb+ibp),ib) + ibp = ibp + ib*int(kb,long) ! -> next block of B + ij = ij + ib*int(jb,long) ! -> next block of AP + end do ! do i + do i = p+1, n, nb + ib = min(n-i+1,nb) + call dgemm('T','N',ib,kb,jb,-unity,ap(ij),jb,buf(bufb+jbp),jb,unity, & + buf(bufb+ibp),ib) + ibp = ibp + ib*int(kb,long) ! -> next block of B + ij = ij + ib*int(jb,long) ! -> next block of AP + end do ! do i + jj = jj + jd + jd = jd - nb2 + jbp = jbp + jbd ! -> next block of B + kks = kks + nb2 ! -> next triangle of ap + end do ! do j + +! Copy solution to b(1:n,k:k+kb+1) + jbp = 1 ! -> to buf + do i = 1, p, nb + ib = min(p-i+1,nb) + do j = k, k + kb - 1 + call dcopy(ib,buf(bufb+jbp),1,b(i,j),1) + jbp = jbp + ib + end do + end do + do i = p+1, n, nb + ib = min(n-i+1,nb) + do j = k, k + kb - 1 + call dcopy(ib,buf(bufb+jbp),1,b(i,j),1) + jbp = jbp + ib + end do + end do + end do ! do k + +end subroutine ma54_forward2_double + +subroutine ma54_forward1_double(n,p,nb,ap,b,info) +! Partial forward substitution for unity set of equations, given a +! partial Cholesky factorization in blocked hybrid format. + integer, intent (in) :: n ! Specifies the matrix order + integer, intent (in) :: p ! Number of columns + integer, intent (in) :: nb ! Block size for the blocked hybrid format. + real (wp), intent (in) :: ap(0:(p*(n*2-p+one))/2-1) ! Holds the matrix. + real (wp), intent (inout) :: b(n) ! b(1:n) holds the right-hand +! sides on entry and is overwritten by the solution. + integer, intent (out) :: info ! set to unity of these values: +! 0 Successful solution. +! < 0 The value of argument -info is not valid. + +! Local variables + integer j ! First column of current block column + integer jb ! Number of columns in current block column + integer(long) jbt ! Size of packed triangle of order jb + integer(long) jd ! size of current trapezoid / increment for jj + integer(long) jj ! Position in ap of start of current diagonal block + integer(long) nb2 ! nb*int(nb,long) + integer(long) nbt ! Size of packed triangle of order nb + +! .. Executable Statements .. + info = 0 + if (p>n) info = -3 + if (n<0) info = -1 + if (p<0) info = -2 + if (nb<1) info = -5 + + if (info/=0 .or. n==0) return + jj = 0 + nb2 = nb*int(nb,long) + nbt = (nb2+nb)/2 + jd = n*int(nb,long) - nbt + nb + +! Solve U'*Y=B + do j = 1, p - nb, nb + call dtpsv('U','T','N',nb,ap(jj),b(j),1) + call dgemv('T',nb,n+1-j-nb,-unity,ap(jj+nbt),nb,b(j),1,unity,b(j+nb),1) + jj = jj + jd + jd = jd - nb2 + end do + jb = p - j + 1 + jbt = (jb*(jb+one))/2 + call dtpsv('U','T','N',jb,ap(jj),b(j),1) + if (n>=j+jb) then + call dgemv('T',jb,n+1-j-jb,-unity,ap(jj+jbt),jb,b(j),1,unity,b(j+jb),1) + end if +end subroutine ma54_forward1_double + + +subroutine ma54_back2_double(n,p,nb,nrhs,ap,b,ldb,mb,buf,info) +! Partial back substitution for unity or more sets of equations, given a +! partial Cholesky factorization in blocked hybrid format. + integer, intent (in) :: n ! Specifies the matrix order + integer, intent (in) :: p ! Number of columns + integer, intent (in) :: nb ! Block size for the blocked hybrid format. + integer, intent (in) :: nrhs ! The number of right-hand sides. + real (wp), intent (in) :: ap(0:(p*(n*2-p+one))/2-1) ! Holds the matrix. + integer, intent (in) :: ldb ! The first dimension of the array b. + real (wp), intent (inout) :: b(ldb,*) ! Holds the right-hand sides on +! entry and is overwritten by the solution. + integer, intent (in) :: mb ! Block size for the right-hand sides. + real (wp) :: buf(p*int(nb,long) + n*int(mb,long)) ! Work array + integer, intent (out) :: info ! set to unity of these values: +! 0 Successful solution. +! < 0 Failure + +! Local variables + integer(long) :: bufb + integer :: i ! Row index + integer :: ib ! Number of columns in current block column of b + integer(long) :: ibp ! Current position in bufb + integer(long) :: ii ! Position in ap of diagonal entry + integer(long) :: ij ! Position in ap + integer :: j ! Column index + integer :: jb ! Number of columns in current block column of ap + integer(long) :: jbp ! Current position in bufb + integer(long) :: jbd ! nb*int(kb,long), increment for jbp + integer(long) :: jd ! size of current trapezoid / increment for jj + integer(long) :: jj ! Position in ap of start of current diagonal block + integer :: k ! First column of current block + integer :: kb ! ! Number of columns in current block column of b + integer(long) :: kk ! Position in buf of diagonal entry + integer(long) :: kks ! Current position in buf + integer(long) :: nb2 ! nb*int(nb,long) + integer(long) :: nbt ! Size of packed triangle of order nb + integer(long) :: nb1 ! Size of packed triangle of order nb-1 + + info = 0 + if (p>n) info = -3 + if (n<0) info = -1 + if (p<0) info = -2 + if (nrhs<0) info = -4 + if (nb<1) info = -5 + if (ldb next triangle in ap + jd = jd - nb2 ! next delta for jj + kks = kks + nb2 ! -> next triangle of ap in buf + end do ! do j + +! Main loop over the block columns of b + do k = 1, nrhs, mb + kb = min(nrhs-k+1,mb) + +! Copy kb RHS from b(1:n,k:k+kb-1) to buffer bufb + jbp = 1 + do i = 1, p, nb + ib = min(p-i+1,nb) + do j = k, k + kb - 1 + call dcopy(ib,b(i,j),1,buf(bufb+jbp),1) + jbp = jbp + ib + end do + end do + do i = p+1, n, nb + ib = min(n-i+1,nb) + do j = k, k + kb - 1 + call dcopy(ib,b(i,j),1,buf(bufb+jbp),1) + jbp = jbp + ib + end do + end do + +! Solve U*X=Y + j = ((p-1)/nb)*int(nb,long) + jj = (j*(n+n-j+one))/2 + jbp = 1+j*int(kb,long) + jbd = nb*int(kb,long) ! delta for jbp + jd = (nb*(2*(n-j)+nb+one))/2 + kks = 1+j*int(nb,long) + do j = j+1, 1, -nb + jb = min(p-j+1,nb) + ij = jj + (jb*(jb+one))/2 ! -> starting block of AP + ibp = jbp + jb*int(kb,long) ! -> starting update block of B + do i = j + nb, p, nb + ib = min(p-i+1,nb) + call dgemm('N','N',jb,kb,ib,-unity,ap(ij),jb,buf(bufb+ibp),ib,unity, & + buf(bufb+jbp),jb) + ibp = ibp + ib*int(kb,long) ! -> next block of B + ij = ij + ib*int(jb,long) ! -> next block of AP + end do ! do i + do i = p+1, n, nb + ib = min(n-i+1,nb) + call dgemm('N','N',jb,kb,ib,-unity,ap(ij),jb,buf(bufb+ibp),ib,unity, & + buf(bufb+jbp),jb) + ibp = ibp + ib*int(kb,long) ! -> next block of B + ij = ij + ib*int(jb,long) ! -> next block of AP + end do ! do i + call dtrsm('L','U','N','N',jb,kb,unity,buf(kks),jb,buf(bufb+jbp),jb) + jj = jj - jd ! -> next triangle of AP + jd = jd + nb2 ! next delta for jj + jbp = jbp - jbd ! -> current block of B + kks = kks - nb2 ! -> current triangle of ap + end do ! do j + +! Copy solution to b(1:n,k:k+kb+1) + jbp = 1 ! -> to buf + do i = 1, p, nb + ib = min(p-i+1,nb) + do j = k, k + kb - 1 + call dcopy(ib,buf(bufb+jbp),1,b(i,j),1) + jbp = jbp + ib + end do + end do + do i = p+1, n, nb + ib = min(n-i+1,nb) + do j = k, k + kb - 1 + call dcopy(ib,buf(bufb+jbp),1,b(i,j),1) + jbp = jbp + ib + end do + end do + end do ! do k + +end subroutine ma54_back2_double + +subroutine ma54_back1_double(n,p,nb,ap,b,info) +! Partial back substitution for unity set of equations, given a +! partial Cholesky factorization in blocked hybrid format. + integer, intent (in) :: n ! Specifies the matrix order + integer, intent (in) :: p ! Number of columns + integer, intent (in) :: nb ! Block size for the blocked hybrid format. + real (wp), intent (in) :: ap(0:(p*(n*2-p+one))/2-1) ! Holds the matrix. + real (wp), intent (inout) :: b(n) ! b(1:n) holds the right-hand +! sides on entry and is overwritten by the solution. + integer, intent (out) :: info ! set to unity of these values: +! 0 Successful solution. +! < 0 The value of argument -info is not valid. + + integer i ! Temporary variable + integer j ! First column of current block column + integer jb ! Number of columns in current block column + integer(long) jbt ! Size of packed triangle of order jb + integer(long) jd ! size of current trapezoid / increment for jj + integer(long) jj ! Position in ap of start of current diagonal block + integer(long) nb2 ! nb*int(nb,long) + integer(long) nbt ! Size of packed triangle of order nb + + info = 0 + if (p>n) info = -3 + if (n<0) info = -1 + if (p<0) info = -2 + if (nb<1) info = -5 + if (info/=0 .or. n==0) return + + jj = 0 + nb2 = nb*int(nb,long) + nbt = (nb2+nb)/2 + jd = n*int(nb,long) - nbt + nb + do j = 1, p - nb, nb + jj = jj + jd + jd = jd - nb2 + end do + jb = p - j + 1 + jbt = (jb*(jb+one))/2 + if (n>=j+jb) then + call dgemv('N',jb,n+1-j-jb,-unity,ap(jj+jbt),jb,b(j+jb),1,unity,b(j),1) + end if + call dtpsv('U','N','N',jb,ap(jj),b(j),1) + i = j - nb + do j = i, 1, -nb + jd = jd + nb2 + jj = jj - jd + call dgemv('N',nb,n+1-j-nb,-unity,ap(jj+nbt),nb,b(j+nb),1,unity,b(j),1) + call dtpsv('U','N','N',nb,ap(jj),b(j),1) + end do + +end subroutine ma54_back1_double + +subroutine ma54_solve1_double(n,nb,ap,b,info) +! Solve unity or more sets of equations, given the Cholesky factorization +! of its matrix in blocked hybrid format. +! For the character argument, the case is insignificant. + integer, intent (in) :: n ! Specifies the matrix order + integer, intent (in) :: nb ! Block size for the blocked hybrid format. + real (wp), intent (in) :: ap(0:(n*(n+one))/2-1) ! Holds the matrix. + real (wp), intent (inout) :: b(n) ! holds the right-hand side on entry +! and is overwritten by the solution. + integer, intent (out) :: info ! set to unity of these values: +! 0 Successful solution. +! < 0 Failure + + integer i ! Temporary variable + integer j ! First column of current block column + integer jb ! Number of columns in current block column + integer(long) jd ! size of current trapezoid / increment for jj + integer(long) jj ! Position in ap of start of current diagonal block + integer(long) nb2 ! nb*int(nb,long) + integer(long) nbt ! Size of packed triangle of order nb + + info = 0 + if (n<0) info = -1 + if (nb<1) info = -5 + + if (info/=0 .or. n==0) return + + jj = 0 + nb2 = nb*int(nb,long) + nbt = (nb2+nb)/2 + jd = n*int(nb,long) - nbt + nb + +! Solve U'*Y=B + do j = 1, n - nb, nb + call dtpsv('U','T','N',nb,ap(jj),b(j),1) + call dgemv('T',nb,n+1-j-nb,-unity,ap(jj+nbt),nb,b(j),1,unity,b(j+nb),1) + jj = jj + jd + jd = jd - nb2 + end do + jb = n - j + 1 + call dtpsv('U','T','N',jb,ap(jj),b(j),1) + +! Solve U*X=Y + call dtpsv('U','N','N',jb,ap(jj),b(j),1) + i = j - nb + do j = i, 1, -nb + jd = jd + nb2 + jj = jj - jd + call dgemv('N',nb,n+1-j-nb,-unity,ap(jj+nbt),nb,b(j+nb),1,unity,b(j),1) + call dtpsv('U','N','N',nb,ap(jj),b(j),1) + end do + end subroutine ma54_solve1_double + +subroutine ma54_solve2_double(n,nb,nrhs,ap,b,ldb,mb,buf,info) +! Solve unity or more sets of equations, given the Cholesky factorization +! of its matrix in blocked hybrid format. + integer, intent (in) :: n ! Specifies the matrix order + integer, intent (in) :: nb ! Block size for the blocked hybrid format. + real (wp), intent (in) :: ap(0:(n*(n+one))/2-1) ! Holds the matrix. + integer, intent (in) :: ldb ! The first dimension of the array b. + integer, intent (in) :: nrhs ! The number of right-hand sides. + real (wp), intent (inout) :: b(ldb,*) ! b(1:n,1:nrhs) holds the +! right-hand sides on entry and is overwritten by the solution. + integer, intent (in) :: mb ! Block size for the right-hand sides. + real (wp) :: buf(*) ! work array + integer, intent (out) :: info ! set to unity of these values: +! 0 Successful solution. +! < 0 Failure + + integer(long) :: bufb + integer :: i ! Row index + integer :: ib ! Number of columns in current block column of b + integer(long) :: ibp ! Current position in bufb + integer(long) :: ii ! Position in ap of diagonal entry + integer(long) :: ij ! Position in ap + integer :: j ! Column index + integer :: jb ! Number of columns in current block column of ap + integer(long) :: jbp ! Current position in bufb + integer(long) :: jbd ! nb*int(kb,long), increment for jbp + integer(long) :: jd ! size of current trapezoid / increment for jj + integer(long) :: jj ! Position in ap of start of current diagonal block + integer :: k ! First column of current block + integer :: kb ! ! Number of columns in current block column of b + integer(long) :: kk ! Position in buf of diagonal entry + integer(long) :: kks ! Current position in buf + integer(long) :: nb2 ! nb*int(nb,long) + integer(long) :: nbt ! Size of packed triangle of order nb + integer(long) :: nb1 ! Size of packed triangle of order nb-1 + intrinsic min + + info = 0 + if (n<0) info = -1 + if (nrhs<0) info = -4 + if (nb<1) info = -5 + if (ldb next triangle in ap + jd = jd - nb2 ! next delta for jj + kks = kks + nb2 ! -> next triangle of ap in buf + end do ! do j + +! Main loop over the block columns of b + kks = 1 ! is changed but restored to 1 + jd = n*int(nb,long) - nb1 ! is changed but restored to this value + jj = 0 ! is changed but restored to 0 + do k = 1, nrhs, mb + kb = min(nrhs-k+1,mb) + +! Copy kb RHS from b(1:n,k:k+kb-1) to buffer bufb + jbp = 1 ! -> to bufb + do i = 1, n, nb + ib = min(n-i+1,nb) + do j = k, k + kb - 1 + call dcopy(ib,b(i,j),1,buf(bufb+jbp),1) + jbp = jbp + ib + end do + end do + +! Solve U'*Y=B + jbd = nb*int(kb,long) ! delta for jbp + jbp = 1 ! is changed but restored to 1 + do j = 1, n - nb, nb + call dtrsm('L','U','T','N',nb,kb,unity,buf(kks),nb,buf(bufb+jbp),nb) + ibp = jbp + jbd ! -> starting block of B + ij = jj + nbt ! -> starting block of AP + do i = j + nb, n, nb + jb = min(n-i+1,nb) + call dgemm('T','N',jb,kb,nb,-unity,ap(ij),nb,buf(bufb+jbp),nb,unity, & + buf(bufb+ibp),jb) + ibp = ibp + jbd ! -> next block of B + ij = ij + nb2 ! -> next block of AP + end do ! do i + jj = jj + jd + jd = jd - nb2 + jbp = jbp + jbd ! -> next block of B + kks = kks + nb2 ! -> next triangle of ap + end do ! do j + jb = n - j + 1 + call dtrsm('L','U','T','N',jb,kb,unity,buf(kks),jb,buf(bufb+jbp),jb) + +! Solve U*X=Y + call dtrsm('L','U','N','N',jb,kb,unity,buf(kks),jb,buf(bufb+jbp),jb) + do j = j - nb, 1, -nb + jd = jd + nb2 + jj = jj - jd ! -> next triangle of AP + ij = jj + nbt ! -> starting block of AP + ibp = jbp ! -> starting update block of B + jbp = jbp - jbd ! -> current block of B + kks = kks - nb2 ! -> current triangle of ap + do i = j + nb, n, nb + jb = min(n-i+1,nb) + call dgemm('N','N',nb,kb,jb,-unity,ap(ij),nb,buf(bufb+ibp),jb,unity, & + buf(bufb+jbp),nb) + ibp = ibp + jbd ! -> next block of B + ij = ij + nb2 ! -> next block of AP + end do ! do i + call dtrsm('L','U','N','N',nb,kb,unity,buf(kks),nb,buf(bufb+jbp),nb) + end do ! do j + +! Copy solution to b(1:n,k:k+kb+1) + jbp = 1 ! -> to buf + do i = 1, n, nb + ib = min(n-i+1,nb) +! copy buf(is:is+ib+k-1) to B(i:i+ib-1,0:k-1); K <= NB + do j = k, k + kb - 1 + call dcopy(ib,buf(bufb+jbp),1,b(i,j),1) + jbp = jbp + ib + end do + end do + end do ! do k + + end subroutine ma54_solve2_double + + subroutine ma54_diag_double(n,p,nb,ap,diag) +! Extract the diagonal of a partial Cholesky factorization in blocked +! hybrid format. + integer, intent (in) :: n ! Specifies the matrix order + integer, intent (in) :: p ! Number of columns + integer, intent (in) :: nb ! Block size for the blocked hybrid format. + real (wp), intent (in) :: ap((n*(n+one))/2) ! Holds the matrix. + real (wp), intent (out) :: diag(p) ! Diagonal of factorization. + + integer js ! First column of current block column + integer j ! Column index within the block + integer(long) k ! Index within ap + integer l ! Length of rectangular part of the block column + + k = 0 + l = n-nb + do js = 1, p, nb + do j = 1, min(nb,p-js+1) + k = k + j + diag(js+j-1) = ap(k) + end do + k = k + l*int(nb,long) + l = l - nb + end do +end subroutine ma54_diag_double + + +subroutine dkcf(n,a,lda,info) +! Kernel subroutine for Cholesky factorization + integer, intent (in) :: n ! Specifies the matrix order. + integer, intent (in) :: lda ! Leading extent of array a. +! The inequality lda >= n must hold. +! For efficiency, the value n for lda is preferable. + real (wp), intent (inout) :: a(0:lda-1,0:n-1) ! The upper-triangular part, +! a(i,j), i<=j<=n, must be set to hold the upper-triangular part +! of the matrix and is overwritten by the Cholesky ma54_factor. +! For efficient execution, a(:,1:n) should fit into +! level-1 cache. + integer, intent (out) :: info ! set to unity of these values: +! 0 Successful solution. +! i>0. Pivot i is not positive. +! .. Locals .. + real (wp), parameter :: zero = 0.0_wp, unity = 1.0_wp + integer :: i ! Temporary variable + integer :: j ! Temporary variable + integer :: k ! Temporary variable + integer :: nr ! Temporary variable + real (wp) :: rd0 ! scalar to hold reciprocal of diagonal A(K,K) for 0<=K=2) then ! ma54_factor row J and update A(J+1,J+1) + t00 = a(j,j) + if (t00<=zero) go to 2 + t00 = sqrt(t00) + a(j,j) = t00 + rd0 = unity/t00 + ai0 = a(j,j+1) + ai0 = ai0*rd0 + a(j,j+1) = ai0 + t00 = a(j+1,j+1) + ai1 = ai0*ai0 + t00 = t00 - ai1 + a(j+1,j+1) = t00 + j = j + 1 + end if + if (nr>=1) then ! A(J,J) = SQRT( A(J,J) ) + t00 = a(j,j) + if (t00<=zero) go to 2 + t00 = sqrt(t00) + a(j,j) = t00 + end if + + return + +2 info = j + 1 + return +3 info = j + 2 + return +4 info = j + 3 + return +5 info = j + 4 + return +end subroutine dkcf + +end module hsl_ma54_double +! COPYRIGHT (c) 2007 Council for the Central Laboratory +! of the Research Councils +! +! Version 6.3.0 +! For version history see ChangeLog +! +! To change precision: +! Change dgemm, dcopy, dswap, dgemv, dtpsv, daxpy +! Change _double, kind(1.0d0) + +module hsl_ma64_double + + implicit none + EXTERNAL dgemm, dcopy, dswap, dgemv, dtpsv, daxpy + private + public ma64_factor, ma64_solveL1, ma64_solveD1, & + ma64_solveDLT1, ma64_solveLT1, & + ma64_solveL2, ma64_solveD2, ma64_solveDLT2, & + ma64_solveLT2, ma64_control, ma64_info + integer, parameter :: wp = kind(1.0d0) ! Precision parameter. + integer,parameter:: long = selected_int_kind(18) ! Long integer. + real (wp), parameter :: unity = 1.0_wp + + interface ma64_factor + module procedure ma64_factor_double + end interface + + interface ma64_solveL1 + module procedure ma64_solveL1_double + end interface + + interface ma64_solveD1 + module procedure ma64_solveD1_double + end interface + + interface ma64_solveDLT1 + module procedure ma64_solveDLT1_double + end interface + + interface ma64_solveLT1 + module procedure ma64_solveLT1_double + end interface + + interface ma64_solveL2 + module procedure ma64_solveL2_double + end interface + + interface ma64_solveD2 + module procedure ma64_solveD2_double + end interface + + interface ma64_solveDLT2 + module procedure ma64_solveDLT2_double + end interface + + interface ma64_solveLT2 + module procedure ma64_solveLT2_double + end interface + + type ma64_control + integer :: p_thresh=32 ! If p<=p_thresh, execute on a single thread. + real (wp) :: small=1e-20_wp ! Diagonal entries of D of modulus less +! than this are replaced by zero. + real (wp) :: static=0.0_wp ! If static>0 and p stable pivots are not found, +! the 1x1 pivot that is nearest to satisfying the test is +! chosen and info%num_nothresh is incremented by one. +! If its absolute value is less than cntl%static, it is +! replaced by the nearer of -static and static and +! info%num_perturbed is incremented by one. + logical :: twos=.false. ! If true, the signs of perm indicate recommended +! 2x2 pivots. + real (wp) :: u=0.1_wp ! Initial relative pivot tolerance. Values greater +! than 0.5 are treated as 0.5 and values less than zero are +! treated as zero. + real (wp) :: umin=1.0_wp ! Minimum relative pivot tolerance. Values greater +! than u are treated as u and values less than zero are +! treated as zero. If p stable pivots have not been not +! found and the candidate pivot with greatest relative +! pivot tolerance has tolerance v>=umin, this is accepted +! as a pivot and u is reset to v. If p=n> and both u and +! umin are greater than 0.5, umin is treated as having the +! value 0.5. +end type ma64_control + + type ma64_info + real (wp) :: detlog=0 ! log of the absolute value of the determinant +! of D or zero if the determinant is zero. + integer :: detsign=0 ! the sign of the determinant of D or zero +! if the determinant of D is zero. +! Not used in the complex symmetric case. + + integer :: flag=0 ! Zero after successful entry, negative after error. + integer :: num_neg=0 ! Number of negative eigenvalues of D. +! Not used in the complex symmetric case. + integer :: num_nothresh=0 ! the number diagonal entries of D that +! were chosen as 1x1 pivots without satisfying the +! relative pivot threshold. + integer :: num_perturbed=0 ! Number diagonal entries of D that +! were perturbed to cntl%static or -cntl%static. + integer :: num_zero=0 ! Number of zero eigenvalues of D. + integer :: num_2x2=0 ! Number of 2x2 blocks in D. + real (wp) :: usmall ! Set to -1 if num_perturbed > 0. Otherwise, +! if q = p, it holds the smallest relative pivot value of the +! chosen pivots, or +! if q < p and a positive value of cntl%umin would have led to a +! greater value of q, it holds the largest such value; +! otherwise, it holds zero. + real (wp) :: u=0 ! Set to the final value of the relative pivot +! threshold u. + end type ma64_info + + +contains + +subroutine ma64_factor_double & + (n,p,nb,nbi,a,la,cntl,q,ll,perm,d,buf,info,s,n_threads) +! Partial factorization of a symmetric indefinite matrix held in lower +! packed format to the form +! P A P' = ( L ) ( D ) (L' M') +! ( M I) ( S ) ( I ) +! where P is a permutation matrix that involves only the first p rows and +! columns, L is unit lower triangular of size q and D is block diagonal of +! order q with blocks of size 1 and 2. + +!$ use omp_lib + + integer, intent (in) :: n ! Specifies the matrix order + integer, intent (in) :: p ! Pivots to be chosen in rows and cols 1:p. + integer, intent (in) :: nb ! Block size + integer, intent (in) :: nbi ! Inner block size + integer(long), intent (in) :: la ! Size of a. la>= min (n*n,(n*(n+nb+1))/2). + real (wp), intent (inout) :: a(la) ! On entry, a(la+1-ln:la) holds the +! matrix in lower packed format, where ln=(n*(n+1))/2. On exit, +! a(1:ll) holds ( L ) as a sequence of block columns, each of which +! ( M ) +! consists of a triangular matrix packed by columns followed by a +! rectangular matrix packed by columns. There are nb columns in +! each block column except the last, which may have fewer. Also, +! a(la+1-ls:la) holds the matrix S in lower packed format, +! where ls=((n-q)*(n-q+1))/2. + type(ma64_control), intent (in) :: cntl ! Controls the actions. + integer, intent (out) :: q ! Order of D. + integer(long), intent (out) :: ll ! Size of (L M)' in block-column form, +! that is, (q*(n+n-q+1))/2. + integer, intent (inout) :: perm(p) ! The input value is ignored if +! cntl%twos is false; otherwise, each sequence +! perm(i)<0, perm(i+1)<0, ... perm(i+k)<0 must be of even length +! and flags recommended 2x2 pivots. +! On return, for i = 1, 2, ..., p, perm(i) is set to the index +! of the row of A that was permuted to row i. + real (wp), intent (out) :: d(2*p) ! d(1:2*q) is set to hold the inverse of +! D, except that zero diagonal blocks (pivots) are not inverted. +! Diagonal entries are in d(1:2*q-1:2) and entries below +! the diagonal are in d(2:2*q-2:2). d(2*q) is set to zero. + real (wp) :: buf(nb*n+n) ! Work array for the current part of -LD. + type(ma64_info), intent (inout) :: info + integer, intent (in), optional :: s ! Columns 1:s should be searched last for +! pivots. + integer, intent (inout), optional, target :: n_threads ! Controls the number +! of threads used in OpenMP parallel regions. Its value may be +! changed by another thread during the execution of this +! subroutine. +! 0 Execute on omp_get_num_threads() threads. +! >1 Execute on n_threads threads. +! Absence is treated as equivalent to presence with the value 0. + +! .. Local Scalars .. + real (wp) amax ! Entry of largest absolute value to left of diagonal in +! row m. + real (wp) amax2 ! Second largest absolute value to left of diagonal in row m + real (wp) amaxb ! Largest absolute value below diagonal in column m + real (wp) amaxt ! Largest absolute value in column t. + integer deti ! Determinant held as detr*radix**deti + real (wp) detpiv ! Determinant of candidate pivot is detpiv/detscale. + real (wp) detpiv0 ! First term in calculation of detpiv. + real (wp) detpiv1 ! Second term in calculation of detpiv. + real (wp) detpiv2 ! Value of detpiv for best candidate 2x2 pivot. + real (wp) detr ! Scaled determinant + real (wp) detscale ! Inverse of the largest entry in the candidate pivot. + real (wp) detscale2 ! Value of detscale for best candidate 2x2 pivot. + integer i ! Row index + integer i1 ! First row of block + integer j ! Column index + integer j1 ! First column of block + integer j2 ! Last column of block + integer js ! Last column available for swapping + integer(long) k ! Position in a + integer(long) kdiag ! Position in a of diagonal np+1 + integer(long) kkj ! Position of diagonal of column j + integer(long) kkt ! Position of diagonal of column t + integer(long) kkr1 ! Position of diagonal of column r+1 + integer(long) kkq ! Start of the pivotal block column + integer(long) kkq1 ! Position of diagonal of column q+1 + integer(long) kkm ! Position of diagonal of column m + integer(long) kkn ! Position of diagonal of column np + integer(long) kkmb ! Position of diagonal of column mbest + integer(long) kkm1 ! Position of diagonal of column m-1 + integer(long) kq1 ! Position in buf of diagonal of column q+1 + integer lj ! Height of block containing column j + integer lm ! Height of block containing column m + integer lq ! Height of the pivot block + integer m ! Column searched most recently + integer m1 ! First column of the block in which m appears + integer mbest ! Column with best relative pivot value for a 1x1 pivot + integer mbest1, mbest2 ! Pair with best relative pivot value for a 2x2 pivot + integer mdummy ! Loop execution count + integer mlast ! Last column of the block in which m appears + integer np ! Columns 1 to np are rearranged to block column form. +! np = p or np = n. + integer nt ! Number of threads + integer pivsiz ! Size of the chosen pivot, 0 if none chosen, or -1 +! if column is essentially zero + integer q1 ! First column of the block containing column q+1 + integer q2 ! Last column of the inner block containing column q+1 + integer r ! Number of pivot operations applied to columns q+1:p + integer rm ! Number of pivot operations applied to the (outer) block + ! containing column m + real (wp) rmax ! Largest entry in column m + real (wp) rmax1 ! Largest entry in column m-1 outwith rows m,m-1 if (m,m-1) + ! is a recommended 2x2 pivot. Otherwise, -1. + real (wp) rmax2 ! Largest entry in column m outwith rows m,m-1. + integer t ! Candidate 2x2 pivot is in columns t and m + real (wp) ubest1 ! Relative pivot value of best candidate 1x1 pivot + real (wp) ubest2 ! Relative pivot value of best candidate 2x2 pivot + real (wp) urel ! Relative pivot value + real (wp) urel1 ! Relative pivot value in column m-1 if (m,m-1) is a +! recommended 2x2 pivot. + real (wp) u ! Relative pivot threshold + real (wp) umin ! Minimum relative pivot threshold + + info%flag = 0 + if (n < 0) then + info%flag = -1 + else if (p < 0) then + info%flag = -2 + else if (p > n) then + info%flag = -3 + else if (nbi <= 1) then + info%flag = -4 + else if ( la < min(n*int(n,long),(n*(n+nb+1_long))/2) ) then + info%flag = -7 + else if (cntl%static < cntl%small .and. cntl%static/=0.0_wp) then + info%flag = -10 + else if (mod(nb,nbi) /= 0) then + info%flag = -12 + end if + info%detlog = 0.0_wp + info%num_neg = 0 + info%num_nothresh = 0 + info%num_perturbed = 0 + info%num_zero = 0 + info%num_2x2 = 0 + u = min(max(cntl%u,0.0_wp),0.5_wp) + info%u = u + umin = min(max(cntl%umin,0.0_wp),u) + if (p==n) umin = min(umin,0.5_wp) + info%usmall = 1.0_wp + q = 0 + if (info%flag/=0 .or. p==0) return + deti = 0 + detr = 1.0_wp + nt = 1 +!$ if (p>cntl%p_thresh) nt = omp_get_max_threads() + np = n + if( nt==1 .and. p<=nb ) np = p + lq = n + kkq1 = 1 + kkq = 1 + m = p +! m is updated at the start of the main loop so initializing it to p causes +! it to have the value 1 during the first execution of that loop. + js = p + q1 = 1 + q2 = min(nbi,p) + rmax1 = -1.0_wp + +! For j = 1,p: set perm(j) = -j for the first part of a 2x2 pivot; otherwise, +! set perm(j) = j + if (cntl%twos) then + js = 0 + do j = 1, p + if (perm(j) >= 0) then + perm(j) = j + else +! First part of a 2x2 pivot + perm(j) = -j + if (j==p) then + info%flag = -11 + return + else if (perm(j+1) >= 0) then + info%flag = -11 + return + else + perm(j+1) = j+1 + end if + end if + end do + else + do j = 1, p + perm(j) = j + end do + end if + +! Rearrange first np columns to block column form + call to_block + + if (present(s)) then + if (s>0 .and. sp) then +! Go back to column q+1 + m = q+1 + m1 = q1 + kkm = kkq1 + lm = lq + r = q + rm = q + else if (mnbi) then + if (js-m > m-q) then + mlast = min(p,m1+nb-1) +! Inner update: of columns (m:mlast) for pivots rm+1:q (BLAS3) + if (m<=mlast .and. rmrm) then + call dgemv('NoTrans',n-m+1,q-rm,unity,a(k),lq, & + buf(n*(rm+1_long-q1)+m),n,unity,a(kkm),1) + end if + + +! Find largest and second largest entry to left of diagonal in row m. + j = q + 1 + lj = lq + k = kkq1 + m - j - lj + amax = 0.0_wp + amax2 = 0.0_wp + t = 0 + if (jabs(amax)) then + t = j + amax2 = abs(amax) + amax = a(k) + kkt = k - (m-j) + else + amax2 = max(abs(a(k)),amax2) + end if + end do + lj = lj - nb + end do + +! Now calculate largest entry below the diagonal of column m. + amaxb = 0.0_wp + do i = m+1,n + amaxb = max(abs(a(kkm+i-m)),amaxb) + end do + +! Now calculate largest entry in the whole of column m and make sure that is +! is neither small nor infinity. + rmax = max(abs(amax),abs(a(kkm)),amaxb) + if (rmax<=cntl%small) then +! All entries of the column are small + a(kkm) = 0.0_wp + info%num_zero = info%num_zero + 1 + pivsiz = -1 + perm(m) = abs(perm(m)) + rmax1 = -1.0_wp + exit sweep + else if (rmax > huge(1.0_wp)) then +! There is an infinity in the column + info%flag = -13 + return + end if + +! Calculate the relative pivot value and see if it is the best so far + if (abs(a(kkm))>cntl%small) then + urel = abs(a(kkm))/rmax + else + urel = 0.0_wp + end if + if (urel >= ubest1) then + ubest1 = urel + mbest = m + kkmb = kkm + end if + +! If (m,m+1) recommended as 2x2 pivot store needed data and cycle so that +! column m+1 is updated + if (perm(m)<0) then + rmax1 = abs(amax) + do i = m+2,n + rmax1 = max(abs(a(kkm+i-m)),rmax1) + end do + urel1 = urel + kkm1 = kkm + perm(m) = abs(perm(m)) + cycle sweep + end if + +! If (m-1,m) recommended as 2x2 pivot, look for pivot in columns m-1,m + lookm1m: if (rmax1>=0.0_wp) then + +! Find largest entry in column m outwith rows m-1 and m + rmax2 = amaxb + j = q + 1 + lj = lq + k = kkq1 + m - j - lj + do j1 = q1,m-2,nb + do j = j, min(j1+nb-1,m-2) + k = k + lj + rmax2 = max(abs(a(k)),rmax2) + end do + lj = lj - nb + end do + k = kkm1 + 1 + +! If both diagonal entries >= cntl%small or the off-diagonal entry +! >= cntl%small, consider 2x2 pivot + test2x2: if ( min(abs(a(kkm)),abs(a(kkm1))).ge.cntl%small .or. & + abs(a(k)).ge.cntl%small ) then + detscale = 1.0_wp/max( abs(a(kkm)), abs(a(kkm1)), abs(a(k)) ) + detpiv1 = (abs(a(k))*detscale)*abs(a(k)) + detpiv0 = (a(kkm)*detscale)*a(kkm1) + detpiv = detpiv0 - detpiv1 +! Make sure that the 2x2 pivot is not singular and that there is little +! cancellation in calculating detpiv. Bearing in mind the way detscale +! is calculated, if the largest entry of the matrix is chosen as pivot, +! the one entry of the reduced matrix has absolute value abs(detpiv). + if (abs(detpiv)> & + max(cntl%small,abs(detpiv0)/2,abs(detpiv1)/2)) then +! OK as 2x2 pivot if all entries in the rest of the columns are small + if(max(rmax2,rmax1)<=cntl%small) then + pivsiz = 2 + rmax1 = -1.0_wp + t = m-1 + exit sweep + end if + +! Calculate the relative pivot value (as 2x2 pivot) + urel = abs(detpiv)/max( & + abs(a(kkm)*detscale)*rmax1+abs(a(k)*detscale)*rmax2, & + abs(a(kkm1)*detscale)*rmax2+abs(a(k)*detscale)*(rmax1) ) + rmax1 = -1.0_wp + +! OK as 2x2 pivot if relative pivot value is big enough + if (urel>u) then + pivsiz = 2 + t = m-1 + info%usmall = min(urel,info%usmall) + exit sweep + end if + +! If this has the best relative pivot value so far, record this + if(urel>ubest2)then + ubest2 = urel + detpiv2 = detpiv + detscale2 = detscale + mbest1 = m + mbest2 = m-1 + end if + + end if + + end if test2x2 + +! If m-1 OK as 1x1 pivot, accept this + rmax1 = -1.0_wp + if (urel1>u) then + if (abs(a(kkm1))>cntl%small) then + pivsiz = 1 + info%usmall = min(urel1,info%usmall) + call swap_cols(m-1,m) + exit sweep + end if + end if + + end if lookm1m + +! If there is a candidate 2x2 pivot, try it. +! Look for a 1x1 pivot only if the 2x2 pivot is unacceptable. + tgt0: if (t>0) then + if ( min(abs(a(kkm)),abs(a(kkt))).ge.cntl%small .or. & + abs(amax).ge.cntl%small ) then +! Store value of the largest entry in whole of column m outwith rows m and t + rmax2 = max(amax2,amaxb) + +! Find largest entry in column t outwith rows m and t + amaxt = 0.0_wp + j = q + 1 + lj = lq + k = kkq1 + t - j - lj + do j1 = q1,t-1,nb + do j = j, min(j1+nb-1,t-1) + k = k + lj + amaxt = max(abs(a(k)),amaxt) + end do + lj = lj - nb + end do + if (j1/=t) lj = lj + nb + k = k + lj + do i = t+1,m-1 + amaxt = max(abs(a(k+i-t)),amaxt) + end do + do i = m+1,n + amaxt = max(abs(a(k+i-t)),amaxt) + end do + + detscale = 1.0_wp/max( abs(a(kkm)), abs(a(kkt)), abs(amax) ) + detpiv1 = (amax*detscale)*amax + detpiv0 = a(kkm)*detscale*a(kkt) + detpiv = detpiv0 - detpiv1 +! Make sure that the 2x2 pivot is not singular and that there is little +! cancellation in calculating detpiv. Bearing in mind the way detscale +! is calculated, if the largest entry of the matrix is chosen as pivot, +! the one entry of the reduced matrix has absolute value abs(detpiv). + left2x2:if (abs(detpiv)> & + max(cntl%small,abs(detpiv0)/2,abs(detpiv1)/2)) then + +! OK as 2x2 pivot if all entries in the rest of the columns are small + if(max(rmax2,amaxt)<=cntl%small) then + pivsiz = 2 + exit sweep + end if + +! Calculate the relative pivot value (as 2x2 pivot) + urel = abs(detpiv)/max( & + abs(a(kkm)*detscale)*amaxt+(abs(amax)*detscale)*rmax2, & + abs(a(kkt)*detscale)*rmax2+(abs(amax)*detscale)*amaxt ) + +! OK as 2x2 pivot if relative pivot value is big enough + if (urel>u) then + pivsiz = 2 + info%usmall = min(urel,info%usmall) + exit sweep + end if + +! If this has the best relative pivot value so far, record this + if(urel>ubest2)then + ubest2 = urel + detpiv2 = detpiv + detscale2 = detscale + mbest1 = m + mbest2 = t + end if + end if left2x2 + end if + end if tgt0 + +! If 2x2 pivot rejected or only one column left, take best 1x1 pivot if is OK. + if (t>0 .or. m==p) then + if (ubest1>u) then + pivsiz = 1 + info%usmall = min(ubest1,info%usmall) + if (mbest/=m) call swap_cols(mbest,m) + exit sweep + end if + end if + + end do sweep + +! No pivot found in search of all available columns + pivsiz0: if (pivsiz==0) then +! Since all the columns have been updated, revise m to q+1 + m = q+1 + kkm = kkq1 + m1 = q1 + lm = lq + rm = q + r = q +! Perform relaxed pivoting if the best pivot is good enough + if (max(ubest1,ubest2)>=umin) then + if (ubest1>=ubest2) then +! Accept 1x1 pivot + u = min(u,ubest1) + info%usmall = min(ubest1,info%usmall) + pivsiz = 1 + if (mbest/=m) call swap_cols(m,mbest) + else +! Accept 2x2 pivot + u = min(u,ubest2) + info%usmall = min(ubest2,info%usmall) + pivsiz = 2 +! Revise m to q+1 + m = q+2 + kkm = kkq1+lq+1 + if (m==m1+nb) then + m1 = m1+nb + lm = lm - nb + end if + detpiv = detpiv2 + detscale = detscale2 + t = min(mbest1,mbest2) + if (t/=q+1) call swap_cols(q+1,t) + t = max(mbest1,mbest2) + if (t/=q+2) call swap_cols(q+2,t) + t = q+1 + end if + +! Perform static pivoting if this has been requested + else if (cntl%static>0) then + if (mbest/=m) call swap_cols(m,mbest) + pivsiz = 1 + info%num_nothresh = info%num_nothresh + 1 + if (abs(a(kkm)) < cntl%static) then + a(kkm) = sign(cntl%static,real(a(kkm),wp)) + info%num_perturbed = info%num_perturbed + 1 + info%usmall = -1 + else + info%usmall = min(ubest1,info%usmall) + end if + end if + end if pivsiz0 + + pivsizes: if (pivsiz==1) then +! Swap columns if m not q+1 + if (q+1/=m) call swap_cols(q+1,m) +! We store D**-1. + d(2*q+1) = 1.0_wp/a(kkq1) + d(2*q+2) = 0.0_wp +! Update info +! info%detlog = info%detlog + log(abs(a(kkq1))) + deti = deti + exponent(detr) + exponent(abs(a(kkq1))) + detr = fraction(detr)*fraction(abs(a(kkq1))) + if (a(kkq1)<0.0_wp) info%num_neg = info%num_neg + 1 +! Store L in A and -LD or -conjg(LD) in buf + kq1 = q+1+(q+1_long-q1)*n + buf(kq1) = -a(kkq1) + a(kkq1) = 1.0_wp + do i = 1, n-q-1 + buf(kq1+i) = -a(kkq1+i) + a(kkq1+i) = d(2*q+1)*a(kkq1+i) + end do + j1 = q1 + lj = lq +! Update columns q+2 to m + j = q+2 + kkj = kkq1 + do j1 = j1,m,nb + do j = j, min(j1+nb-1,m) + kkj = kkj + lj + 1 + call daxpy(n-j+1,buf(kq1+j-q-1),a(kkq1+j-q-1),1,a(kkj),1) + end do + lj = lj - nb + end do +! Update q and kkq1 + kkq1 = kkq1 + lq + 1 + if(q+2==q1+nb)kkq1 = kkq1 - nb + q = q+1 + + else if (pivsiz==2) then pivsizes +! Swap columns unless t==q+1 and m==q+2 + if (q+2/=m) then + if (q+1/=t) call swap_cols(q+1,t) + call swap_cols(q+2,m) + end if +! We store D**-1 + k = kkq1 + lq + 1 + if(q+2==q1+nb)k = k - nb + d(2*q+1) = (a(k)*detscale)/detpiv + d(2*q+3) = (a(kkq1)*detscale)/detpiv + d(2*q+2) = -(a(kkq1+1)*detscale)/detpiv + d(2*q+4) = 0.0_wp + +! Update info + info%num_2x2 = info%num_2x2 + 1 +! info%detlog = info%detlog + log(abs(detpiv)) - log(detscale) + deti = deti + exponent(detr) - exponent(detscale) + detr = fraction(detr)*abs(detpiv)/fraction(detscale) + if (detpiv<0.0_wp) then + info%num_neg = info%num_neg + 1 + else if (a(kkq1)+a(k)<0.0_wp) then + info%num_neg = info%num_neg + 2 + end if +! Store L in A and -LD or -conjg(LD) in buf + kq1 = q+1+(q+1_long-q1)*n + buf(kq1) = -a(kkq1) + buf(kq1+1) = -a(kkq1+1) + buf(kq1+n) = -a(kkq1+1) + buf(kq1+n+1) = -a(k) + a(kkq1) = 1.0_wp + a(k) = 1.0_wp + a(kkq1+1) = 0.0_wp + do i = 2, n-q-1 + buf(kq1+i ) = -a(kkq1+i) + buf(kq1+i+n) = -a(k+i-1) + a(kkq1+i) = d(2*q+1)*a(kkq1+i) + d(2*q+2)*a(k+i-1) + a(k+i-1) = d(2*q+3)*a(k+i-1) - d(2*q+2)*buf(kq1+i) + end do +! Update columns q+3 to m + j1 = q1 + lj = lq + if(q+3>=q1+nb) then +! Pivot is at end of block + lj = lq - nb + j1 = q1 + nb + end if + kkj = k + lj + 1 + do j1 = j1,m,nb + j = max(q+3,j1) + j2 = min(j1+nb-1,m) + if(j2>=j) then + call dgemm('n','t',n-j+1,j2-j+1,2,unity, & + a(kkq1+j-q-1),n-((q+1)/nb)*nb,buf(kq1+j-q-1),n, & + unity,a(kkj),lj) + end if + kkj = kkj + (lj+1_long)*(j2-j+1) - nb + lj = lj - nb + end do +! Update q and kkq1 + kkq1 = k + lq + 1 + if (q+3>=q1+nb) kkq1 = kkq1 - nb ! Pivot is at end of block + q = q + 2 + + else if (pivsiz==-1) then pivsizes +! Handle a row that is zero + if (q+1/=m) call swap_cols(q+1,m) + d(2*q+1) = 0.0_wp + d(2*q+2) = 0.0_wp +! Store L in A and -LD in buf + kq1 = q+1+(q+1_long-q1)*n + buf(kq1) = 0.0_wp + a(kkq1) = 1.0_wp + do i = 1, n-q-1 + buf(kq1+i) = 0.0_wp + a(kkq1+i) = 0.0_wp + end do + kkq1 = kkq1 + lq + 1 + if(q+2==q1+nb)kkq1 = kkq1 - nb + q = q+1 + end if pivsizes + + j = m1+nb + if (q>=q2) then +! Inner block is complete +! See if the inner update can be done with the outer update + if( q>=q1+nb-1 .and. r==rm ) then + j = m+1 + else +! Update columns (m+1:min(p,m1+nb-1)) for pivots rm+1:q2 (BLAS3) + mlast = min(p,m1+nb-1) + if (m=q1+nb-1) then +! Outer block is complete +! Update columns (j:p) for pivots r+1:q1+nb-1 (BLAS3) + if (j<=p) call update (j,p,r+1,q1+nb-1) + r = q1+nb-1 + rm = r + + if (p=q1 .and. p1 .and. p>cntl%p_thresh .and. np==n) then +!$ nt = omp_get_max_threads() + if( nt>1 ) then + if ( present(n_threads) ) then + if( n_threads>0 ) nt = n_threads + end if + end if + end if + + if(nt==1) then ! No parallelization + do j1 = j0+1, jr, nb + j = max(jl,j1) + j2 = min(j1+nb-1,jr) + if(n.ge.j .and. j2.ge.j) then + kkj = j1-1 + kkj = 1 + ((kkj)*(n+n-kkj+nb))/2 + if(j.ne.j1) kkj = kkj + (j-j1)*(n-j0+1) + call dgemm & + ('n','t',n-j+1,j2-j+1,pr-pl+1,unity, & + a(kkq+j-q1+lq*(pl-p0)),lq,buf(j+n*(pl-p0)), & + n,unity,a(kkj),n-j1+1) + endif + end do + + else ! Parallelize by blocks +!$ if (nt>0) call omp_set_num_threads(nt) +!$OMP PARALLEL DO & +!$OMP DEFAULT(SHARED) PRIVATE(I, J, I1, J1, I2, J2, KKJ) & +!$OMP SCHEDULE(STATIC) + do ij = 1, nn +! Find the block indices + j = int( nr + 1.4999d0 - sqrt( (nr+0.5d0)**2 -ij*2 ) ) + i = ij - ((j-1)*(nr+nr-j))/2 +! Find the leading and trailing row and column + i1 = j0+1+(i-1)*nb + j1 = j0+1+(j-1)*nb + i2 = min(i1+nb-1,n) + j2 = min(j1+nb-1,jr) +! Find the first row and column to be updated + j = max(jl,j1) + i = max(jl,i1) +! Find position of diagonal of column j + kkj = j1-1 + kkj = 1 + ((kkj)*(n+n-kkj+nb))/2 + if(j/=j1) kkj = kkj + (j-j1)*(n-j0+1) + call dgemm & + ('n','t',i2-i+1,j2-j+1,pr-pl+1,unity,a(kkq+i-q1+lq*(pl-p0)) & + ,lq,buf(j+n*(pl-p0)),n,unity,a(kkj+i-j),n-j1+1) + end do +!OMP END PARALLEL DO + end if + end subroutine update + + subroutine update2(pr) +! Update columns p+1:n for pivots q1:pr within the current block column +! when np0) call dswap(l,a(k1),lb,a(k2),lb) + k1 = k1 + l*int(lb,long) - jb + k2 = k2 + l*int(lb,long) - jb + lb = lb - nb + end do + + j = j - nb + lb = lb + nb + d1 = k1 + jb + k1 = d1 + 1 + k2 = k2 + lb + jb + +! Swap columns with rows + jb = min(nb,j2-j1-1) + do j = j, j2, nb + l = min(jb,j+nb-1-j1,j2-j) + if (l>0) call dswap(l,a(k1),1,a(k2),lb) + k1 = k1 + l + k2 = k2 + l*int(lb,long) - nb + lb = lb - nb + end do + + j = j - nb + lb = lb + nb + d2 = k2 + nb + k2 = d2 + 1 + k1 = k1 + 1 + +! Swap the diagonals + temp = a(d1) + a(d1) = a(d2) + a(d2) = temp + +! Swap columns + if (n>j2) call dswap(n-j2,a(k1),1,a(k2),1) + + end subroutine swap_cols +end subroutine ma64_factor_double + + + + subroutine ma64_solveL1_double(n,q,nb,b,flag,a,ll) +! Solves ( L ) x = b +! ( M I) +! where L is unit lower triangular of size q. + + integer, intent (in) :: n ! Matrix order + integer, intent (in) :: q ! Order of L (and D) + integer, intent (in) :: nb ! The block size used for the blocked hybrid +! format. + real (wp), intent (inout) :: b(n) ! b(n) holds the right-hand +! sides on entry and is overwritten by the solution. + integer, intent (out) :: flag + integer(long), intent (in) :: ll ! Size of a + real (wp), intent (in) :: a( ll ) +! Holds ( L ) packed by columns. +! ( M ) + +! .. Locals .. + integer j ! Column index + integer jb ! Width of block + integer(long) k ! Position in array + integer lj ! Length of block + + flag = 0 + if (n < 0) then + flag = -1 + else if (nb <= 1) then + flag = -4 + else if (q < 0) then + flag = -8 + else if (q > n) then + flag = -9 + end if + if (flag/=0 .or. q==0) return + k = 1 + lj = n + do j = 1, q, nb + jb = min(nb,q-j+1) + call dtpsv('L','N','U',jb,a(k),b(j),1) + k = k + (jb*(jb+1_long))/2 + lj = lj - jb + if (lj>0) call dgemv('N',lj,jb,-unity,a(k),lj,b(j),1,unity,b(j+jb),1) + k = k + jb*lj + end do + + end subroutine ma64_solveL1_double + + subroutine ma64_solveD1_double(n,q,b,flag,d) +! Solves ( D ) x = b +! ( I ) +! where D is block diagonal of size q with blocks of size 1 and 2. + + integer, intent (in) :: n ! Matrix order + integer, intent (in) :: q ! Order of L (and D) + real (wp), intent (inout) :: b(n) ! b(n) holds the right-hand +! sides on entry and is overwritten by the solution. + integer, intent (out) :: flag + real (wp), intent (in) :: d(2*q) ! Holds the inverse of D, +! except that zero diagonal blocks (pivots) are not inverted. +! Diagonal entries are in d(1:2*q-1:2) and entries below +! the diagonal are in d(2:2*q-2:2). + +! .. Locals .. + integer j ! Column index + real (wp) temp + + flag = 0 + if (n < 0) then + flag = -1 + else if (q < 0) then + flag = -8 + else if (q > n) then + flag = -9 + end if + if (flag/=0 .or. q==0) return + +! Apply operations associated with D + j = 1 + do + if (j>q) exit + if (d(2*j)==0.0_wp) then +! 1x1 pivot + b(j) = b(j)*d(2*j-1) + j = j + 1 + else +! 2x2 pivot + temp = b(j)*d(2*j-1) + b(j+1)*d(2*j) + b(j+1) = b(j)*d(2*j) + b(j+1)*d(2*j+1) + b(j) = temp + j = j + 2 + end if + end do + + end subroutine ma64_solveD1_double + + subroutine ma64_solveLT1_double(n,q,nb,b,flag,a,ll) +! Solves ( L' M') x = b +! ( I ) +! where L is unit lower triangular of size q. + + integer, intent (in) :: n ! Matrix order + integer, intent (in) :: q ! Order of L (and D) + integer, intent (in) :: nb ! The block size used for the blocked hybrid +! format. + real (wp), intent (inout) :: b(n) ! b(n) holds the right-hand +! sides on entry and is overwritten by the solution. + integer, intent (out) :: flag + integer(long), intent (in) :: ll ! Size of a + real (wp), intent (in) :: a( ll ) +! Holds ( L ) packed by columns. +! ( M ) + +! .. Locals .. + integer j ! Column index + integer jb ! Width of block + integer j1 ! First column of block + integer(long) k ! Position in array + integer lj ! Length of block + integer m ! + + flag = 0 +! Back substitution + flag = 0 + if (n < 0) then + flag = -1 + else if (nb <= 1) then + flag = -4 + else if (q < 0) then + flag = -8 + else if (q > n) then + flag = -9 + end if + if (flag/=0 .or. q==0) return + m = nb*((q-1)/nb) + k = 1 + ll + j1 = 1 + m + lj = n - q + do j = j1, 1, -nb + jb = min(nb,q-j+1) + k = k - lj*jb + if (lj>0) call dgemv('T',lj,jb,-unity,a(k),lj,b(j+jb),1,unity,b(j),1) + k = k - (jb*(jb+1_long))/2 + call dtpsv('L','T','U',jb,a(k),b(j),1) + lj = lj + jb + end do + + end subroutine ma64_solveLT1_double + + subroutine ma64_solveDLT1_double(n,q,nb,b,flag,a,ll,d) +! Solves ( D ) ( L' M') x = b +! ( I ) ( I ) +! where D is block diagonal of size q with blocks of size 1 and 2 +! and L is unit lower triangular of size q. + + integer, intent (in) :: n ! Matrix order + integer, intent (in) :: q ! Order of L (and D) + integer, intent (in) :: nb ! The block size used for the blocked hybrid +! format. + real (wp), intent (inout) :: b(n) ! b(n) holds the right-hand +! sides on entry and is overwritten by the solution. + integer, intent (out) :: flag + integer(long), intent (in) :: ll ! Size of a + real (wp), intent (in) :: a( ll ) +! Holds ( L ) packed by columns. +! ( M ) + real (wp), intent (in) :: d(2*q) ! Holds the inverse of D, +! except that zero diagonal blocks (pivots) are not inverted. +! Diagonal entries are in d(1:2*q-1:2) and entries below +! the diagonal are in d(2:2*q-2:2). + + if (nb <= 1) then + flag = -4 + return + end if + call ma64_solveD1_double(n,q,b,flag,d) + call ma64_solveLT1_double(n,q,nb,b,flag,a,ll) + + end subroutine ma64_solveDLT1_double + + subroutine ma64_solveL2_double(n,q,nb,nrhs,b,ldb,flag,a,ll) +! Solves ( L ) x = b +! ( M I) +! where L is unit lower triangular of size q. + + integer, intent (in) :: n ! Matrix order + integer, intent (in) :: q ! Order of L (and D) + integer, intent (in) :: nb ! The block size used for the blocked hybrid +! format. + integer, intent (in) :: nrhs ! Number of right-hand sides + integer, intent (in) :: ldb ! Leading extent of b + real (wp), intent (inout) :: b(ldb,nrhs) ! Holds the right-hand +! sides on entry and is overwritten by the solution. + integer, intent (out) :: flag + integer(long), intent (in) :: ll ! Size of a + real (wp), intent (in) :: a( ll ) +! Holds ( L ) packed by columns. +! ( M ) + +! .. Locals .. + integer j ! Column index + integer jb ! Width of block + integer(long) k ! Position in array + integer lj ! Length of block + integer r ! Index for rhs + + flag = 0 + if (n < 0) then + flag = -1 + else if (nb <= 1) then + flag = -4 + else if (nrhs < 0) then + flag = -5 + else if (ldb < n) then + flag = -6 + else if (q < 0) then + flag = -8 + else if (q > n) then + flag = -9 + end if + if (flag/=0 .or. q==0) return + + k = 1 + lj = n + do j = 1, q, nb + jb = min(nb,q-j+1) + do r = 1,nrhs + call dtpsv('L','N','U',jb,a(k),b(j,r),1) + end do + k = k + (jb*(jb+1_long))/2 + lj = lj - jb + if (lj>0) call dgemm & + ('N','N',lj,nrhs,jb,-unity,a(k),lj,b(j,1),ldb,unity,b(j+jb,1),ldb) + k = k + jb*int(lj,long) + end do + + end subroutine ma64_solveL2_double + + subroutine ma64_solveD2_double(n,q,nrhs,b,ldb,flag,d) +! Solves ( D ) x = b +! ( I ) +! where D is block diagonal of size q with blocks of size 1 and 2. + + integer, intent (in) :: n ! Matrix order + integer, intent (in) :: q ! Order of L (and D) + integer, intent (in) :: nrhs ! Number of right-hand sides + integer, intent (in) :: ldb ! Leading extent of b + real (wp), intent (inout) :: b(ldb,nrhs) ! Holds the right-hand +! sides on entry and is overwritten by the solution. + integer, intent (out) :: flag + real (wp), intent (in) :: d(2*q) ! Holds the inverse of D, +! except that zero diagonal blocks (pivots) are not inverted. +! Diagonal entries are in d(1:2*q-1:2) and entries below +! the diagonal are in d(2:2*q-2:2). + +! .. Locals .. + integer j ! Column index + + flag = 0 + if (n < 0) then + flag = -1 + else if (nrhs < 0) then + flag = -5 + else if (ldb < n) then + flag = -6 + else if (q < 0) then + flag = -8 + else if (q > n) then + flag = -9 + end if + if (flag/=0 .or. q==0) return + + do j = 1, nrhs + call ma64_solveD1_double(n,q,b(1,j),flag,d) + end do + + end subroutine ma64_solveD2_double + + subroutine ma64_solveLT2_double(n,q,nb,nrhs,b,ldb,flag,a,ll) +! Solves ( L' M') x = b +! ( I ) +! where L is unit lower triangular of size q. + + integer, intent (in) :: n ! Matrix order + integer, intent (in) :: q ! Order of L (and D) + integer, intent (in) :: nb ! The block size used for the blocked hybrid +! format. + integer, intent (in) :: nrhs ! Number of right-hand sides + integer, intent (in) :: ldb ! Leading extent of b + real (wp), intent (inout) :: b(ldb,nrhs) ! Holds the right-hand +! sides on entry and is overwritten by the solution. + integer, intent (out) :: flag + integer(long), intent (in) :: ll ! Size of a + real (wp), intent (in) :: a( ll ) +! Holds ( L ) packed by columns. +! ( M ) + +! .. Locals .. + integer j ! Column index + integer jb ! Width of block + integer j1 ! First column of block + integer(long) k ! Position in array + integer lj ! Length of block + integer m ! + integer r ! Index for rhs + + flag = 0 + if (n < 0) then + flag = -1 + else if (nb <= 1) then + flag = -4 + else if (nrhs < 0) then + flag = -5 + else if (ldb < n) then + flag = -6 + else if (q < 0) then + flag = -8 + else if (q > n) then + flag = -9 + end if + if (flag/=0 .or. q<1) return + +! Back substitution + m = nb*((q-1)/nb) + k = 1 + ll + j1 = 1 + m + lj = n - q + do j = j1, 1, -nb + jb = min(nb,q-j+1) + k = k - jb*int(lj,long) + if (lj>0) call dgemm & + ('T','N',jb,nrhs,lj,-unity,a(k),lj,b(j+jb,1),ldb,unity,b(j,1),ldb) + k = k - (jb*(jb+1_long))/2 + do r = 1, nrhs + call dtpsv('L','T','U',jb,a(k),b(j,r),1) + end do + lj = lj + jb + end do + + end subroutine ma64_solveLT2_double + + subroutine ma64_solveDLT2_double(n,q,nb,nrhs,b,ldb,flag,a,ll,d) +! Solves ( D ) ( L' M') X = B +! ( I ) ( I ) +! where D is block diagonal of size q with blocks of size 1 and 2 +! and L is unit lower triangular of size q. + + integer, intent (in) :: n ! Matrix order + integer, intent (in) :: q ! Order of L (and D) + integer, intent (in) :: nb ! The block size used for the blocked hybrid +! format. + integer, intent (in) :: nrhs ! Number of right-hand sides + integer, intent (in) :: ldb ! Leading extent of B + real (wp), intent (inout) :: b(ldb,nrhs) ! Holds the right-hand +! sides on entry and is overwritten by the solution. + integer, intent (out) :: flag + integer(long), intent (in) :: ll ! Size of a + real (wp), intent (in) :: a( ll ) +! Holds ( L ) packed by columns. +! ( M ) + real (wp), intent (in) :: d(2*q) ! Holds the inverse of D, +! except that zero diagonal blocks (pivots) are not inverted. +! Diagonal entries are in d(1:2*q-1:2) and entries below +! the diagonal are in d(2:2*q-2:2). + + if (nb <= 1) then + flag = -4 + return + end if + call ma64_solveD2_double(n,q,nrhs,b,ldb,flag,d) + if (flag/=0) return + call ma64_solveLT2_double(n,q,nb,nrhs,b,ldb,flag,a,ll) + + end subroutine ma64_solveDLT2_double + + +end module hsl_ma64_double + + +! COPYRIGHT (c) 2007 Council for the Central Laboratory +! of the Research Councils +! Original date 5 October 2007. Version 1.0.0. +! 13 November 2007. Version 1.1.0 Subroutines of01*copy moved into the module. +! and removed the separate data module. +! 22 November 2007. Version 2.0.0 Logical argument active replaced by +! integer(long) argument inactive. +! 7 December 2007. Version 3.0.0 Argument inactive removed from OF01_read +! and argument retain replaced by discard. +! 29 July 2009. Version 3.1.0 Minor changes made to avoid references to +! undefined variables. +! 17 December 2009. Version 3.2.0 Minor changes stay within 80 characters +! per line. + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +! To generate another version +! (1) Globally change _double +! (2) Globally change dcopy +! (3) Change wp = kind(0.0d0) +! (4) Globally change the type real(wp) + +module hsl_of01_double + implicit none + private + + public of01_data, of01_data_private + public of01_initialize, of01_open, of01_close, of01_read, of01_write, & + of01_end + + + !!! Parameters !!! + integer, parameter :: default_lpage = 2**12 ! Default page length. + + integer, parameter :: default_maxfiles = 10 ! Maximum number of open files. + + integer, parameter :: default_npage = 1600 ! Default number of pages +! in the buffer. + + integer, parameter :: long = selected_int_kind(18) ! Long integer. + + integer, parameter :: default_file_size = 2**21 ! Default +! target length of each file. + + integer, parameter :: nsup = 2 ! Initial size of the array +! data%private%filename. + + integer, parameter :: wp = kind(0.0d0) ! Defines data type (single/double). + + integer, parameter :: ihash = 3 ! Constant used in the hashing function. + + integer, parameter :: maxpath = 400 ! Max. length of path name. + + integer, parameter :: maxname = 400 ! Max. length of superfile name. + + integer, parameter :: maxlen = maxpath+maxname+10 ! Max. length of file name +! There has to be a limit on the lengths of path and file names because +! Fortran 95 requires the file name in an OPEN statement to be a scalar +! character variable. + + real(wp), parameter :: zero = 0.0_wp + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + type of01_data_private + +! Note: Age is measured since last reference. + real(wp), allocatable :: buffer(:,:) ! of shape (lpage,npage) + + logical, allocatable :: differs(:) ! of size npage. +! differs(I)=.true. if the file version of page I +! of the buffer is different from the buffer version. + + character(maxname), allocatable :: filename(:) +! Set to hold a copy of the superfile names given to OF01_open. + + integer(long), allocatable :: first(:) ! of size npage. first(K) is the +! first page with hash code K or zero if there are none. + + integer :: free ! Start of linked list of free file indices. + + integer(long), allocatable :: left(:),right(:) ! of size maxfiles. +! A sequence of discarded entries on a superfile is recorded as +! left(superfile):right(superfile). + + integer(long), allocatable :: highest(:) ! of size maxfiles. +! highest(I) holds: +! -1 after call of of01_initialize, +! -2 after call of of01_close for file I, or +! >0 highest page number read or written on file I. + + integer, allocatable :: index(:) ! of size npage. index(I) contains the +! index of the (super)file associated with page I of the buffer. + + integer :: iolength ! iolength of a page + + integer :: maxfiles = 0 ! Maximum number of open files. + + integer, allocatable :: name(:) ! of size maxfiles. For a primary file, +! name(I) holds the position of the superfile name in filename. + + integer(long), allocatable :: next(:) ! of size npage. +! next(I) is the next page with same hash code +! or zero for last in list. Otherwise undefined. + + integer :: nfiles ! Number of file indices in use. + + integer(long) :: nrec ! Number of records in each file. + + integer, allocatable :: nextfile(:) ! of size maxfiles. Used for the +! linked list of free file indices and linked lists of indices of +! files in a superfile. nextfile(I) is the next file index in +! its list or zero if there are none. + + integer(long), allocatable :: older(:) ! of size npage. older(I) is the +! next older page to page I, or the youngest page if I is oldest. + + integer(long), allocatable :: page(:) ! of size npage. page(I) is the +! file address (page number) of page I in the buffer. + + integer(long), allocatable :: page_list(:) ! of size npage. +! list of pages for this read or write +! that were in the buffer at the time of call. + + character(maxpath), allocatable :: path(:) +! The paths given to OF01_initialize + + integer(long), allocatable :: prev(:) ! of size npage. prev(I) is the +! previous page with same hash code or -(hash code) +! for first in list. Otherwise undefined. + + integer, allocatable :: unit(:) ! of size maxfiles. unit(I) holds the +! unit for file I or zero if not in use. + + integer(long), allocatable :: younger(:) ! of size npage. +! younger(I) is the next younger page to page I, or +! the oldest page if I is the youngest. + + integer :: youngest ! most recently referenced page in the buffer + + end type of01_data_private + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + type of01_data + + integer :: entry = 0 ! Index of the entry to the package. + + integer :: iostat ! Fortran iostat parameter. + integer :: lpage ! length of each page of the buffer, that is, the +! number of scalar variables in each page. The default is 1024. + + integer(long) :: ncall_read ! number of calls to OF01_read. + + integer(long) :: ncall_write ! number of calls to OF01_write. + + integer(long) :: nio_read ! number of records read by +! OF01_read and OF01_write. + + integer(long) :: nio_write ! number of records written by +! OF01_read and OF01_write. + + integer(long) :: npage ! number of pages in the in-core buffer. +! The default value is 20. It is a long integer, but +! we do not anticipate it being very large. + + integer(long) :: file_size ! target length of each file. +! The default value is default_file_size. + + integer(long) :: nwd_read ! number of scalars read by OF01_read. + + integer(long) :: nwd_write ! number of scalars written by OF01_write. + + type (of01_data_private) :: private +! In Fortran 2003, this should be +! type (of01_data_private), private :: private + + integer :: stat ! Fortran stat parameter. + + end type of01_data + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + interface of01_initialize + module procedure of01_initialize_double + end interface + interface of01_open + module procedure of01_open_double + end interface + interface of01_close + module procedure of01_close_double + end interface + interface of01_read + module procedure of01_read_double + end interface + interface of01_write + module procedure of01_write_double + end interface + interface of01_end + module procedure of01_end_double + end interface + +contains + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + subroutine of01_initialize_double & + (iflag,data,path,file_size,lpage,npage,lp) + +! This subroutine must be called once to initialize +! a structure of derived type of01_data +! and to allocate and initialize its array components. + + integer, intent (out) :: iflag ! Value 0 on successful return. +! The only possible negative values are: +! -1 Allocation error. The STAT parameter returned in data%stat. +! -8 Deallocation error. The STAT parameter returned in data%stat. +! -16 Character length of path too great. + + type (of01_data) , intent (inout) :: data + + character(*), optional, intent (in) :: path(:) ! Paths for the files. +! If absent, (\ '' \) is used. + + integer(long), optional, intent (in) :: file_size ! If present and positive, +! the target length of a file. Default value +! used if absent or present and not positive. + + integer, optional, intent (in) :: lpage ! If present and positive, the +! size of each page in the buffer. Default value used +! if absent or present and not positive. + + integer, optional, intent (in) :: npage ! If present and positive, the +! number of pages in the buffer. Default value used +! if absent or present and not positive. + + integer, optional, intent (in) :: lp ! If present and not negative, the +! unit number for diagnostic messages. 6 is +! used if absent or present and negative. + +! local variables + integer :: i ! do loop variable + integer :: size_path ! size of array path + +!!!!!!!!!!!!!!!!!!!!!!! +! Initialise + iflag = 0 + data%entry = 1 + data%ncall_read = 0 + data%ncall_write = 0 + data%nio_read = 0 + data%nio_write = 0 + data%nwd_read = 0 + data%nwd_write = 0 + +! If napge/lpage supplied, use instead of the default values + data%npage = default_npage + if (present(npage)) then + if (npage < 1) then + iflag = -2; call print_iflag(data,iflag,lp); return + end if + data%npage = npage + end if + + data%lpage = default_lpage + if (present(lpage)) then + if (lpage < 1) then + iflag = -2; call print_iflag(data,iflag,lp); return + end if + data%lpage = lpage + end if + +! Find record length + if (allocated(data%private%buffer)) then + deallocate (data%private%buffer,stat=data%stat) + end if + allocate (data%private%buffer(data%lpage,1),stat=data%stat) + if ( data%stat /= 0) then + iflag = -1; call print_iflag(data,iflag,lp); return + end if + data%private%buffer(:,1) = 0 + inquire (iolength=data%private%iolength) data%private%buffer(:,1) + deallocate (data%private%buffer,stat=data%stat) + if ( data%stat /= 0) then + iflag = -8; call print_iflag(data,iflag,lp); return + end if + + size_path = 1 + if (present(path)) then + size_path = size(path) + if (len(path)>maxpath) then + iflag = -16; call print_iflag(data,iflag,lp); return + end if + end if + + data%file_size = default_file_size + if (present(file_size)) then + if (file_size < data%lpage) then + iflag = -2; call print_iflag(data,iflag,lp); return + end if + data%file_size = file_size + end if + data%private%nrec = data%file_size/data%lpage + data%file_size = data%private%nrec*data%lpage + +! Allocate private arrays + if ( allocated(data%private%highest)) then + deallocate (data%private%highest, data%private%nextfile, & + data%private%index, data%private%older, & + data%private%younger, data%private%differs, & + data%private%prev, data%private%next, & + data%private%first, data%private%page, & + data%private%page_list, data%private%unit, & + data%private%path, data%private%name, & + data%private%left, data%private%right, & + data%private%filename, stat=data%stat) + if (data%stat /= 0) then + iflag = -8; call print_iflag(data,iflag,lp); return + end if + end if + data%private%maxfiles = default_maxfiles + allocate (data%private%highest(data%private%maxfiles), & + data%private%nextfile(data%private%maxfiles), & + data%private%index(1:data%npage), & + data%private%older(1:data%npage), & + data%private%younger(1:data%npage), & + data%private%differs(1:data%npage), & + data%private%prev(1:data%npage), & + data%private%next(1:data%npage), & + data%private%first(1:data%npage), & + data%private%page(1:data%npage), & + data%private%page_list(1:data%npage), & + data%private%unit(data%private%maxfiles), & + data%private%path(size_path), & + data%private%name(data%private%maxfiles), & + data%private%left(data%private%maxfiles), & + data%private%right(data%private%maxfiles), & + data%private%filename(nsup), & + data%private%buffer(data%lpage,data%npage), stat=data%stat) + if (data%stat /= 0) then + data%private%maxfiles = 0 + iflag = -1; call print_iflag(data,iflag,lp); return + end if + +! Initialise arrays + data%private%free = 0 + data%private%nfiles = 0 + data%private%filename(:) = '' + do i = 1, data%npage + data%private%index(i) = -1 + data%private%older(i) = i + 1 + data%private%younger(i) = i - 1 + data%private%page(i) = 0 + data%private%first(i) = 0 + data%private%next(i) = 0 + data%private%prev(i) = 0 + data%private%differs(i) = .false. + end do + data%private%youngest = 1 + data%private%younger(1) = data%npage + data%private%older(data%npage) = 1 + if (present(path)) then + data%private%path(:) = path(:) + else + data%private%path(:) = (/ '' /) + end if + data%private%name(:) = 0 + data%private%buffer(:,1) = 0 + + end subroutine of01_initialize_double + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + subroutine of01_open_double(filename,ifile,iflag,data,lenw,lp) + +! This subroutine must be called for each superfile that is to be +! accessed through HSL_OF01. It gives the superfile an index and opens +! its files. + + character(len=*), intent (in) :: filename ! Name of the superfile. + + integer, intent (out) :: ifile ! Index of the superfile. + + integer, intent (out) :: iflag ! Value 0 on successful return. +! A negative value is associated with an error message +! on unit lp. Possible negative values are: +! -1 Allocation error. The STAT parameter returned in data%stat. +! -5 Error in inquire statement. +! -7 Error in open statement. +! -8 Deallocation error. The STAT parameterreturned in data%stat. +! -11 lenw > 0, but not enough files exist. +! -12 File filename already exists, but lenw is not present +! or lenw <= 0. +! -13 filename is too long. +! -17 open unsuccessful for all elements of path. + + type (of01_data), intent (inout) :: data + + integer(long), optional, intent (in) :: lenw ! length in pages of the +! part of the file that has been written and is not +! regarded as having been overwritten by zeros. +! Pages beyond this are regarded as containing zeros. +! If not present or lenw <= 0, a new file is opened. + + integer, optional, intent (in) :: lp ! unit number for diagnostic messages. +! If not present or equal to the unit number of a file +! that has already been opened for data, 6 is used. +! If lp < 0, messages are suppressed. + +! Local variables + character(10) :: ci ! Filename extension + integer :: i ! do loop variable + integer :: k ! number of secondary files + integer :: l ! file index + integer(long) :: lenw_copy ! no. of pages in the virtual array + integer :: nout ! unit for error messages + integer :: m ! Previous file index in linked list + character(maxname), allocatable :: temp(:) + + iflag = 0 + nout = 6 + if (present(lp)) nout = lp + data%entry = 2 + + if (len(filename) > maxname) then + iflag = -13; go to 100 + end if + +! Find the length of the virtual array + lenw_copy = 0 + if (present(lenw)) lenw_copy = max(0_long,lenw) + +! Find number of secondary files + k = max(0_long,(lenw_copy-1)/data%private%nrec) + +! Find suitable indices and units for all the files and open them + m = 0 + ci='' + do i = 0,k + if (lenw_copy > 0) then + call open_old (data,l,trim(filename)//adjustl(ci),iflag) + else + call open_new (data,l,trim(filename)//adjustl(ci),iflag) + end if + if (iflag /= 0) go to 100 + if (i==0) ifile = l + data%private%highest(l) = max(0_long,lenw_copy) + data%private%left(l) = 1 + data%private%right(l) = 0 + if (m > 0) data%private%nextfile(m) = l + m = l + data%private%highest(l) = lenw_copy + write(ci,'(i5)') i + 1 + end do + +! Look for a place and store filename there + k = size(data%private%filename) + do i = 1, k + if (data%private%filename(i)== '') then + data%private%filename(i) = filename + data%private%name(ifile) = i + return + end if + end do +! Increase size of data%private%filename + allocate(temp(k),stat=data%stat) + if (data%stat /= 0) then + iflag = -1; go to 100 + end if + temp(:) = data%private%filename(:) + deallocate(data%private%filename,stat=data%stat) + if (data%stat /= 0) then + iflag = -8; go to 100 + end if + allocate(data%private%filename(2*k),stat=data%stat) + if (data%stat /= 0) then + iflag = -1; go to 100 + end if + data%private%filename(1:k) = temp(:) + data%private%filename(k+1:) = '' + deallocate(temp,stat=data%stat) + if (data%stat /= 0) then + iflag = -8; go to 100 + end if +! Store filename + data%private%filename(k+1) = filename + data%private%name(ifile) = k+1 + return + +100 call print_iflag(data,iflag,lp) + + end subroutine of01_open_double + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + subroutine of01_read_double & + (ifile,loc,n,read_array,iflag,data,lp,map,discard) + +! This subroutine performs the read from a superfile. + + integer, intent (in) :: ifile ! index of the superfile. + + integer(long), intent (in) :: loc ! Start position in virtual array. + + integer, intent (in) :: n ! Number of entries to be read. + + real(wp), intent (inout) :: read_array(*) +! Array into which data from the file is read. +! If map is present, file data is added into it thus: +! read_array(map) = read_array(map) + file_data(1:n) + + integer, intent (out) :: iflag ! Successful return indicated by iflag = 0. +! Negative value associated with an error message which +! is output on unit lp. Possible negative values: +! -3 loc is not positive. +! -4 Attempt to access a file that is not open. +! -5 Error in Fortran INQUIRE. The IOSTAT parameter is returned in +! data%iostat. +! -6 Error in Fortran READ. The IOSTAT parameter is returned in +! data%iostat. +! -7 Error in Fortran OPEN statement. The IOSTAT parameter +! is returned in data%iostat. +! -9 ifile out of range. +! -15 Error in Fortran WRITE. The IOSTAT parameter +! is returned in data%iostat. + + type (of01_data), intent (inout) :: data + + integer, optional, intent (in) :: lp ! unit number for diagnostic messages. +! Negative for no messages. If not present or equal to unit +! number of a file that has already been opened for data, 6 is used. + + integer, optional, intent (in) :: map(n) ! map array. + + logical, optional, intent (in) :: discard ! Whether data is to be discarded. + +! Local variables + integer(long) :: first_page ! first page number required. + integer(long) :: first_pos ! position within first page of first value +! required. + integer(long) :: left,right ! Range of discarded entries + integer(long) :: ip ! page number on file of the current page. + integer(long) :: ipw ! Position in list in page_list(:) of the buffer +! pages that have been accessed. + integer(long) :: jh ! temporary variable used to hold a hash code. + integer(long) :: jp ! page number in the buffer of the required page. + integer :: jfile ! file associated with a page in the buffer + integer(long) :: l ! temporary variable. + integer(long) :: last_page ! last page number required. + integer(long) :: last_pos ! position within last page of last value +! required. + integer(long) :: lenl ! length of list in page_list(:) of accessed pages + integer :: lpage ! page length. + integer(long) :: m ! temporary variable. + logical :: my_discard ! Whether the data is to be discarded. + +!!!!!!!!!!!!!!!!!!!!!!!!!!!! + iflag = 0 + if (n <= 0) return + data%entry = 3 + +! Check for errors in incoming data + if (ifile < 1) then + iflag = -9; go to 200 + else if (ifile > data%private%nfiles) then + iflag = -4; go to 200 + else if (data%private%highest(ifile) < 0) then + iflag = -4; go to 200 + else if (loc <= 0) then + iflag = -3; go to 200 + end if + + my_discard = .false. + if (present(discard)) then + if (discard) then + my_discard = .true. + left = loc + right = loc+n-1 + if (loc == data%private%right(ifile)+1) then + left = data%private%left(ifile) + else if (loc+n == data%private%left(ifile)) then + right = data%private%right(ifile) + end if + data%private%left(ifile) = left + data%private%right(ifile) = right + end if + end if + +! lpage is the length of a page (= length of a record in the file) + lpage = data%lpage + +! first_page and last_page are first and last page numbers required. + first_page = 1 + (loc-1)/lpage + last_page = 1 + (loc+(n-1)-1)/lpage + +! first_pos and last_pos are positions within first and +! last pages of first and last values required. + first_pos = loc - (first_page-1)*lpage + last_pos = loc + n - 1 - (last_page-1)*lpage + + data%ncall_read = data%ncall_read + 1 + data%nwd_read = data%nwd_read + n + + lenl = 0 +! Look for required pages that are in the buffer + look1: do ip = first_page, last_page + +! See if the page requested is the youngest + jp = data%private%youngest + if (data%private%page(jp) == ip) then + if (data%private%index(jp) == ifile) then +! Special code for when the youngest page is wanted + lenl = lenl + 1 + data%private%page_list(lenl) = ip + go to 10 + end if + end if +! Find hash code for page ip in file ifile. + jh = 1 + mod(ip+ifile*ihash,data%npage) +! first(jh) is the first page with hash code jh or 0 if there are none + jp = data%private%first(jh) + do l = 1, data%npage+1 + if (jp == 0) cycle look1 +! data%private%index(jp) holds the index of the (super)file +! associated with page jp in the buffer + jfile = data%private%index(jp) + if (jfile == ifile) then +! data%private%page(jp) is record (page) index in file of page jp in buffer + if (data%private%page(jp) == ip) exit + end if + jp = data%private%next(jp) + end do +! page ip found as page jp in buffer + lenl = lenl + 1 + data%private%page_list(lenl) = ip +! remove page from its present position + l = data%private%younger(jp) + m = data%private%older(jp) + data%private%older(l) = m + data%private%younger(m) = l +! insert page as youngest + l = data%private%younger(data%private%youngest) + data%private%older(l) = jp + data%private%younger(jp) = l + data%private%older(jp) = data%private%youngest + data%private%younger(data%private%youngest) = jp + data%private%youngest = jp +10 call read_from_buffer + if (my_discard) then + if ((ip-1)*lpage+1 >= left .and. ip*lpage+1 <= right ) & + data%private%differs(jp) = .false. + end if + end do look1 + +! look for pages not yet treated and treat each of them + ipw = 1 + look2: do ip = first_page, last_page + if ( ipw.le.lenl) then + if (data%private%page_list(ipw) == ip) then + ipw = ipw+1 + cycle + end if + end if +! the oldest page is overwritten and becomes the youngest + jp = data%private%younger(data%private%youngest) + data%private%youngest = jp + +! data%private%index(jp) contains index of (super)file associated +! with page jp + jfile = data%private%index(jp) + if (jfile>=0) then +! write page from buffer to record page(jp) in the file +! if it has been altered (ie if differs(,jp) is set to 1). + if (data%private%differs(jp)) call page_write(data, & + data%private%buffer(:,jp),jfile,data%private%page(jp),iflag) + if (iflag /= 0) go to 200 + +! remove page from hash list +! prev(jp) is the last page with same hash code ( or -hash code +! for the first in the list) + l = data%private%prev(jp) +! next(jp) is next page with same hash code, or 0 if last in list + m = data%private%next(jp) + if (m > 0) data%private%prev(m) = l + if (l > 0) then + data%private%next(l) = m + else if (l < 0) then + l = -l + data%private%first(l) = m + end if + end if + +! Read from file record ip into page jp of buffer +! Check whether read extends beyond +! where file written. If it does, fill buffer with zeros and return + if (ip > data%private%highest(ifile)) then + data%private%buffer(:,jp) = zero + else + call page_read(data,data%private%buffer(:,jp),ifile,ip, & + iflag) + if (iflag /= 0) go to 200 + end if +! add to hash list + jh = 1 + mod(ip+ifile*ihash,data%npage) + m = data%private%first(jh) + data%private%next(jp) = m + if (m > 0) data%private%prev(m) = jp + data%private%first(jh) = jp + data%private%prev(jp) = -jh +! revise rest of page table + data%private%index(jp) = ifile + data%private%page(jp) = ip + data%private%differs(jp) = .false. + +! perform actual transfer to read_array from buf + call read_from_buffer + + end do look2 +! call buffer + return + +200 call print_iflag(data,iflag,lp) + + contains + + subroutine buffer + integer i + i = data%private%youngest + write(*,'(a)') ' file page' + do + if(data%private%index(i)>0) & + write(*,'(2i5)') data%private%index(i), data%private%page(i) + i = data%private%older(i) + if (i == data%private%youngest)exit + end do + end subroutine buffer + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + subroutine read_from_buffer + + integer :: l1,l2 ! Temporaries +! Read page jp of the buffer (page ip of the virtual array) or part thereof. + l2 = lpage + l1 = 1 + if (ip == first_page) then + l1 = first_pos + m = 1 + else + m = (ip-first_page)*lpage+2-first_pos + end if + if (ip == last_page) l2 = last_pos + if (.not. present(map)) then + call dcopy(l2-l1+1,data%private%buffer(l1,jp),1,read_array(m),1) + else + call of01_mcopy(l2-l1+1,data%private%buffer(l1,jp),read_array,map(m)) + end if + end subroutine read_from_buffer + + end subroutine of01_read_double + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + subroutine of01_write_double & + (ifile,loc,n,write_array,iflag,data,lp,inactive) + +! This subroutine performs the writing to a superfile. + + integer, intent (in) :: ifile ! Index of the (super)file. + + integer(long), intent (in) :: loc ! Start position in virtual array. + + integer, intent (in) :: n ! Number of entries to be written. + + real(wp), intent (in) :: write_array(*) ! array from which data +! is written to the file. + integer, intent (out) :: iflag ! Successful return indicated by iflag = 0. +! Negative value associated with an error message which +! is output on unit lp. Possible negative values: +! -3 loc is not positive. +! -4 Attempt to access a file that is not OF01_open. +! -5 Error in INQUIRE. The IOSTAT value +! is returned in data%iostat. +! -9 ifile out of range. +! -15 Error in Fortran WRITE. The IOSTAT parameter +! is returned in data%iostat. +! -17 open unsuccessful for all elements of path. + + type (of01_data), intent (inout) :: data + + integer, optional, intent (in) :: lp ! unit number for diagnostic messages. +! Negative for no messages. +! If not present or equal to the unit number of a file +! that has already been opened for data, 6 is used. + + integer(long), optional, intent (in) :: inactive ! If present, it is +! assumed that the data transferred are unlikely to be needed before +! other data in the buffer. If inactive data%private%nfiles) then + iflag = -4; go to 300 + else if (data%private%highest(ifile) < 0) then + iflag = -4; go to 300 + else if (loc <= 0) then + iflag = -3; go to 300 + end if + +! lpage is the length of a page (= length of a record in the file) + lpage = data%lpage + +! first_page and last_page are first and last page numbers required. + first_page = 1 + (loc-1)/lpage + last_page = 1 + (loc+(n-1)-1)/lpage + + if (present(inactive)) then + if (first_page==last_page) then + inactive_first = .false. + else + inactive_first = inactive<=1+(first_page-1)*lpage + inactive_middle = .true. + inactive_last = inactive>=last_page*lpage + end if + else + inactive_middle = .false. + inactive_first = .false. + inactive_last = .false. + end if + +! If there is any overlap with the range of discarded entries, +! reset the range to be null + if (loc>data%private%right(ifile)) then + else if (loc+n-1= 0) then +! write page from buffer to record page(jp) in the file +! if it has been altered. + if (data%private%differs(jp)) call page_write(data, & + data%private%buffer(:,jp),jfile,data%private%page(jp),iflag) + if (iflag /= 0) go to 300 + +! remove page from hash list +! prev(jp) is the last page with same hash code ( or -hash code +! for the first in the list) + l = data%private%prev(jp) +! next(jp) is next page with same hash code, or 0 if last in list + m = data%private%next(jp) + if (m > 0) data%private%prev(m) = l + if (l > 0) then + data%private%next(l) = m + else if (l < 0) then + l = -l + data%private%first(l) = m + end if + end if + +! Read from file record ip into page jp of buffer +! Check whether read extends beyond +! where file written. If it does, fill buffer with zeros and return + if (ip>data%private%highest(ifile)) then + data%private%buffer(:,jp) = zero + else + call page_read(data,data%private%buffer(:,jp),ifile,ip, & + iflag) + if (iflag /= 0) go to 300 + end if +! add to hash list + jh = 1 + mod(ip+ifile*ihash,data%npage) + m = data%private%first(jh) + data%private%next(jp) = m + if (m>0) data%private%prev(m) = jp + data%private%first(jh) = jp + data%private%prev(jp) = -jh +! revise rest of page table + data%private%index(jp) = ifile + data%private%page(jp) = ip + data%private%differs(jp) = .true. + +! perform actual transfer to write_array from buf + call write_to_buffer + + end do look2 +! call buffer + return + +300 call print_iflag(data,iflag,lp) + + contains + + subroutine buffer + integer i + i = data%private%youngest + write(*,'(a)') ' file page' + do + if(data%private%index(i)>0) & + write(*,'(2i5)') data%private%index(i), data%private%page(i) + i = data%private%older(i) + if (i == data%private%youngest)exit + end do + end subroutine buffer + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + subroutine write_to_buffer + + integer :: l1,l2 ! Temporaries + +! Write page jp of the buffer (page ip of the virtual array) or part thereof. + l2 = lpage + l1 = 1 + if (ip == first_page) then + l1 = first_pos + m = 1 + else + m = (ip-first_page)*lpage+2-first_pos + end if + if (ip==last_page) l2 = last_pos + call dcopy(l2-l1+1,write_array(m),1,data%private%buffer(l1,jp),1) + data%private%differs(jp) = .true. + + end subroutine write_to_buffer + end subroutine of01_write_double + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + subroutine of01_close_double(ifile,lenw,num_file,iflag,data,lp,lkeep) + +! This subroutine should be called when a superfile is finished with. +! Its data in the buffer are unloaded. + + integer, intent (in) :: ifile ! index of the superfile. + + integer(long), intent (out) :: lenw ! length in pages of the part of +! the file that has been written. + integer, intent (out) :: num_file ! total number of additional files +! that have been opened. They are named +! filenamej, j = 1, ..., num_file. + integer, intent (out) :: iflag ! iflag = 0 for a successful return. +! A negative value is associated with an error +! message on unit lp. Possible negative values: +! -4 Attempt to access a file that is not OF01_open. +! -5 Error in INQUIRE. IOSTAT value is returned in data%iostat. +! -9 ifile out of range. +! -14 Error in CLOSE statement. The IOSTAT value +! is returned in data%iostat. +! -15 Error in WRITE. The IOSTAT value +! is returned in data%iostat. +! -17 open unsuccessful for all elements of path. + + type (of01_data), intent (inout) :: data + + integer, optional, intent (in) :: lp ! If present, lp must hold the unit +! for diagnostic messages. Otherwise, lp = 6 used. +! If lp < 0 , messages are suppressed. + + logical, optional, intent (in) :: lkeep ! If present and set to .FALSE., +! the files are deleted on being closed. +! Otherwise, the files are kept. + +! Local variables + integer(long) :: i ! do loop variable + integer :: j ! do loop variable + integer :: jfile ! index of a file + integer(long) :: l ! page number + integer :: lpage ! length of each page (= data%lpage) + integer(long) :: m ! page number + integer(long) :: oldest ! oldest page + integer(long) :: oldest2 ! second oldest page + character (maxlen) name ! File name + character(len=6) :: status ! File status on closing + +!!!!!!!!!!!!!!!!!!! + iflag = 0 + data%entry = 5 +! Check for errors + if (ifile < 1) then + iflag = -9; go to 400 + else if (ifile > data%private%nfiles) then + iflag = -4; go to 400 + else if (data%private%highest(ifile) < 0) then + iflag = -4; go to 400 + end if + + status = 'keep' + if (present(lkeep)) then + if (.not. lkeep) status = 'delete' + end if + +! search the pages of the buffer dealing with those associated +! with ifile. + search:do i = 1, data%npage +! data%private%index(i) is index of the (super)file associated +! with page i of buffer + if (ifile /= data%private%index(i)) cycle + data%private%index(i) = -1 + if (data%private%differs(i)) then +! File version of page i is not the same as the buffer version so +! write page i to file + data%private%differs(i) = .false. + lpage = data%lpage + if (status == 'keep') then + call page_write(data, & + data%private%buffer(:,i),ifile,data%private%page(i),iflag) + if (iflag /= 0) then + call print_iflag(data,iflag,lp) + return + end if + end if + end if + +! remove page from hash list + l = data%private%prev(i) ! Previous + m = data%private%next(i) ! Next + if (m>0) data%private%prev(m) = l + if (l>0) then + data%private%next(l) = m + else if (l < 0) then + l = -l ! i is first in the list with code l + data%private%first(l) = m + end if + +! youngest is the most recently referenced page in the buffer. +! younger(youngest) is the oldest page in the buffer. + oldest = data%private%younger(data%private%youngest) +! if page i is not already the oldest, make it so. + if (oldest==i) cycle +! remove page from its present position + l = data%private%younger(i) + m = data%private%older(i) +! l is next youngest to page I and m is the next oldest + data%private%older(l) = m + data%private%younger(m) = l + +! insert page i as the oldest page +! older(oldest) is the youngest page + data%private%youngest = data%private%older(oldest) + +! Page i becomes the oldest page. The page that was the oldest +! becomes the second (ie next) oldest page + oldest2 = oldest + oldest = i + data%private%older(oldest2) = oldest + data%private%younger(oldest) = oldest2 + data%private%older(oldest) = data%private%youngest + data%private%younger(data%private%youngest) = oldest + end do search + + lenw = data%private%highest(ifile) + if (lenw <= 0 ) status = 'delete' + num_file = (lenw-1)/data%private%nrec + +! remove file from list of declared files. +! close files + inquire(unit=data%private%unit(ifile),name=name,iostat=data%iostat) + if ( data%iostat /= 0) then + iflag = -5; go to 400 + end if + close (unit=data%private%unit(ifile),status=status,iostat=data%iostat) + if ( data%iostat /= 0) then + iflag = -14; go to 400 + end if + data%private%unit(ifile) = 0 + data%private%highest(ifile) = -1 + jfile = ifile + if (num_file > 0) then + do j = 1, num_file + m = data%private%nextfile(jfile) + inquire(unit=data%private%unit(m),name=name,iostat=data%iostat) + if ( data%iostat /= 0) then + iflag = -5; go to 400 + end if + close (unit=data%private%unit(m),status=status,iostat=data%iostat) + if ( data%iostat /= 0) then + iflag = -14; go to 400 + end if + data%private%unit(m) = 0 + data%private%highest(m) = -1 + jfile = m + end do + end if +! Put the freed indices at the front of the list list of free indices + data%private%nextfile(jfile) = data%private%free + data%private%free = ifile + +! Clear the name for reuse + data%private%filename(data%private%name(ifile))='' + + return + +400 call print_iflag(data,iflag,lp) + + end subroutine of01_close_double + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + subroutine of01_end_double(iflag,data,lp) + +! This subroutine deallocates the private array components of data. + + integer, intent (out) :: iflag +! 0 successful return. +! -8 Error in Fortran DEALLOCATE statement. The STAT +! value is returned in data%stat. +! -10 of01_close has not been called for a superfile. + + type (of01_data), intent (inout) :: data + + integer, optional, intent (in) :: lp ! If present, lp must hold the unit +! for diagnostic messages. Otherwise, lp = 6 used. +! If lp < 0, messages are suppressed. + +! Local variables + integer :: i + +!!!!!!!!!!!!!!!!!!! + iflag = 0 + data%entry = 6 + + do i = 1, data%private%nfiles + if (data%private%highest(i) >= 0) then + iflag = -10; call print_iflag(data,iflag,lp) + return + end if + end do + +! Deallocate arrays + if ( allocated(data%private%highest)) then + deallocate (data%private%highest, data%private%nextfile, & + data%private%index, data%private%older, & + data%private%younger, data%private%differs, & + data%private%prev, data%private%next, & + data%private%first, data%private%page, & + data%private%page_list, data%private%unit, & + data%private%buffer, data%private%path, & + data%private%left, data%private%right, & + data%private%name, data%private%filename, & + stat=data%stat) + data%private%maxfiles = 0 + if (data%stat /= 0) then + iflag = -8; call print_iflag(data,iflag,lp) + end if + end if + + end subroutine of01_end_double + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + subroutine page_write(data,buffer,ifile,locp,iflag) + +! This subroutine transfers a page of the buffer to a file. If the +! page is within the existing virtual array then a simple write +! is performed. To write a page beyond the present end may require +! writing pages full of zeros in front of its position. + + type (of01_data), intent (inout) :: data + + real(wp), intent (inout) :: buffer(data%lpage) ! array from which +! the transfer is made. + integer, intent (in) :: ifile ! the index of the primary file. + + integer(long), intent (in) :: locp ! page number in the file. + + integer, intent (out) :: iflag ! error flag. Possible negative values: +! -5 Error in INQUIRE. IOSTAT value is returned in data%iostat. +! -7 Error in OPEN. IOSTAT valueis returned in data%iostat. +! -15 Error in WRITE. IOSTAT value is returned in data%iostat. + +! Local variables + integer(long) :: hpage ! highest page read or written for ifile + integer(long) :: l ! do loop variable + + hpage = data%private%highest(ifile) + if (locp <= hpage+1) then +! Write straight to file + call actual_page_write(locp) + if (iflag /= 0) return + else +! Fill the gap with zero page +! first write out buffer to page hpage+1 + call actual_page_write(hpage+1) + if (iflag /= 0) return + buffer(:) = zero +! write pages of zeros + do l = hpage+2, locp-1 + call actual_page_write(l) + if (iflag /= 0) return + end do +! read buffer back in from page hpage+1 + call page_read(data,buffer,ifile,hpage+1,iflag) + if (iflag /= 0) return +! Now write buffer to the required location + call actual_page_write(locp) + if (iflag /= 0) return +! Finally write zeros to hpage+1 + buffer(:) = zero + call actual_page_write(hpage+1) + if (iflag /= 0) return + end if + + contains +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + subroutine actual_page_write(locp) + +! Perform an actual i/o write of a page to a superfile. If necessary, open +! intermediate secondary files. + + integer(long), intent (in) :: locp ! page index in the superfile. + +! Local variables + character(10) :: ci ! Filename extension. + integer(long) :: new_locp ! page index in the file that is read. + integer i ! Do index. + integer k ! 0 for primary file or >0 for k-th secondary file. + integer l ! index of the file that is written. + integer m ! Previous file in linked list. + character(len=maxlen) :: filename ! name of the primary file. + + iflag = 0 + k = (locp-1)/data%private%nrec + new_locp = locp - k*data%private%nrec + l = ifile + do i = 1, k + m = l + l = data%private%nextfile(l) + if (l == 0) then +! open new file (filename1, filename2, etc) + filename = data%private%filename(data%private%name(ifile)) + write(ci,'(i5)')i + call open_new (data,l,trim(filename)//adjustl(ci),iflag) + if (iflag /= 0) return + +! Add to linked list for ifile + if (m > 0) data%private%nextfile(m) = l + m = l + end if + end do + + data%nio_write = data%nio_write + 1 + write (unit=data%private%unit(l),rec=new_locp,iostat=data%iostat) buffer +! write(*,*) 'write record',new_locp,data%iostat + if (data%iostat /= 0) then + iflag = -15; return + end if + data%private%highest(ifile) = max(data%private%highest(ifile),locp) + + end subroutine actual_page_write + + end subroutine page_write + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + subroutine page_read(data,buffer,ifile,locp,iflag) + +! This subroutine performs an actual i/o read of a page from a superfile + + type (of01_data), intent (inout) :: data + + real(wp),intent(out) :: buffer(data%lpage) ! array to which page is read + + integer, intent (in) :: ifile ! index of the superfile. + + integer(long), intent (in) :: locp ! page index in the superfile. + + integer, intent (out) :: iflag ! Error flag. Possible negative value: +! -6 error in read statement + +! Local variables + integer(long) :: new_locp ! page index in the file that is read. + integer i ! Do index. + integer k ! 0 for primary file or > 0 for k-th secondary file. + integer l ! index of the file that is read. + +!!!!!!!!!!!!!!!!!!!!!!!!!! + iflag = 0 + k = (locp-1)/data%private%nrec + new_locp = locp - k*data%private%nrec + +! Find index of the kth linked file + l = ifile + do i = 1, k + l = data%private%nextfile(l) + end do + + data%nio_read = data%nio_read + 1 + read (unit=data%private%unit(l),rec=new_locp,iostat=data%iostat) buffer + if (data%iostat /= 0) iflag = -6 + + end subroutine page_read + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + subroutine open_new (data,ifile,filename,iflag) + +! Open a new file + + type (of01_data) :: data + + integer, intent(out) :: ifile ! File index. + + character (*) :: filename! ! File name. + + integer, intent (inout) :: iflag ! Error flag. Possible nonzero value: +! -7 Error in OPEN. The IOSTAT value is returned in data%iostat. + +! Local variables + logical :: ex ! exist variable for inquire. + integer :: i ! Do index. + integer :: j ! Do index. + integer :: unit ! Unit. + logical :: open ! open variable for inquire. + +! Check file does not already exist + do i = 1, size(data%private%path) + inquire (file=trim(data%private%path(i))//filename,exist=ex,& + iostat=data%iostat) + if (data%iostat /= 0) then + iflag = -5; return + else if (ex) then + iflag = -12; data%iostat=i; return + end if + end do + + call find_unit(data,unit,ifile,iflag) + if (iflag /= 0) return + +! Open the file on the first available path + outer: do i = 1, size(data%private%path) + open (unit,file=trim(data%private%path(i))//filename, & + access='direct',iostat=data%iostat,recl=data%private%iolength) + if (data%iostat /= 0) then + close(unit,iostat=data%iostat,status='delete') + cycle + end if + + if (size(data%private%path) == 1) return +! Check that there is room for the file + do j = 1, data%private%nrec + write(unit,rec=j,iostat=data%iostat)data%private%buffer(:,1) + if (data%iostat /= 0) then + close(unit,iostat=data%iostat,status='delete') + cycle outer + end if + end do + close(unit,iostat=data%iostat) + if (data%iostat /= 0) then + inquire(unit,opened=open) + if (.not.open) & + open (unit,file=trim(data%private%path(i))//filename, & + access='direct',iostat=data%iostat,recl=data%private%iolength) + close(unit,iostat=data%iostat,status='delete') + cycle outer + end if + open (unit,file=trim(data%private%path(i))//filename, & + access='direct',iostat=data%iostat,recl=data%private%iolength) + return + end do outer + iflag = -17 + + end subroutine open_new + + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + subroutine open_old (data,ifile,filename,iflag) + +! Open an old file. + + type (of01_data) :: data + + integer, intent(out) :: ifile ! File index. + character (*) :: filename ! File name. + + integer, intent (inout) :: iflag ! Possible nonzero values: +! -5 Error in inquire statement +! -7 Error in OPEN. The IOSTAT value is returned in data%iostat. +! -11 File does not exist + +! Local variables + logical :: ex ! exist variable for inquire. + integer :: i ! Do index. + integer :: unit ! Unit. + +! Find the file. + do i = 1, size(data%private%path) + inquire (file=trim(data%private%path(i))//filename,exist=ex,& + iostat=data%iostat) + if (data%stat /= 0) then + iflag = -5; return + end if + if (ex) exit + end do + if (.not. ex) then +! File not found + iflag = -11; return + end if + + call find_unit(data,unit,ifile,iflag) + if (iflag /= 0) return + + open (unit,file=trim(data%private%path(i))//filename, access='direct', & + iostat=data%iostat, recl=data%private%iolength) + if (data%iostat /= 0) then + iflag = -7; return + end if + + end subroutine open_old + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + subroutine find_unit(data,unit,ifile,iflag) + +! Find a free unit and a free file index. + + type (of01_data) :: data + integer, intent (out) :: unit ! Free unit. + + integer, intent (out) :: ifile ! Free file. + + integer, intent (inout) :: iflag ! Possible nonzero value: +! -5 Error in INQUIRE. The IOSTAT value is returned in data%iostat. + +! Local variables + logical :: open + integer :: oldsize + +! Find free unit + do unit = 12, huge(0) + inquire (unit=unit,iostat=data%iostat,opened=open) + if (data%iostat /= 0) then +! Error in inquire + ifile = -1 + iflag = -5; return + end if + if (.not. open) exit + end do + +! Find free file index + ifile = data%private%free + if (ifile > 0) then + data%private%free = data%private%nextfile(ifile) + else + ifile = data%private%nfiles+1 + if (ifile>data%private%maxfiles) then +! Reallocate files + data%private%maxfiles = 0 + call reallocate_long(data%private%highest) + if (iflag < 0) return + call reallocate_long(data%private%left) + if (iflag < 0) return + call reallocate_long(data%private%right) + if (iflag < 0) return + call reallocate(data%private%nextfile) + if (iflag < 0) return + oldsize = size(data%private%name) + call reallocate(data%private%name) + data%private%name(oldsize+1:) = 0 + if (iflag < 0) return + call reallocate(data%private%unit) + if (iflag < 0) return + data%private%maxfiles = size(data%private%unit) + end if + data%private%nfiles = ifile + end if + data%private%nextfile(ifile) = 0 + data%private%highest(ifile) = -1 + data%private%left(ifile) = 1 + data%private%right(ifile) = 0 + data%private%unit(ifile) = unit + + contains +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!11 + subroutine reallocate(array) + + integer, allocatable :: array(:) + integer, allocatable :: temp(:) + + allocate(temp(size(array)),stat=data%stat) + if ( data%stat /= 0) then + iflag = -1; return + end if + + temp(:) = array(:) + + deallocate(array,stat=data%stat) + if ( data%stat /= 0) then + iflag = -8; return + end if + + allocate(array(size(temp)*2),stat=data%stat) + if ( data%stat /= 0) then + iflag = -1; return + end if + + array(1:size(temp)) = temp(:) + deallocate(temp,stat=data%stat) + if ( data%stat /= 0) then + iflag = -8; return + end if + + end subroutine reallocate +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + subroutine reallocate_long(array) + + integer(long), allocatable :: array(:) + + integer(long), allocatable :: temp(:) + + allocate(temp(size(array)),stat=data%stat) + if ( data%stat /= 0) then + iflag = -1; return + end if + + temp(:) = array(:) + + deallocate(array,stat=data%stat) + if ( data%stat /= 0) then + iflag = -8; return + end if + + allocate(array(size(temp)*2),stat=data%stat) + if ( data%stat /= 0) then + iflag = -1; return + end if + + array(1:size(temp)) = temp(:) + + deallocate(temp,stat=data%stat) + if ( data%stat /= 0) then + iflag = -8; return + end if + + end subroutine reallocate_long + + end subroutine find_unit + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + subroutine print_iflag(data,iflag,lp) + + type (of01_data) :: data + + integer, intent (in) :: iflag ! Error flag. + + integer, optional :: lp ! unit number for diagnostic messages. +! Negative for no messages. If not present or equal to unit +! number of a file that has already been opened for data, 6 is used. + +! Local variables + integer :: i, nout + character(10), parameter :: names(6) = (/'initialize','open ',& + 'read ','write ','close ','end '/) +!!!!!!!!!!!!!!!!!!!!!!!!!! + + nout = 6 + if (present(lp)) then + if (lp < 0) return + nout = lp +! check lp not equal to the unit number of a file that has been declared + do i = 1, data%private%nfiles + if (data%private%unit(i) == lp) then + nout = 6; exit + end if + end do + end if + + write (nout,'(3a,i3)') ' Error return from OF01_', & + trim(names(data%entry)), '. Error flag = ', iflag + + if (iflag == -1) then + write (nout,'(a,i3)') ' Allocation error. stat parameter = ', data%stat + else if (iflag == -2) then + write (nout,'(a,i3)') ' Violation of restriction on optional argument ' + else if (iflag == -3) then + write (nout,'(a,i3)') ' loc out of range' + else if (iflag == -4) then + write (nout,'(a,i3)') & + ' the superfile is not open under OF01' + else if (iflag == -5) then + write (nout,'(2a,i3)') ' INQUIRE statement error;', & + ' iostat parameter = ', data%iostat + else if (iflag == -6) then + write (nout,'(2a,i3)') ' READ statement error;', & + ' iostat parameter = ', data%iostat + else if (iflag == -7) then + write (nout,'(2a,i3)') ' OPEN statement error;', & + ' iostat parameter = ', data%iostat + else if (iflag == -8) then + write (nout,'(a,i3)') ' Deallocation error. stat parameter = ', & + data%stat + else if (iflag == -9) then + write (nout,'(a)') & + ' ifile is out of its range' + else if (iflag == -10) then + write (nout,'(2a)') ' one or more superfiles are open through HSL_OF01' + else if (iflag == -11) then + write (nout,'(2a)') ' lenw is positive but one or more of the ', & + 'required files does not exist' + else if (iflag == -12) then + write (nout,'(2a)') ' filename already exists in path ', & + trim(data%private%path(data%iostat)) + else if (iflag == -13) then + write (nout,'(a,i5)') ' file name is longer than ', maxname + else if (iflag == -14) then + write (nout,'(2a,i3)') ' CLOSE statement error;', & + ' iostat parameter = ', data%iostat + else if (iflag == -15) then + write (nout,'(2a,i3)') ' WRITE statement error;', & + ' iostat parameter = ', data%iostat + else if (iflag == -16) then + write (nout,'(a,i5)') ' path name is longer than ', maxpath + else if (iflag == -17) then + write (nout,'(a,i5)') ' unable to open file of given length' + end if + + end subroutine print_iflag + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + subroutine of01_mcopy(len,buffer,array,map) + +! Add buffer into array under the control of map, thus: +! do l = 1,len +! i = map(l) +! array(i) = array(i) + buffer(l) +! end do + + integer, intent(in) :: len + real(wp), intent(in) :: buffer(len) + real(wp), intent(inout) :: array(*) + integer, intent(in) :: map(len) + +! Local variables + integer :: i,k,l +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + k = mod(len,7) + do l = 1, k + i = map(l); array(i) = array(i) + buffer(l) + end do + + do l = k + 1, len, 7 + i = map(l); array(i) = array(i) + buffer(l) + i = map(l+1); array(i) = array(i) + buffer(l+1) + i = map(l+2); array(i) = array(i) + buffer(l+2) + i = map(l+3); array(i) = array(i) + buffer(l+3) + i = map(l+4); array(i) = array(i) + buffer(l+4) + i = map(l+5); array(i) = array(i) + buffer(l+5) + i = map(l+6); array(i) = array(i) + buffer(l+6) + end do + + end subroutine of01_mcopy + + +end module hsl_of01_double + +! COPYRIGHT (c) 2007 Council for the Central Laboratory +! of the Research Councils +! Original date 5 October 2007. Version 1.0.0. +! 13 November 2007. Version 1.1.0 Subroutines of01*copy moved into the module. +! and removed the separate data module. +! 22 November 2007. Version 2.0.0 Logical argument active replaced by +! integer(long) argument inactive. +! 7 December 2007. Version 3.0.0 Argument inactive removed from OF01_read +! and argument retain replaced by discard. +! 29 July 2009. Version 3.1.0 Minor changes made to avoid references to +! undefined variables. + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +module hsl_of01_integer + implicit none + private + + public of01_data, of01_data_private + public of01_initialize, of01_open, of01_close, of01_read, of01_write, & + of01_end + + + !!! Parameters !!! + integer, parameter :: default_lpage = 2**12 ! Default page length. + + integer, parameter :: default_maxfiles = 10 ! Maximum number of open files. + + integer, parameter :: default_npage = 1600 ! Default number of pages +! in the buffer. + + integer, parameter :: long = selected_int_kind(18) ! Long integer. + + integer, parameter :: default_file_size = 2**21 ! Default +! target length of each file. + + integer, parameter :: nsup = 2 ! Initial size of the array +! data%private%filename. + + integer, parameter :: wp = kind(0) ! Defines data type (single/double). + + integer, parameter :: ihash = 3 ! Constant used in the hashing function. + + integer, parameter :: maxpath = 400 ! Max. length of path name. + + integer, parameter :: maxname = 400 ! Max. length of superfile name. + + integer, parameter :: maxlen = maxpath+maxname+10 ! Max. length of file name +! There has to be a limit on the lengths of path and file names because +! Fortran 95 requires the file name in an OPEN statement to be a scalar +! character variable. + + integer(wp), parameter :: zero = 0 + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + type of01_data_private + +! Note: Age is measured since last reference. + integer(wp), allocatable :: buffer(:,:) ! of shape (lpage,npage) + + logical, allocatable :: differs(:) ! of size npage. +! differs(I)=.true. if the file version of page I +! of the buffer is different from the buffer version. + + character(maxname), allocatable :: filename(:) +! Set to hold a copy of the superfile names given to OF01_open. + + integer(long), allocatable :: first(:) ! of size npage. first(K) is the +! first page with hash code K or zero if there are none. + + integer :: free ! Start of linked list of free file indices. + + integer(long), allocatable :: left(:),right(:) ! of size maxfiles. +! A sequence of discarded entries on a superfile is recorded as +! left(superfile):right(superfile). + + integer(long), allocatable :: highest(:) ! of size maxfiles. +! highest(I) holds: +! -1 after call of of01_initialize, +! -2 after call of of01_close for file I, or +! >0 highest page number read or written on file I. + + integer, allocatable :: index(:) ! of size npage. index(I) contains the +! index of the (super)file associated with page I of the buffer. + + integer :: iolength ! iolength of a page + + integer :: maxfiles = 0 ! Maximum number of open files. + + integer, allocatable :: name(:) ! of size maxfiles. For a primary file, +! name(I) holds the position of the superfile name in filename. + + integer(long), allocatable :: next(:) ! of size npage. +! next(I) is the next page with same hash code +! or zero for last in list. Otherwise undefined. + + integer :: nfiles ! Number of file indices in use. + + integer(long) :: nrec ! Number of records in each file. + + integer, allocatable :: nextfile(:) ! of size maxfiles. Used for the +! linked list of free file indices and linked lists of indices of +! files in a superfile. nextfile(I) is the next file index in +! its list or zero if there are none. + + integer(long), allocatable :: older(:) ! of size npage. older(I) is the +! next older page to page I, or the youngest page if I is oldest. + + integer(long), allocatable :: page(:) ! of size npage. page(I) is the +! file address (page number) of page I in the buffer. + + integer(long), allocatable :: page_list(:) ! of size npage. +! list of pages for this read or write +! that were in the buffer at the time of call. + + character(maxpath), allocatable :: path(:) +! The paths given to OF01_initialize + + integer(long), allocatable :: prev(:) ! of size npage. prev(I) is the +! previous page with same hash code or -(hash code) +! for first in list. Otherwise undefined. + + integer, allocatable :: unit(:) ! of size maxfiles. unit(I) holds the +! unit for file I or zero if not in use. + + integer(long), allocatable :: younger(:) ! of size npage. +! younger(I) is the next younger page to page I, or +! the oldest page if I is the youngest. + + integer :: youngest ! most recently referenced page in the buffer + + end type of01_data_private + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + type of01_data + + integer :: entry = 0 ! Index of the entry to the package. + + integer :: iostat ! Fortran iostat parameter. + integer :: lpage ! length of each page of the buffer, that is, the +! number of scalar variables in each page. The default is 1024. + + integer(long) :: ncall_read ! number of calls to OF01_read. + + integer(long) :: ncall_write ! number of calls to OF01_write. + + integer(long) :: nio_read ! number of records read by +! OF01_read and OF01_write. + + integer(long) :: nio_write ! number of records written by +! OF01_read and OF01_write. + + integer(long) :: npage ! number of pages in the in-core buffer. +! The default value is 20. It is a long integer, but +! we do not anticipate it being very large. + + integer(long) :: file_size ! target length of each file. +! The default value is default_file_size. + + integer(long) :: nwd_read ! number of scalars read by OF01_read. + + integer(long) :: nwd_write ! number of scalars written by OF01_write. + + type (of01_data_private) :: private +! In Fortran 2003, this should be +! type (of01_data_private), private :: private + + integer :: stat ! Fortran stat parameter. + + end type of01_data + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + interface of01_initialize + module procedure of01_initialize_integer + end interface + interface of01_open + module procedure of01_open_integer + end interface + interface of01_close + module procedure of01_close_integer + end interface + interface of01_read + module procedure of01_read_integer + end interface + interface of01_write + module procedure of01_write_integer + end interface + interface of01_end + module procedure of01_end_integer + end interface + +contains + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + subroutine of01_initialize_integer(iflag,data,path,file_size,lpage,npage,lp) + +! This subroutine must be called once to initialize +! a structure of derived type of01_data +! and to allocate and initialize its array components. + + integer, intent (out) :: iflag ! Value 0 on successful return. +! The only possible negative values are: +! -1 Allocation error. The STAT parameter returned in data%stat. +! -8 Deallocation error. The STAT parameter returned in data%stat. +! -16 Character length of path too great. + + type (of01_data) , intent (inout) :: data + + character(*), optional, intent (in) :: path(:) ! Paths for the files. +! If absent, (\ '' \) is used. + + integer(long), optional, intent (in) :: file_size ! If present and positive, +! the target length of a file. Default value +! used if absent or present and not positive. + + integer, optional, intent (in) :: lpage ! If present and positive, the +! size of each page in the buffer. Default value used +! if absent or present and not positive. + + integer, optional, intent (in) :: npage ! If present and positive, the +! number of pages in the buffer. Default value used +! if absent or present and not positive. + + integer, optional, intent (in) :: lp ! If present and not negative, the +! unit number for diagnostic messages. 6 is +! used if absent or present and negative. + +! local variables + integer :: i ! do loop variable + integer :: size_path ! size of array path + +!!!!!!!!!!!!!!!!!!!!!!! +! Initialise + iflag = 0 + data%entry = 1 + data%ncall_read = 0 + data%ncall_write = 0 + data%nio_read = 0 + data%nio_write = 0 + data%nwd_read = 0 + data%nwd_write = 0 + +! If napge/lpage supplied, use instead of the default values + data%npage = default_npage + if (present(npage)) then + if (npage < 1) then + iflag = -2; call print_iflag(data,iflag,lp); return + end if + data%npage = npage + end if + + data%lpage = default_lpage + if (present(lpage)) then + if (lpage < 1) then + iflag = -2; call print_iflag(data,iflag,lp); return + end if + data%lpage = lpage + end if + +! Find record length + if (allocated(data%private%buffer)) then + deallocate (data%private%buffer,stat=data%stat) + end if + allocate (data%private%buffer(data%lpage,1),stat=data%stat) + if ( data%stat /= 0) then + iflag = -1; call print_iflag(data,iflag,lp); return + end if + data%private%buffer(:,1) = 0 + inquire (iolength=data%private%iolength) data%private%buffer(:,1) + deallocate (data%private%buffer,stat=data%stat) + if ( data%stat /= 0) then + iflag = -8; call print_iflag(data,iflag,lp); return + end if + + size_path = 1 + if (present(path)) then + size_path = size(path) + if (len(path)>maxpath) then + iflag = -16; call print_iflag(data,iflag,lp); return + end if + end if + + data%file_size = default_file_size + if (present(file_size)) then + if (file_size < data%lpage) then + iflag = -2; call print_iflag(data,iflag,lp); return + end if + data%file_size = file_size + end if + data%private%nrec = data%file_size/data%lpage + data%file_size = data%private%nrec*data%lpage + +! Allocate private arrays + if ( allocated(data%private%highest)) then + deallocate (data%private%highest, data%private%nextfile, & + data%private%index, data%private%older, & + data%private%younger, data%private%differs, & + data%private%prev, data%private%next, & + data%private%first, data%private%page, & + data%private%page_list, data%private%unit, & + data%private%path, data%private%name, & + data%private%left, data%private%right, & + data%private%filename, stat=data%stat) + if (data%stat /= 0) then + iflag = -8; call print_iflag(data,iflag,lp); return + end if + end if + data%private%maxfiles = default_maxfiles + allocate (data%private%highest(data%private%maxfiles), & + data%private%nextfile(data%private%maxfiles), & + data%private%index(1:data%npage), & + data%private%older(1:data%npage), & + data%private%younger(1:data%npage), & + data%private%differs(1:data%npage), & + data%private%prev(1:data%npage), & + data%private%next(1:data%npage), & + data%private%first(1:data%npage), & + data%private%page(1:data%npage), & + data%private%page_list(1:data%npage), & + data%private%unit(data%private%maxfiles), & + data%private%path(size_path), & + data%private%name(data%private%maxfiles), & + data%private%left(data%private%maxfiles), & + data%private%right(data%private%maxfiles), & + data%private%filename(nsup), & + data%private%buffer(data%lpage,data%npage), stat=data%stat) + if (data%stat /= 0) then + data%private%maxfiles = 0 + iflag = -1; call print_iflag(data,iflag,lp); return + end if + +! Initialise arrays + data%private%free = 0 + data%private%nfiles = 0 + data%private%filename(:) = '' + do i = 1, data%npage + data%private%index(i) = -1 + data%private%older(i) = i + 1 + data%private%younger(i) = i - 1 + data%private%page(i) = 0 + data%private%first(i) = 0 + data%private%next(i) = 0 + data%private%prev(i) = 0 + data%private%differs(i) = .false. + end do + data%private%youngest = 1 + data%private%younger(1) = data%npage + data%private%older(data%npage) = 1 + if (present(path)) then + data%private%path(:) = path(:) + else + data%private%path(:) = (/ '' /) + end if + data%private%name(:) = 0 + data%private%buffer(:,1) = 0 + + end subroutine of01_initialize_integer + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + subroutine of01_open_integer(filename,ifile,iflag,data,lenw,lp) + +! This subroutine must be called for each superfile that is to be +! accessed through HSL_OF01. It gives the superfile an index and opens +! its files. + + character(len=*), intent (in) :: filename ! Name of the superfile. + + integer, intent (out) :: ifile ! Index of the superfile. + + integer, intent (out) :: iflag ! Value 0 on successful return. +! A negative value is associated with an error message +! on unit lp. Possible negative values are: +! -1 Allocation error. The STAT parameter returned in data%stat. +! -5 Error in inquire statement. +! -7 Error in open statement. +! -8 Deallocation error. The STAT parameterreturned in data%stat. +! -11 lenw > 0, but not enough files exist. +! -12 File filename already exists, but lenw is not present +! or lenw <= 0. +! -13 filename is too long. +! -17 open unsuccessful for all elements of path. + + type (of01_data), intent (inout) :: data + + integer(long), optional, intent (in) :: lenw ! length in pages of the +! part of the file that has been written and is not +! regarded as having been overwritten by zeros. +! Pages beyond this are regarded as containing zeros. +! If not present or lenw <= 0, a new file is opened. + + integer, optional, intent (in) :: lp ! unit number for diagnostic messages. +! If not present or equal to the unit number of a file +! that has already been opened for data, 6 is used. +! If lp < 0, messages are suppressed. + +! Local variables + character(10) :: ci ! Filename extension + integer :: i ! do loop variable + integer :: k ! number of secondary files + integer :: l ! file index + integer(long) :: lenw_copy ! no. of pages in the virtual array + integer :: nout ! unit for error messages + integer :: m ! Previous file index in linked list + character(maxname), allocatable :: temp(:) + + iflag = 0 + nout = 6 + if (present(lp)) nout = lp + data%entry = 2 + + if (len(filename) > maxname) then + iflag = -13; go to 100 + end if + +! Find the length of the virtual array + lenw_copy = 0 + if (present(lenw)) lenw_copy = max(0_long,lenw) + +! Find number of secondary files + k = max(0_long,(lenw_copy-1)/data%private%nrec) + +! Find suitable indices and units for all the files and open them + m = 0 + ci='' + do i = 0,k + if (lenw_copy > 0) then + call open_old (data,l,trim(filename)//adjustl(ci),iflag) + else + call open_new (data,l,trim(filename)//adjustl(ci),iflag) + end if + if (iflag /= 0) go to 100 + if (i==0) ifile = l + data%private%highest(l) = max(0_long,lenw_copy) + data%private%left(l) = 1 + data%private%right(l) = 0 + if (m > 0) data%private%nextfile(m) = l + m = l + data%private%highest(l) = lenw_copy + write(ci,'(i5)') i + 1 + end do + +! Look for a place and store filename there + k = size(data%private%filename) + do i = 1, k + if (data%private%filename(i)== '') then + data%private%filename(i) = filename + data%private%name(ifile) = i + return + end if + end do +! Increase size of data%private%filename + allocate(temp(k),stat=data%stat) + if (data%stat /= 0) then + iflag = -1; go to 100 + end if + temp(:) = data%private%filename(:) + deallocate(data%private%filename,stat=data%stat) + if (data%stat /= 0) then + iflag = -8; go to 100 + end if + allocate(data%private%filename(2*k),stat=data%stat) + if (data%stat /= 0) then + iflag = -1; go to 100 + end if + data%private%filename(1:k) = temp(:) + data%private%filename(k+1:) = '' + deallocate(temp,stat=data%stat) + if (data%stat /= 0) then + iflag = -8; go to 100 + end if +! Store filename + data%private%filename(k+1) = filename + data%private%name(ifile) = k+1 + return + +100 call print_iflag(data,iflag,lp) + + end subroutine of01_open_integer + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + subroutine of01_read_integer & + (ifile,loc,n,read_array,iflag,data,lp,map,discard) + +! This subroutine performs the read from a superfile. + + integer, intent (in) :: ifile ! index of the superfile. + + integer(long), intent (in) :: loc ! Start position in virtual array. + + integer, intent (in) :: n ! Number of entries to be read. + + integer(wp), intent (inout) :: read_array(*) +! Array into which data from the file is read. +! If map is present, file data is added into it thus: +! read_array(map) = read_array(map) + file_data(1:n) + + integer, intent (out) :: iflag ! Successful return indicated by iflag = 0. +! Negative value associated with an error message which +! is output on unit lp. Possible negative values: +! -3 loc is not positive. +! -4 Attempt to access a file that is not open. +! -5 Error in Fortran INQUIRE. The IOSTAT parameter is returned in +! data%iostat. +! -6 Error in Fortran READ. The IOSTAT parameter is returned in +! data%iostat. +! -7 Error in Fortran OPEN statement. The IOSTAT parameter +! is returned in data%iostat. +! -9 ifile out of range. +! -15 Error in Fortran WRITE. The IOSTAT parameter +! is returned in data%iostat. + + type (of01_data), intent (inout) :: data + + integer, optional, intent (in) :: lp ! unit number for diagnostic messages. +! Negative for no messages. If not present or equal to unit +! number of a file that has already been opened for data, 6 is used. + + integer, optional, intent (in) :: map(n) ! map array. + + logical, optional, intent (in) :: discard ! Whether data is to be discarded. + +! Local variables + integer(long) :: first_page ! first page number required. + integer(long) :: first_pos ! position within first page of first value +! required. + integer(long) :: left,right ! Range of discarded entries + integer(long) :: ip ! page number on file of the current page. + integer(long) :: ipw ! Position in list in page_list(:) of the buffer +! pages that have been accessed. + integer(long) :: jh ! temporary variable used to hold a hash code. + integer(long) :: jp ! page number in the buffer of the required page. + integer :: jfile ! file associated with a page in the buffer + integer(long) :: l ! temporary variable. + integer(long) :: last_page ! last page number required. + integer(long) :: last_pos ! position within last page of last value +! required. + integer(long) :: lenl ! length of list in page_list(:) of accessed pages + integer :: lpage ! page length. + integer(long) :: m ! temporary variable. + logical :: my_discard ! Whether the data is to be discarded. + +!!!!!!!!!!!!!!!!!!!!!!!!!!!! + iflag = 0 + if (n <= 0) return + data%entry = 3 + +! Check for errors in incoming data + if (ifile < 1) then + iflag = -9; go to 200 + else if (ifile > data%private%nfiles) then + iflag = -4; go to 200 + else if (data%private%highest(ifile) < 0) then + iflag = -4; go to 200 + else if (loc <= 0) then + iflag = -3; go to 200 + end if + + my_discard = .false. + if (present(discard)) then + if (discard) then + my_discard = .true. + left = loc + right = loc+n-1 + if (loc == data%private%right(ifile)+1) then + left = data%private%left(ifile) + else if (loc+n == data%private%left(ifile)) then + right = data%private%right(ifile) + end if + data%private%left(ifile) = left + data%private%right(ifile) = right + end if + end if + +! lpage is the length of a page (= length of a record in the file) + lpage = data%lpage + +! first_page and last_page are first and last page numbers required. + first_page = 1 + (loc-1)/lpage + last_page = 1 + (loc+(n-1)-1)/lpage + +! first_pos and last_pos are positions within first and +! last pages of first and last values required. + first_pos = loc - (first_page-1)*lpage + last_pos = loc + n - 1 - (last_page-1)*lpage + + data%ncall_read = data%ncall_read + 1 + data%nwd_read = data%nwd_read + n + + lenl = 0 +! Look for required pages that are in the buffer + look1: do ip = first_page, last_page + +! See if the page requested is the youngest + jp = data%private%youngest + if (data%private%page(jp) == ip) then + if (data%private%index(jp) == ifile) then +! Special code for when the youngest page is wanted + lenl = lenl + 1 + data%private%page_list(lenl) = ip + go to 10 + end if + end if +! Find hash code for page ip in file ifile. + jh = 1 + mod(ip+ifile*ihash,data%npage) +! first(jh) is the first page with hash code jh or 0 if there are none + jp = data%private%first(jh) + do l = 1, data%npage+1 + if (jp == 0) cycle look1 +! data%private%index(jp) holds the index of the (super)file +! associated with page jp in the buffer + jfile = data%private%index(jp) + if (jfile == ifile) then +! data%private%page(jp) is record (page) index in file of page jp in buffer + if (data%private%page(jp) == ip) exit + end if + jp = data%private%next(jp) + end do +! page ip found as page jp in buffer + lenl = lenl + 1 + data%private%page_list(lenl) = ip +! remove page from its present position + l = data%private%younger(jp) + m = data%private%older(jp) + data%private%older(l) = m + data%private%younger(m) = l +! insert page as youngest + l = data%private%younger(data%private%youngest) + data%private%older(l) = jp + data%private%younger(jp) = l + data%private%older(jp) = data%private%youngest + data%private%younger(data%private%youngest) = jp + data%private%youngest = jp +10 call read_from_buffer + if (my_discard) then + if ((ip-1)*lpage+1 >= left .and. ip*lpage+1 <= right ) & + data%private%differs(jp) = .false. + end if + end do look1 + +! look for pages not yet treated and treat each of them + ipw = 1 + look2: do ip = first_page, last_page + if ( ipw.le.lenl) then + if (data%private%page_list(ipw) == ip) then + ipw = ipw+1 + cycle + end if + end if +! the oldest page is overwritten and becomes the youngest + jp = data%private%younger(data%private%youngest) + data%private%youngest = jp + +! data%private%index(jp) contains index of (super)file associated +! with page jp + jfile = data%private%index(jp) + if (jfile>=0) then +! write page from buffer to record page(jp) in the file +! if it has been altered (ie if differs(,jp) is set to 1). + if (data%private%differs(jp)) call page_write(data, & + data%private%buffer(:,jp),jfile,data%private%page(jp),iflag) + if (iflag /= 0) go to 200 + +! remove page from hash list +! prev(jp) is the last page with same hash code ( or -hash code +! for the first in the list) + l = data%private%prev(jp) +! next(jp) is next page with same hash code, or 0 if last in list + m = data%private%next(jp) + if (m > 0) data%private%prev(m) = l + if (l > 0) then + data%private%next(l) = m + else if (l < 0) then + l = -l + data%private%first(l) = m + end if + end if + +! Read from file record ip into page jp of buffer +! Check whether read extends beyond +! where file written. If it does, fill buffer with zeros and return + if (ip > data%private%highest(ifile)) then + data%private%buffer(:,jp) = zero + else + call page_read(data,data%private%buffer(:,jp),ifile,ip, & + iflag) + if (iflag /= 0) go to 200 + end if +! add to hash list + jh = 1 + mod(ip+ifile*ihash,data%npage) + m = data%private%first(jh) + data%private%next(jp) = m + if (m > 0) data%private%prev(m) = jp + data%private%first(jh) = jp + data%private%prev(jp) = -jh +! revise rest of page table + data%private%index(jp) = ifile + data%private%page(jp) = ip + data%private%differs(jp) = .false. + +! perform actual transfer to read_array from buf + call read_from_buffer + + end do look2 +! call buffer + return + +200 call print_iflag(data,iflag,lp) + + contains + + subroutine buffer + integer i + i = data%private%youngest + write(*,'(a)') ' file page' + do + if(data%private%index(i)>0) & + write(*,'(2i5)') data%private%index(i), data%private%page(i) + i = data%private%older(i) + if (i == data%private%youngest)exit + end do + end subroutine buffer + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + subroutine read_from_buffer + + integer :: l1,l2 ! Temporaries +! Read page jp of the buffer (page ip of the virtual array) or part thereof. + l2 = lpage + l1 = 1 + if (ip == first_page) then + l1 = first_pos + m = 1 + else + m = (ip-first_page)*lpage+2-first_pos + end if + if (ip == last_page) l2 = last_pos + if (.not. present(map)) then + call FVM_icopy(l2-l1+1,data%private%buffer(l1,jp),read_array(m)) + else + call of01_mcopy(l2-l1+1,data%private%buffer(l1,jp),read_array,map(m)) + end if + end subroutine read_from_buffer + + end subroutine of01_read_integer + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + subroutine of01_write_integer & + (ifile,loc,n,write_array,iflag,data,lp,inactive) + +! This subroutine performs the writing to a superfile. + + integer, intent (in) :: ifile ! Index of the (super)file. + + integer(long), intent (in) :: loc ! Start position in virtual array. + + integer, intent (in) :: n ! Number of entries to be written. + + integer(wp), intent (in) :: write_array(*) ! array from which data +! is written to the file. + integer, intent (out) :: iflag ! Successful return indicated by iflag = 0. +! Negative value associated with an error message which +! is output on unit lp. Possible negative values: +! -3 loc is not positive. +! -4 Attempt to access a file that is not OF01_open. +! -5 Error in INQUIRE. The IOSTAT value +! is returned in data%iostat. +! -9 ifile out of range. +! -15 Error in Fortran WRITE. The IOSTAT parameter +! is returned in data%iostat. +! -17 open unsuccessful for all elements of path. + + type (of01_data), intent (inout) :: data + + integer, optional, intent (in) :: lp ! unit number for diagnostic messages. +! Negative for no messages. +! If not present or equal to the unit number of a file +! that has already been opened for data, 6 is used. + + integer(long), optional, intent (in) :: inactive ! If present, it is +! assumed that the data transferred are unlikely to be needed before +! other data in the buffer. If inactive data%private%nfiles) then + iflag = -4; go to 300 + else if (data%private%highest(ifile) < 0) then + iflag = -4; go to 300 + else if (loc <= 0) then + iflag = -3; go to 300 + end if + +! lpage is the length of a page (= length of a record in the file) + lpage = data%lpage + +! first_page and last_page are first and last page numbers required. + first_page = 1 + (loc-1)/lpage + last_page = 1 + (loc+(n-1)-1)/lpage + + if (present(inactive)) then + if (first_page==last_page) then + inactive_first = .false. + else + inactive_first = inactive<=1+(first_page-1)*lpage + inactive_middle = .true. + inactive_last = inactive>=last_page*lpage + end if + else + inactive_middle = .false. + inactive_first = .false. + inactive_last = .false. + end if + +! If there is any overlap with the range of discarded entries, +! reset the range to be null + if (loc>data%private%right(ifile)) then + else if (loc+n-1= 0) then +! write page from buffer to record page(jp) in the file +! if it has been altered. + if (data%private%differs(jp)) call page_write(data, & + data%private%buffer(:,jp),jfile,data%private%page(jp),iflag) + if (iflag /= 0) go to 300 + +! remove page from hash list +! prev(jp) is the last page with same hash code ( or -hash code +! for the first in the list) + l = data%private%prev(jp) +! next(jp) is next page with same hash code, or 0 if last in list + m = data%private%next(jp) + if (m > 0) data%private%prev(m) = l + if (l > 0) then + data%private%next(l) = m + else if (l < 0) then + l = -l + data%private%first(l) = m + end if + end if + +! Read from file record ip into page jp of buffer +! Check whether read extends beyond +! where file written. If it does, fill buffer with zeros and return + if (ip>data%private%highest(ifile)) then + data%private%buffer(:,jp) = zero + else + call page_read(data,data%private%buffer(:,jp),ifile,ip, & + iflag) + if (iflag /= 0) go to 300 + end if +! add to hash list + jh = 1 + mod(ip+ifile*ihash,data%npage) + m = data%private%first(jh) + data%private%next(jp) = m + if (m>0) data%private%prev(m) = jp + data%private%first(jh) = jp + data%private%prev(jp) = -jh +! revise rest of page table + data%private%index(jp) = ifile + data%private%page(jp) = ip + data%private%differs(jp) = .true. + +! perform actual transfer to write_array from buf + call write_to_buffer + + end do look2 +! call buffer + return + +300 call print_iflag(data,iflag,lp) + + contains + + subroutine buffer + integer i + i = data%private%youngest + write(*,'(a)') ' file page' + do + if(data%private%index(i)>0) & + write(*,'(2i5)') data%private%index(i), data%private%page(i) + i = data%private%older(i) + if (i == data%private%youngest)exit + end do + end subroutine buffer + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + subroutine write_to_buffer + + integer :: l1,l2 ! Temporaries + +! Write page jp of the buffer (page ip of the virtual array) or part thereof. + l2 = lpage + l1 = 1 + if (ip == first_page) then + l1 = first_pos + m = 1 + else + m = (ip-first_page)*lpage+2-first_pos + end if + if (ip==last_page) l2 = last_pos + call FVM_icopy(l2-l1+1,write_array(m),data%private%buffer(l1,jp)) + data%private%differs(jp) = .true. + + end subroutine write_to_buffer + end subroutine of01_write_integer + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + subroutine of01_close_integer(ifile,lenw,num_file,iflag,data,lp,lkeep) + +! This subroutine should be called when a superfile is finished with. +! Its data in the buffer are unloaded. + + integer, intent (in) :: ifile ! index of the superfile. + + integer(long), intent (out) :: lenw ! length in pages of the part of +! the file that has been written. + integer, intent (out) :: num_file ! total number of additional files +! that have been opened. They are named +! filenamej, j = 1, ..., num_file. + integer, intent (out) :: iflag ! iflag = 0 for a successful return. +! A negative value is associated with an error +! message on unit lp. Possible negative values: +! -4 Attempt to access a file that is not OF01_open. +! -5 Error in INQUIRE. IOSTAT value is returned in data%iostat. +! -9 ifile out of range. +! -14 Error in CLOSE statement. The IOSTAT value +! is returned in data%iostat. +! -15 Error in WRITE. The IOSTAT value +! is returned in data%iostat. +! -17 open unsuccessful for all elements of path. + + type (of01_data), intent (inout) :: data + + integer, optional, intent (in) :: lp ! If present, lp must hold the unit +! for diagnostic messages. Otherwise, lp = 6 used. +! If lp < 0 , messages are suppressed. + + logical, optional, intent (in) :: lkeep ! If present and set to .FALSE., +! the files are deleted on being closed. +! Otherwise, the files are kept. + +! Local variables + integer(long) :: i ! do loop variable + integer :: j ! do loop variable + integer :: jfile ! index of a file + integer(long) :: l ! page number + integer :: lpage ! length of each page (= data%lpage) + integer(long) :: m ! page number + integer(long) :: oldest ! oldest page + integer(long) :: oldest2 ! second oldest page + character (maxlen) name ! File name + character(len=6) :: status ! File status on closing + +!!!!!!!!!!!!!!!!!!! + iflag = 0 + data%entry = 5 +! Check for errors + if (ifile < 1) then + iflag = -9; go to 400 + else if (ifile > data%private%nfiles) then + iflag = -4; go to 400 + else if (data%private%highest(ifile) < 0) then + iflag = -4; go to 400 + end if + + status = 'keep' + if (present(lkeep)) then + if (.not. lkeep) status = 'delete' + end if + +! search the pages of the buffer dealing with those associated +! with ifile. + search:do i = 1, data%npage +! data%private%index(i) is index of the (super)file associated +! with page i of buffer + if (ifile /= data%private%index(i)) cycle + data%private%index(i) = -1 + if (data%private%differs(i)) then +! File version of page i is not the same as the buffer version so +! write page i to file + data%private%differs(i) = .false. + lpage = data%lpage + if (status == 'keep') then + call page_write(data, & + data%private%buffer(:,i),ifile,data%private%page(i),iflag) + if (iflag /= 0) then + call print_iflag(data,iflag,lp) + return + end if + end if + end if + +! remove page from hash list + l = data%private%prev(i) ! Previous + m = data%private%next(i) ! Next + if (m>0) data%private%prev(m) = l + if (l>0) then + data%private%next(l) = m + else if (l < 0) then + l = -l ! i is first in the list with code l + data%private%first(l) = m + end if + +! youngest is the most recently referenced page in the buffer. +! younger(youngest) is the oldest page in the buffer. + oldest = data%private%younger(data%private%youngest) +! if page i is not already the oldest, make it so. + if (oldest==i) cycle +! remove page from its present position + l = data%private%younger(i) + m = data%private%older(i) +! l is next youngest to page I and m is the next oldest + data%private%older(l) = m + data%private%younger(m) = l + +! insert page i as the oldest page +! older(oldest) is the youngest page + data%private%youngest = data%private%older(oldest) + +! Page i becomes the oldest page. The page that was the oldest +! becomes the second (ie next) oldest page + oldest2 = oldest + oldest = i + data%private%older(oldest2) = oldest + data%private%younger(oldest) = oldest2 + data%private%older(oldest) = data%private%youngest + data%private%younger(data%private%youngest) = oldest + end do search + + lenw = data%private%highest(ifile) + if (lenw <= 0 ) status = 'delete' + num_file = (lenw-1)/data%private%nrec + +! remove file from list of declared files. +! close files + inquire(unit=data%private%unit(ifile),name=name,iostat=data%iostat) + if ( data%iostat /= 0) then + iflag = -5; go to 400 + end if + close (unit=data%private%unit(ifile),status=status,iostat=data%iostat) + if ( data%iostat /= 0) then + iflag = -14; go to 400 + end if + data%private%unit(ifile) = 0 + data%private%highest(ifile) = -1 + jfile = ifile + if (num_file > 0) then + do j = 1, num_file + m = data%private%nextfile(jfile) + inquire(unit=data%private%unit(m),name=name,iostat=data%iostat) + if ( data%iostat /= 0) then + iflag = -5; go to 400 + end if + close (unit=data%private%unit(m),status=status,iostat=data%iostat) + if ( data%iostat /= 0) then + iflag = -14; go to 400 + end if + data%private%unit(m) = 0 + data%private%highest(m) = -1 + jfile = m + end do + end if +! Put the freed indices at the front of the list list of free indices + data%private%nextfile(jfile) = data%private%free + data%private%free = ifile + +! Clear the name for reuse + data%private%filename(data%private%name(ifile))='' + + return + +400 call print_iflag(data,iflag,lp) + + end subroutine of01_close_integer + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + subroutine of01_end_integer(iflag,data,lp) + +! This subroutine deallocates the private array components of data. + + integer, intent (out) :: iflag +! 0 successful return. +! -8 Error in Fortran DEALLOCATE statement. The STAT +! value is returned in data%stat. +! -10 of01_close has not been called for a superfile. + + type (of01_data), intent (inout) :: data + + integer, optional, intent (in) :: lp ! If present, lp must hold the unit +! for diagnostic messages. Otherwise, lp = 6 used. +! If lp < 0, messages are suppressed. + +! Local variables + integer :: i + +!!!!!!!!!!!!!!!!!!! + iflag = 0 + data%entry = 6 + + do i = 1, data%private%nfiles + if (data%private%highest(i) >= 0) then + iflag = -10; call print_iflag(data,iflag,lp) + return + end if + end do + +! Deallocate arrays + if ( allocated(data%private%highest)) then + deallocate (data%private%highest, data%private%nextfile, & + data%private%index, data%private%older, & + data%private%younger, data%private%differs, & + data%private%prev, data%private%next, & + data%private%first, data%private%page, & + data%private%page_list, data%private%unit, & + data%private%buffer, data%private%path, & + data%private%left, data%private%right, & + data%private%name, data%private%filename, & + stat=data%stat) + data%private%maxfiles = 0 + if (data%stat /= 0) then + iflag = -8; call print_iflag(data,iflag,lp) + end if + end if + + end subroutine of01_end_integer + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + subroutine page_write(data,buffer,ifile,locp,iflag) + +! This subroutine transfers a page of the buffer to a file. If the +! page is within the existing virtual array then a simple write +! is performed. To write a page beyond the present end may require +! writing pages full of zeros in front of its position. + + type (of01_data), intent (inout) :: data + + integer(wp), intent (inout) :: buffer(data%lpage) ! array from which +! the transfer is made. + integer, intent (in) :: ifile ! the index of the primary file. + + integer(long), intent (in) :: locp ! page number in the file. + + integer, intent (out) :: iflag ! error flag. Possible negative values: +! -5 Error in INQUIRE. IOSTAT value is returned in data%iostat. +! -7 Error in OPEN. IOSTAT valueis returned in data%iostat. +! -15 Error in WRITE. IOSTAT value is returned in data%iostat. + +! Local variables + integer(long) :: hpage ! highest page read or written for ifile + integer(long) :: l ! do loop variable + + hpage = data%private%highest(ifile) + if (locp <= hpage+1) then +! Write straight to file + call actual_page_write(locp) + if (iflag /= 0) return + else +! Fill the gap with zero page +! first write out buffer to page hpage+1 + call actual_page_write(hpage+1) + if (iflag /= 0) return + buffer(:) = zero +! write pages of zeros + do l = hpage+2, locp-1 + call actual_page_write(l) + if (iflag /= 0) return + end do +! read buffer back in from page hpage+1 + call page_read(data,buffer,ifile,hpage+1,iflag) + if (iflag /= 0) return +! Now write buffer to the required location + call actual_page_write(locp) + if (iflag /= 0) return +! Finally write zeros to hpage+1 + buffer(:) = zero + call actual_page_write(hpage+1) + if (iflag /= 0) return + end if + + contains +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + subroutine actual_page_write(locp) + +! Perform an actual i/o write of a page to a superfile. If necessary, open +! intermediate secondary files. + + integer(long), intent (in) :: locp ! page index in the superfile. + +! Local variables + character(10) :: ci ! Filename extension. + integer(long) :: new_locp ! page index in the file that is read. + integer i ! Do index. + integer k ! 0 for primary file or >0 for k-th secondary file. + integer l ! index of the file that is written. + integer m ! Previous file in linked list. + character(len=maxlen) :: filename ! name of the primary file. + + iflag = 0 + k = (locp-1)/data%private%nrec + new_locp = locp - k*data%private%nrec + l = ifile + do i = 1, k + m = l + l = data%private%nextfile(l) + if (l == 0) then +! open new file (filename1, filename2, etc) + filename = data%private%filename(data%private%name(ifile)) + write(ci,'(i5)')i + call open_new (data,l,trim(filename)//adjustl(ci),iflag) + if (iflag /= 0) return + +! Add to linked list for ifile + if (m > 0) data%private%nextfile(m) = l + m = l + end if + end do + + data%nio_write = data%nio_write + 1 + write (unit=data%private%unit(l),rec=new_locp,iostat=data%iostat) buffer +! write(*,*) 'write record',new_locp,data%iostat + if (data%iostat /= 0) then + iflag = -15; return + end if + data%private%highest(ifile) = max(data%private%highest(ifile),locp) + + end subroutine actual_page_write + + end subroutine page_write + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + subroutine page_read(data,buffer,ifile,locp,iflag) + +! This subroutine performs an actual i/o read of a page from a superfile + + type (of01_data), intent (inout) :: data + + integer(wp), intent (out) :: buffer(data%lpage) ! array to receive page. + + integer, intent (in) :: ifile ! index of the superfile. + + integer(long), intent (in) :: locp ! page index in the superfile. + + integer, intent (out) :: iflag ! Error flag. Possible negative value: +! -6 error in read statement + +! Local variables + integer(long) :: new_locp ! page index in the file that is read. + integer i ! Do index. + integer k ! 0 for primary file or > 0 for k-th secondary file. + integer l ! index of the file that is read. + +!!!!!!!!!!!!!!!!!!!!!!!!!! + iflag = 0 + k = (locp-1)/data%private%nrec + new_locp = locp - k*data%private%nrec + +! Find index of the kth linked file + l = ifile + do i = 1, k + l = data%private%nextfile(l) + end do + + data%nio_read = data%nio_read + 1 + read (unit=data%private%unit(l),rec=new_locp,iostat=data%iostat) buffer + if (data%iostat /= 0) iflag = -6 + + end subroutine page_read + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + subroutine open_new (data,ifile,filename,iflag) + +! Open a new file + + type (of01_data) :: data + + integer, intent(out) :: ifile ! File index. + + character (*) :: filename! ! File name. + + integer, intent (inout) :: iflag ! Error flag. Possible nonzero value: +! -7 Error in OPEN. The IOSTAT value is returned in data%iostat. + +! Local variables + logical :: ex ! exist variable for inquire. + integer :: i ! Do index. + integer :: j ! Do index. + integer :: unit ! Unit. + logical :: open ! open variable for inquire. + +! Check file does not already exist + do i = 1, size(data%private%path) + inquire (file=trim(data%private%path(i))//filename,exist=ex,& + iostat=data%iostat) + if (data%iostat /= 0) then + iflag = -5; return + else if (ex) then + iflag = -12; data%iostat=i; return + end if + end do + + call find_unit(data,unit,ifile,iflag) + if (iflag /= 0) return + +! Open the file on the first available path + outer: do i = 1, size(data%private%path) + open (unit,file=trim(data%private%path(i))//filename, & + access='direct',iostat=data%iostat,recl=data%private%iolength) + if (data%iostat /= 0) then + close(unit,iostat=data%iostat,status='delete') + cycle + end if + + if (size(data%private%path) == 1) return +! Check that there is room for the file + do j = 1, data%private%nrec + write(unit,rec=j,iostat=data%iostat)data%private%buffer(:,1) + if (data%iostat /= 0) then + close(unit,iostat=data%iostat,status='delete') + cycle outer + end if + end do + close(unit,iostat=data%iostat) + if (data%iostat /= 0) then + inquire(unit,opened=open) + if (.not.open) & + open (unit,file=trim(data%private%path(i))//filename, & + access='direct',iostat=data%iostat,recl=data%private%iolength) + close(unit,iostat=data%iostat,status='delete') + cycle outer + end if + open (unit,file=trim(data%private%path(i))//filename, & + access='direct',iostat=data%iostat,recl=data%private%iolength) + return + end do outer + iflag = -17 + + end subroutine open_new + + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + subroutine open_old (data,ifile,filename,iflag) + +! Open an old file. + + type (of01_data) :: data + + integer, intent(out) :: ifile ! File index. + character (*) :: filename ! File name. + + integer, intent (inout) :: iflag ! Possible nonzero values: +! -5 Error in inquire statement +! -7 Error in OPEN. The IOSTAT value is returned in data%iostat. +! -11 File does not exist + +! Local variables + logical :: ex ! exist variable for inquire. + integer :: i ! Do index. + integer :: unit ! Unit. + +! Find the file. + do i = 1, size(data%private%path) + inquire (file=trim(data%private%path(i))//filename,exist=ex,& + iostat=data%iostat) + if (data%stat /= 0) then + iflag = -5; return + end if + if (ex) exit + end do + if (.not. ex) then +! File not found + iflag = -11; return + end if + + call find_unit(data,unit,ifile,iflag) + if (iflag /= 0) return + + open (unit,file=trim(data%private%path(i))//filename, access='direct', & + iostat=data%iostat, recl=data%private%iolength) + if (data%iostat /= 0) then + iflag = -7; return + end if + + end subroutine open_old + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + subroutine find_unit(data,unit,ifile,iflag) + +! Find a free unit and a free file index. + + type (of01_data) :: data + integer, intent (out) :: unit ! Free unit. + + integer, intent (out) :: ifile ! Free file. + + integer, intent (inout) :: iflag ! Possible nonzero value: +! -5 Error in INQUIRE. The IOSTAT value is returned in data%iostat. + +! Local variables + logical :: open + integer :: oldsize + +! Find free unit + do unit = 12, huge(0) + inquire (unit=unit,iostat=data%iostat,opened=open) + if (data%iostat /= 0) then +! Error in inquire + ifile = -1 + iflag = -5; return + end if + if (.not. open) exit + end do + +! Find free file index + ifile = data%private%free + if (ifile > 0) then + data%private%free = data%private%nextfile(ifile) + else + ifile = data%private%nfiles+1 + if (ifile>data%private%maxfiles) then +! Reallocate files + data%private%maxfiles = 0 + call reallocate_long(data%private%highest) + if (iflag < 0) return + call reallocate_long(data%private%left) + if (iflag < 0) return + call reallocate_long(data%private%right) + if (iflag < 0) return + call reallocate(data%private%nextfile) + if (iflag < 0) return + oldsize = size(data%private%name) + call reallocate(data%private%name) + data%private%name(oldsize+1:) = 0 + if (iflag < 0) return + call reallocate(data%private%unit) + if (iflag < 0) return + data%private%maxfiles = size(data%private%unit) + end if + data%private%nfiles = ifile + end if + data%private%nextfile(ifile) = 0 + data%private%highest(ifile) = -1 + data%private%left(ifile) = 1 + data%private%right(ifile) = 0 + data%private%unit(ifile) = unit + + contains +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!11 + subroutine reallocate(array) + + integer, allocatable :: array(:) + + integer, allocatable :: temp(:) + + allocate(temp(size(array)),stat=data%stat) + if ( data%stat /= 0) then + iflag = -1; return + end if + + temp(:) = array(:) + + deallocate(array,stat=data%stat) + if ( data%stat /= 0) then + iflag = -8; return + end if + + allocate(array(size(temp)*2),stat=data%stat) + if ( data%stat /= 0) then + iflag = -1; return + end if + + array(1:size(temp)) = temp(:) + deallocate(temp,stat=data%stat) + if ( data%stat /= 0) then + iflag = -8; return + end if + + end subroutine reallocate +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + subroutine reallocate_long(array) + + integer(long), allocatable :: array(:) + + integer(long), allocatable :: temp(:) + + allocate(temp(size(array)),stat=data%stat) + if ( data%stat /= 0) then + iflag = -1; return + end if + + temp(:) = array(:) + + deallocate(array,stat=data%stat) + if ( data%stat /= 0) then + iflag = -8; return + end if + + allocate(array(size(temp)*2),stat=data%stat) + if ( data%stat /= 0) then + iflag = -1; return + end if + + array(1:size(temp)) = temp(:) + + deallocate(temp,stat=data%stat) + if ( data%stat /= 0) then + iflag = -8; return + end if + + end subroutine reallocate_long + + end subroutine find_unit + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + subroutine print_iflag(data,iflag,lp) + + type (of01_data) :: data + + integer, intent (in) :: iflag ! Error flag. + + integer, optional :: lp ! unit number for diagnostic messages. +! Negative for no messages. If not present or equal to unit +! number of a file that has already been opened for data, 6 is used. + +! Local variables + integer :: i, nout + character(10), parameter :: names(6) = (/'initialize','open ',& + 'read ','write ','close ','end '/) +!!!!!!!!!!!!!!!!!!!!!!!!!! + + nout = 6 + if (present(lp)) then + if (lp < 0) return + nout = lp +! check lp not equal to the unit number of a file that has been declared + do i = 1, data%private%nfiles + if (data%private%unit(i) == lp) then + nout = 6; exit + end if + end do + end if + + write (nout,'(3a,i3)') ' Error return from OF01_', & + trim(names(data%entry)), '. Error flag = ', iflag + + if (iflag == -1) then + write (nout,'(a,i3)') ' Allocation error. stat parameter = ', data%stat + else if (iflag == -2) then + write (nout,'(a,i3)') ' Violation of restriction on optional argument ' + else if (iflag == -3) then + write (nout,'(a,i3)') ' loc out of range' + else if (iflag == -4) then + write (nout,'(a,i3)') & + ' the superfile is not open under OF01' + else if (iflag == -5) then + write (nout,'(2a,i3)') ' INQUIRE statement error;', & + ' iostat parameter = ', data%iostat + else if (iflag == -6) then + write (nout,'(2a,i3)') ' READ statement error;', & + ' iostat parameter = ', data%iostat + else if (iflag == -7) then + write (nout,'(2a,i3)') ' OPEN statement error;', & + ' iostat parameter = ', data%iostat + else if (iflag == -8) then + write (nout,'(a,i3)') ' Deallocation error. stat parameter = ', & + data%stat + else if (iflag == -9) then + write (nout,'(a)') & + ' ifile is out of its range' + else if (iflag == -10) then + write (nout,'(2a)') ' one or more superfiles are open through HSL_OF01' + else if (iflag == -11) then + write (nout,'(2a)') ' lenw is positive but one or more of the ', & + 'required files does not exist' + else if (iflag == -12) then + write (nout,'(2a)') ' filename already exists in path ', & + trim(data%private%path(data%iostat)) + else if (iflag == -13) then + write (nout,'(a,i5)') ' file name is longer than ', maxname + else if (iflag == -14) then + write (nout,'(2a,i3)') ' CLOSE statement error;', & + ' iostat parameter = ', data%iostat + else if (iflag == -15) then + write (nout,'(2a,i3)') ' WRITE statement error;', & + ' iostat parameter = ', data%iostat + else if (iflag == -16) then + write (nout,'(a,i5)') ' path name is longer than ', maxpath + else if (iflag == -17) then + write (nout,'(a,i5)') ' unable to open file of given length' + end if + + end subroutine print_iflag + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + subroutine FVM_icopy(len,buffer,array) +! Copy buffer into array, thus: +! do l = 1,len +! array(i) = buffer(i) +! end do + + integer, intent(in) :: len + integer(wp), intent(in) :: buffer(len) + integer(wp), intent(inout) :: array(*) + + integer :: i,k + k = mod(len,7) + do i = 1, k + array(i) = buffer(i) + end do + + do i = k + 1, len, 7 + array(i) = buffer(i) + array(i+1) = buffer(i+1) + array(i+2) = buffer(i+2) + array(i+3) = buffer(i+3) + array(i+4) = buffer(i+4) + array(i+5) = buffer(i+5) + array(i+6) = buffer(i+6) + end do + + end subroutine FVM_icopy + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + subroutine of01_mcopy(len,buffer,array,map) + +! Add buffer into array under the control of map, thus: +! do l = 1,len +! i = map(l) +! array(i) = array(i) + buffer(l) +! end do + + integer, intent(in) :: len + integer(wp), intent(in) :: buffer(len) + integer(wp), intent(inout) :: array(*) + integer, intent(in) :: map(len) + +! Local variables + integer :: i,k,l +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + k = mod(len,7) + do l = 1, k + i = map(l); array(i) = array(i) + buffer(l) + end do + + do l = k + 1, len, 7 + i = map(l); array(i) = array(i) + buffer(l) + i = map(l+1); array(i) = array(i) + buffer(l+1) + i = map(l+2); array(i) = array(i) + buffer(l+2) + i = map(l+3); array(i) = array(i) + buffer(l+3) + i = map(l+4); array(i) = array(i) + buffer(l+4) + i = map(l+5); array(i) = array(i) + buffer(l+5) + i = map(l+6); array(i) = array(i) + buffer(l+6) + end do + + end subroutine of01_mcopy + + +end module hsl_of01_integer + +! COPYRIGHT (c) 2007 Science and Technology Facilities Council +! Original date 21st Sept 2007 + +!-*-*-*-*-*- HSL_KB22_ long_integer MODULE -*-*-*-*-*- + +! Nick Gould and Philippe Toint, for GALAHAD productions +! Copyright reserved +! January 26th 1995 + +! 21st September 2007 Version 1.0.0. Version numbering added. + + MODULE HSL_KB22_long_integer + + IMPLICIT NONE + + PRIVATE + PUBLIC :: KB22_build_heap, KB22_get_smallest + +!----------------------------- +! L o n g i n t e g e r +!----------------------------- + + INTEGER, PARAMETER :: long = selected_int_kind( 18 ) + + INTERFACE KB22_build_heap + MODULE PROCEDURE KB22_build_heap_long_integer + END INTERFACE + INTERFACE KB22_get_smallest + MODULE PROCEDURE KB22_get_smallest_long_integer + END INTERFACE + + CONTAINS + +!-*-*-*- H S L _ K B 2 2 _ b u i l d _ h e a p S U B R O U T I N E -*-*-* + + SUBROUTINE KB22_build_heap_long_integer( n, A, inform, INDA ) + +! Given an array A, elements A(1), ...., A(N), subroutine KB22_build_heap +! re-arranges the elements to form a heap in which each parent has a smaller +! value than either of its children. + +! Algorithm 232 of CACM (J. W. J. Williams): a combination of +! ALGOL procedures SETHEAP and INHEAP + +! ------------------------- dummy arguments -------------------------- +! +! n integer, which gives the number of values to be sorted. +! n must be positive +! +! A long integer array of length n. On input, A must contain the +! values which are to be sorted. On output, these values +! will have been permuted so as to form a heap +! +! inform integer, which informs the user of the success of KB22_build_heap. +! If inform = 0 on exit, the heap has been formed. +! If inform = 1 on exit, n was input with a value less than +! or equal to 0 and the heap has not been formed. +! +! INDA is an OPTIONAL integer array of length n. On input, INDA may +! be used to hold indexing information (such as the original +! order of the values) about A. On output, INDA will have been +! permuted so that INDA(k) still refers to A(k). +! +! ------------------ end of dummy arguments -------------------------- + + INTEGER, INTENT( IN ) :: n + INTEGER, INTENT( OUT ) :: inform + INTEGER ( KIND = long ), INTENT( INOUT ), DIMENSION( n ) :: A + INTEGER, INTENT( INOUT ), OPTIONAL, DIMENSION( n ) :: INDA + +!----------------------------------------------- +! L o c a l V a r i a b l e s +!----------------------------------------------- + + INTEGER :: i, j, k, indin + INTEGER ( KIND = long ) :: rin + LOGICAL :: index + +! Add the elements to the heap one at a time + + index = PRESENT( INDA ) + IF ( n <= 0 ) THEN + inform = 1 + RETURN + ENDIF + + IF ( index ) THEN + DO k = 2, n + rin = A( k ) + indin = INDA( k ) + +! The cycle may be repeated log2(k) times, but on average is repeated +! merely twice + + i = k + DO + IF ( i <= 1 ) EXIT + j = i / 2 + IF ( A( j ) <= rin ) EXIT + A( i ) = A( j ) + INDA( i ) = INDA( j ) + i = j + END DO + A( i ) = rin + INDA( i ) = indin + END DO + ELSE + DO k = 2, n + rin = A( k ) + +! The cycle may be repeated log2(k) times, but on average is repeated +! merely twice + + i = k + DO + IF ( i <= 1 ) EXIT + j = i / 2 + IF ( A( j ) <= rin ) EXIT + A( i ) = A( j ) + i = j + END DO + A( i ) = rin + END DO + END IF + inform = 0 + + RETURN + +! End of subroutine KB22_build_heap + + END SUBROUTINE KB22_build_heap_long_integer + +!-*-*- H S L _ K B 2 2 _ g e t _ s m a l l e s t S U B R O U T I N E -*-*- + + SUBROUTINE KB22_get_smallest_long_integer( m, A, inform, INDA ) + +! Given an array A, elements A(1), ...., A(m) forming a heap, +! KB22_get_smallest assigns to rout the value of A(1), the smallest +! member of the heap, and arranges the remaining members as elements +! 1 to m - 1 of A. rout is then placed in A(m) + +! Algorithm 232 of CACM (J. W. J. Williams): a combination of +! ALGOL procedures OUTHEAP and SWOPHEAP + +! ------------------------- dummy arguments -------------------------- +! +! m integer, which gives the number of values to be sorted. +! m must be positive +! +! A long integer array of length m. On input, A must contain the values +! which are to be sorted stored in a heap. On output, the smallest +! value will have been moved into A(m) and the remaining values A(k), +! k = 1,..., m-1 will have been restored to a heap +! +! inform integer, which informs the user of the success of KB22_get_smallest. +! If inform = 0 on exit, the smallest value has been found. +! If inform = 1 on exit, m was input with a value less than +! or equal to 0 and the heap has not been formed +! +! INDA optional integer array of length m. On input, INDA may be used +! to hold indexing information (see KB22_build_heap) about A. +! On output, INDA will have been permuted so that INDA(k) still +! refers to A(k). This argument is only permitted if it was present +! when calling KB22_build_heap +! +! ------------------ end of dummy arguments -------------------------- + + INTEGER, INTENT( IN ) :: m + INTEGER, INTENT( OUT ) :: inform + INTEGER ( KIND = long ), INTENT( INOUT ), DIMENSION( m ) :: A + INTEGER, INTENT( INOUT ), OPTIONAL, DIMENSION( m ) :: INDA + +!----------------------------------------------- +! L o c a l V a r i a b l e s +!----------------------------------------------- + + INTEGER :: i, j, indin, indout + INTEGER ( KIND = long ) :: rin, rout + LOGICAL :: index + + index = PRESENT( INDA ) + +! Add the element rin to the heap, extract and assign to rout +! the value of the smallest member of the resulting set, and +! leave the remaining elements in a heap of the original size. +! In this process, elements 1 to n+1 of the array A may be disturbed + + IF ( m <= 0 ) THEN + inform = 1 + RETURN + ENDIF + + IF ( m > 1 ) THEN + + IF ( index ) THEN + i = 1 + rout = A( 1 ) + indout = INDA( 1 ) + rin = A( m ) + indin = INDA( m ) + +! Move from the top of the heap comparing the value of node i +! with its two daughters. If node i is smallest, the heap has been +! restored. If one of the children is smallest, promote this child +! in the heap and move to the now vacated node. +! This cycle may be repeated log2(m) times + + DO + j = i + i + IF ( j > m - 1 ) EXIT + +! Determine which of the two daughters is smallest + + IF ( A( j + 1 ) < A( j ) ) j = j + 1 + +! Determine if the smaller daughter is less than the value from node i + + IF ( A( j ) >= rin ) EXIT + A( i ) = A( j ) + INDA( i ) = INDA( j ) + i = j + END DO + +! The heap has been restored + + A( i ) = rin + INDA( i ) = indin + +! Store the smallest value in the now vacated m-th position of the list + + A( m ) = rout + INDA( m ) = indout + ELSE + i = 1 + rout = A( 1 ) + rin = A( m ) + +! Move from the top of the heap comparing the value of node i +! with its two daughters. If node i is smallest, the heap has been +! restored. If one of the children is smallest, promote this child +! in the heap and move to the now vacated node. +! This cycle may be repeated log2(m) times + + DO + j = i + i + IF ( j > m - 1 ) EXIT + +! Determine which of the two daughters is smallest + + IF ( A( j + 1 ) < A( j ) ) j = j + 1 + +! Determine if the smaller daughter is less than the value from node i + + IF ( A( j ) >= rin ) EXIT + A( i ) = A( j ) + i = j + END DO + +! The heap has been restored + + A( i ) = rin + +! Store the smallest value in the now vacated m-th position of the list + + A( m ) = rout + END IF + + END IF + inform = 0 + + RETURN + +! End of subroutine KB22_get_smallest + + END SUBROUTINE KB22_get_smallest_long_integer + +! End of module HSL_KB22_long_integer + + END MODULE HSL_KB22_long_integer +! (c) STFC 2010-2011 +! Originating author: Jonathan Hogg +! +! Given a pivot order, this package performs common tasks +! required in the analyse phase of a symmetric sparse direct solver. +! Either the entire analyse may be performed or individual tasks. +! The matrix may be hled in assembled form or in elemental form. +! +! Version 1.2.0 +! See ChangeLog for version history + +! To convert to long: +! s/_integer/_long_integer +! Set pkg_type to long +module hsl_mc78_integer + implicit none + + private + public :: mc78_control + public :: mc78_analyse, mc78_supervars, mc78_compress_by_svar, mc78_etree, & + mc78_elt_equiv_etree, mc78_postorder, mc78_col_counts, mc78_supernodes, & + mc78_stats, mc78_row_lists, mc78_optimize_locality + + integer, parameter :: dp = kind(0d0) ! not package type + integer, parameter :: long = selected_int_kind(18) + + integer, parameter :: minsz_ms = 16 ! minimum size to use merge sort + + integer, parameter :: pkg_type = kind(0) ! package type - integer or long + + type mc78_control + integer :: heuristic = 1 ! 1=ma77 2=cholmod + integer :: nrelax(3) = (/ 4, 16, 48 /) ! CHOLMOD-like + real(dp) :: zrelax(3) = (/ 0.8, 0.1, 0.05 /) ! CHOLMOD-like + integer :: nemin = 16 ! Node amalgamation parameter + + integer :: unit_error = 6 + integer :: unit_warning = 6 + logical :: ssa_abort = .false. ! If .true., then return with an error if + ! an assembled matrix is detected as symbolically singular (we do + ! not garuntee to detect _all_ symbolically singular matrices). + ! If .false., then a warning is raised instead. + + logical :: svar = .false. ! If .true. then supervariables are used in + ! the assembled case, otherwise they are not. Supervaraibles are + ! always used in the elemental case. + logical :: sort = .false. ! If .true. then entries within each supernode's + ! row lists are sorted. Otherwise they might not be. + logical :: lopt = .false. ! If .true. then variable ordering is optimized + ! for cache locality. Otherwise it is not. + end type mc78_control + + integer, parameter :: MC78_ERROR_ALLOC = -1 ! allocate error + integer, parameter :: MC78_ERROR_SSA = -2 ! symbolically singular assembled + integer, parameter :: MC78_ERROR_ROW_SMALL = -3 ! supplied row array to short + integer, parameter :: MC78_ERROR_UNKNOWN = -99 ! internal/unknown error + + ! Warning flags are treated as bit masks, add together if multiple occour + integer, parameter :: MC78_WARNING_SSA = 1 ! symbolically singular assembled + integer, parameter :: MC78_WARNING_BLK_SVAR = 2 ! svar and blk pivs requested + + interface mc78_analyse + module procedure mc78_analyse_assembled_integer + module procedure mc78_analyse_elemental_integer + end interface mc78_analyse + + interface mc78_supervars + module procedure mc78_supervars_integer + end interface mc78_supervars + + interface mc78_compress_by_svar + module procedure mc78_compress_by_svar_integer + end interface mc78_compress_by_svar + + interface mc78_etree + module procedure mc78_etree_integer + end interface mc78_etree + + interface mc78_elt_equiv_etree + module procedure mc78_elt_equiv_etree_integer + end interface + + interface mc78_postorder + ! Note: cannot distinguish postorder_std between integer and long versions + module procedure mc78_postorder_std + module procedure mc78_postorder_detect + end interface mc78_postorder + + interface mc78_col_counts + module procedure mc78_col_counts_integer + end interface mc78_col_counts + + ! Note: cannot distinguish mc78_supernodes between integer and long versions + ! Note: cannot distinguish mc78_stats between integer and long versions + + interface mc78_row_lists + module procedure mc78_row_lists_nosvar_integer + module procedure mc78_row_lists_svar_integer + end interface mc78_row_lists + + ! Note: cannot distinguish mc78_optimize_locality between integer and long +contains + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! Main analysis routines +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +! +! For assembled matrix input, this subroutine performs a full analysis. +! This is essentially a wrapper around the rest of the package. +! +! Performance might be improved by: +! * Improving the sort algorithm used in find_row_idx +! +subroutine mc78_analyse_assembled_integer(n, ptr, row, perm, nnodes, sptr, & + sparent, rptr, rlist, control, info, stat, nfact, nflops, piv_size) + integer, intent(in) :: n ! Dimension of system + integer(pkg_type), dimension(n+1), intent(in) :: ptr ! Column pointers + integer, dimension(ptr(n+1)-1), intent(in) :: row ! Row indices + integer, dimension(n), intent(inout) :: perm + ! perm(i) must hold position of i in the pivot sequence. + ! On exit, holds the pivot order to be used by factorization. + integer, intent(out) :: nnodes ! number of supernodes found + integer, dimension(:), allocatable, intent(out) :: sptr ! supernode pointers + integer, dimension(:), allocatable, intent(out) :: sparent ! assembly tree + integer(long), dimension(:), allocatable, intent(out) :: rptr + ! pointers to rlist + integer, dimension(:), allocatable, intent(out) :: rlist ! row lists + ! For details of control, info : see derived type descriptions + type(mc78_control), intent(in) :: control + integer, intent(out) :: info + integer, optional, intent(out) :: stat + integer(long), optional, intent(out) :: nfact + integer(long), optional, intent(out) :: nflops + integer, dimension(n), optional, intent(inout) :: piv_size ! If + ! present, then matches matrix order and specifies block pivots. + ! piv_size(i) is the number of entries pivots in the block pivot + ! containing column i. + + integer(pkg_type), dimension(:), allocatable :: bptr ! copy of matrix with + ! added entries for block pivots - column pointers + integer, dimension(:), allocatable :: brow ! copy of matrix with added + ! entries for block pivots - row indices + integer :: flag ! return status flag for call to compress_by_svar + integer(pkg_type) :: sz + integer, dimension(:), allocatable :: svara ! array for supervariables + integer :: i + integer, dimension(:), allocatable :: invp ! inverse permutation of perm + integer, dimension(:), allocatable :: sinvp + integer :: j + integer :: k + integer :: nsvar ! number of supervariables + integer, dimension(:), allocatable :: sperm + integer(pkg_type), dimension(:), allocatable :: ptr2 + integer :: realn ! number of variables with an actual entry present + integer, dimension(:), allocatable :: row2 + integer :: st ! stat argument in allocate calls + logical :: svar_r + + integer :: svar_type ! 0=none, 1=col, 2=compressed form + + integer, dimension(:), allocatable :: scc + + ! initialise + info = 0 + + svar_r = control%svar + + ! Ensure allocatable output arguments are deallocated + deallocate(sptr, stat=st) + deallocate(sparent, stat=st) + deallocate(rptr, stat=st) + deallocate(rlist, stat=st) + + ! Initialise inverse permutation and check for duplicates + allocate(invp(n), stat=st) + if(st.ne.0) goto 490 + do i = 1, n + j = perm(i) + invp(j) = i + end do + + if(present(piv_size)) then + call convert_to_blk_piv(n, invp, piv_size) + allocate(bptr(n+1), brow(ptr(n+1)-1+2*n), stat=st) + if(st.ne.0) goto 490 + call mc78_block_prep(n, ptr, row, bptr, brow, perm, invp, piv_size, & + st) + if(st.ne.0) goto 490 + if(svar_r) then + ! Supervariables don't interact well with block pivots, so don't do it + svar_r = .false. + info = info + MC78_WARNING_BLK_SVAR + endif + endif + + ! Determine supervariables (if required) + if(svar_r) then + allocate(svara(n), stat=st) + if(st.ne.0) goto 490 + realn = n + call mc78_supervars(realn, ptr, row, perm, invp, nsvar, svara, st) + if(st.ne.0) goto 490 + if(n.ne.realn) then + if(control%ssa_abort) then + if(control%unit_error.gt.0) write(control%unit_error, "(2a)") & + "HSL_MC78: Error, matrix is symbolically singular and ", & + "control%ssa_abort=.true.." + info = MC78_ERROR_SSA + return + else + if(control%unit_warning.gt.0) write(control%unit_warning, "(a)") & + "HSL_MC78: Warning, matrix is symbolically singular." + info = info + MC78_WARNING_SSA + endif + endif + if(3*nsvar.lt.2*n) then + svar_type = 2 ! Use compressed form + else + svar_type = 0 ! Do not use supervariables + endif + + select case(svar_type) + case(0) ! do not use supervariables + ! release resources + deallocate(svara, stat=st) + case(2) ! Compressed form + ! It is worth using the compressed form + ! Determine upper bound on size of data for compressed array + sz = 0 + k = 1 + do i = 1, nsvar + j = invp(k) + sz = sz + ptr(j+1) - ptr(j) + k = k + svara(i) + end do + allocate(ptr2(nsvar+1), row2(sz), sperm(nsvar), sinvp(nsvar), stat=st) + if(st.ne.0) goto 490 + call mc78_compress_by_svar(n, ptr, row, invp, nsvar, svara, & + ptr2, sz, row2, flag, st) + select case(flag) + case(0) ! Everything OK + ! Do nothing + case(-1) ! Allocate failure + goto 490 + case default ! Should never happen + info = MC78_ERROR_UNKNOWN + return + end select + ! Compressed matrix is in pivot order already + do i = 1, nsvar + sperm(i) = i + sinvp(i) = i + end do + end select + else + svar_type = 0 + realn = n ! Assume full rank + endif + + select case(svar_type) + case(0) + if(present(piv_size)) then + call mc78_inner_analyse(n, realn, bptr, brow, perm, invp, nnodes, & + sptr, sparent, scc, rptr, rlist, control, info, st, & + block_pivots=piv_size) + else + call mc78_inner_analyse(n, realn, ptr, row, perm, invp, nnodes, & + sptr, sparent, scc, rptr, rlist, control, info, st) + endif + case(2) + call mc78_inner_analyse(nsvar, i, ptr2, row2, sperm, sinvp, nnodes, & + sptr, sparent, scc, rptr, rlist, control, info, st, wt=svara, & + block_pivots=piv_size) + if(st.ne.0) goto 490 + if(info.lt.0) return + if(i.ne.nsvar) then + ! Note: This code should NEVER execute + if(control%unit_error.gt.0) & + write(control%unit_error, "(a,2(a,i8))") "MC78_ANALYSE Internal ", & + "Error: supervariable matrix is rank deficient: i = ", i, & + "nsvar = ", nsvar + info = MC78_ERROR_UNKNOWN + return + endif + call svar_unmap(n, nsvar, svara, perm, invp, nnodes, sinvp, sptr, st) + end select + if(st.ne.0) goto 490 + if(info.lt.0) return + + ! Calculate info%num_factor and info%num_flops + call mc78_stats(nnodes, sptr, scc, nfact=nfact, nflops=nflops) + + if(control%lopt) then + ! Reorder elimination variables for better cache locality + if(control%sort) then + call mc78_optimize_locality(n, realn, perm, invp, nnodes, sptr, & + sparent, rptr, rlist, st, sort=.true.) + else + call mc78_optimize_locality(n, realn, perm, invp, nnodes, sptr, & + sparent, rptr, rlist, st) + endif + if(st.ne.0) goto 490 + else if(control%sort) then + call dbl_tr_sort(n, nnodes, rptr, rlist, st) + if(st.ne.0) goto 490 + endif + + if(present(piv_size)) & + call convert_from_blk_piv(n, perm, piv_size) + + !print *, "n, realn = ", n, realn + !print *, "ptr = ", ptr + !do i = 1, n + ! print *, "row(", i, ") = ", row(ptr(i):ptr(i+1)-1) + !end do + !print *, "nnodes = ", nnodes + !print *, "sptr = ", sptr(1:nnodes+1) + !print *, "sparent = ", sparent(1:nnodes) + !print *, "rptr = ", rptr(1:nnodes+1) + !print *, "rlist = ", rlist(1:rptr(nnodes+1)-1) + !print *, "invp = ", invp + !print *, "perm = ", perm + !print *, "piv_size = ", piv_size + + return + + !!!!!!!!!!!!!!!!!! + ! Error handlers ! + !!!!!!!!!!!!!!!!!! + + 490 continue + info = MC78_ERROR_ALLOC + if(present(stat)) stat = st + return +end subroutine mc78_analyse_assembled_integer + +! +! Inner core for assembled analyse routine, used to make calls in compressed +! (supervariable) case and standard case uniform +! +subroutine mc78_inner_analyse(n, realn, ptr, row, perm, invp, nnodes, sptr, & + sparent, scc, rptr, rlist, control, info, st, wt, block_pivots) + integer, intent(in) :: n ! Dimension of system + integer, intent(out) :: realn ! Symbolic dimension of system + integer(pkg_type), dimension(n+1), intent(in) :: ptr ! Column pointers + integer, dimension(ptr(n+1)-1), intent(in) :: row ! Row indices + integer, dimension(n), intent(inout) :: perm + ! perm(i) must hold position of i in the pivot sequence. + ! On exit, holds the pivot order to be used by factorization. + integer, dimension(n), intent(inout) :: invp ! inverse of perm + integer, intent(out) :: nnodes ! number of supernodes found + integer, dimension(:), allocatable, intent(out) :: sptr ! supernode pointers + integer, dimension(:), allocatable, intent(out) :: sparent ! assembly tree + integer, dimension(:), allocatable, intent(out) :: scc ! supernodal col cnt + integer(long), dimension(:), allocatable, intent(out) :: rptr + ! pointers to rlist + integer, dimension(:), allocatable, intent(out) :: rlist ! row lists + ! For details of control, info : see derived type descriptions + type(mc78_control), intent(in) :: control + integer, intent(inout) :: info + integer, intent(out) :: st + integer, dimension(n), optional, intent(in) :: wt ! Weights of columns + ! (i.e. size of each supervariable they represent) + integer, dimension(n), optional, intent(inout) :: block_pivots ! If + ! present, then matches pivot order and specifies block pivots. + ! block_pivots(i) may take one of the following values: + ! 0 - pivot i is in the middle of a block pivot + ! 1 - pivot i is the first pivot of a block pivot + ! 2 - pivot i is the last pivot of a block pivot + ! 3 - pivot i is a 1x1 pivot + + integer, dimension(:), allocatable :: cc ! number of entries in each column + integer :: ntot ! total number of variables + integer, dimension(:), allocatable :: parent ! parent of each node in etree + integer, dimension(:), allocatable :: tperm ! temporary permutation vector + + ! Build elimination tree + allocate(parent(n), stat=st) + if(st.ne.0) return + call mc78_etree(n, ptr, row, perm, invp, parent, st) + if(st.ne.0) return + + ! Postorder tree (modifies perm!) + call mc78_postorder(n, realn, ptr, perm, invp, parent, st, block_pivots) + if(st.ne.0) return + + if(n.ne.realn) then + if(control%ssa_abort) then + if(control%unit_error.gt.0) write(control%unit_error, "(2a)") & + "HSL_MC78: Error, matrix is symbolically singular and ", & + "control%ssa_abort=.true.." + info = MC78_ERROR_SSA + return + else + if(control%unit_warning.gt.0) write(control%unit_warning, "(a)") & + "HSL_MC78: Warning, matrix is symbolically singular." + info = info + MC78_WARNING_SSA + endif + endif + + ! Determine column counts + allocate(cc(n+1), stat=st) + if(st.ne.0) return + call mc78_col_counts(n, ptr, row, perm, invp, parent, cc, st, wt=wt) + if(st.ne.0) return + + ! Identify supernodes + allocate(tperm(n), sptr(n+1), sparent(n), scc(n), stat=st) + if(st.ne.0) return + call mc78_supernodes(n, realn, parent, cc, tperm, nnodes, sptr, sparent, & + scc, invp, control, info, st, wt=wt, block_pivots=block_pivots) + if(info.lt.0) return + + ! Apply permutation to obtain final elimination order + call apply_perm(n, tperm, perm, invp, cc, block_pivots=block_pivots) + + ! Determine column patterns - keep%nodes(:)%index + allocate(rptr(nnodes+1), rlist(sum(scc(1:nnodes))), stat=st) + if(st.ne.0) return + if(present(wt)) then + ntot = sum(wt) + call mc78_row_lists(n, wt, ntot, ptr, row, perm, invp, nnodes, sptr, & + sparent, scc, rptr, rlist, control, info, st) + else + call mc78_row_lists(n, ptr, row, perm, invp, nnodes, sptr, & + sparent, scc, rptr, rlist, control, info, st) + endif + if(st.ne.0) return +end subroutine mc78_inner_analyse + +! +! This subroutine performs full analyse when A is in elemental form. +! This is essentially a wrapper around the rest of the package. +! +subroutine mc78_analyse_elemental_integer(n, nelt, starts, vars, perm, & + eparent, nnodes, sptr, sparent, rptr, rlist, control, info, stat, & + nfact, nflops, piv_size) + integer, intent(in) :: n ! Maximum integer used to index an element + integer, intent(in) :: nelt ! Number of elements + integer(pkg_type), dimension(nelt+1), intent(in) :: starts ! Element pointers + integer, dimension(starts(nelt+1)-1), intent(in) :: vars ! Variables + !assoicated with each element. Element i has vars(starts(i):starts(i+1)-1) + integer, dimension(n), intent(inout) :: perm + ! perm(i) must hold position of i in the pivot sequence. + ! On exit, holds the pivot order to be used by factorization. + integer, dimension(nelt), intent(out) :: eparent ! On exit, eparent(i) holds + ! node of assembly that element i is a child of. + integer, intent(out) :: nnodes ! number of supernodes found + integer, dimension(:), allocatable, intent(out) :: sptr ! supernode pointers + integer, dimension(:), allocatable, intent(out) :: sparent ! assembly tree + integer(long), dimension(:), allocatable, intent(out) :: rptr + ! pointers to rlist + integer, dimension(:), allocatable, intent(out) :: rlist ! row lists + ! For details of control, info : see derived type descriptions + type(mc78_control), intent(in) :: control + integer, intent(out) :: info + integer, optional, intent(out) :: stat + integer(long), optional, intent(out) :: nfact ! If present, then on exit + ! contains the number of entries in L + integer(long), optional, intent(out) :: nflops ! If present, then on exit + ! contains the number of floating point operations in factorize. + integer, dimension(n), optional, intent(inout) :: piv_size ! If + ! present, then matches matrix order and specifies block pivots. + ! piv_size(i) is the number of entries pivots in the block pivot + ! containing column i. + + integer, dimension(:), allocatable :: cc ! number of entries in each column + integer :: i + integer, dimension(:), allocatable :: invp ! inverse permutation of perm + integer :: j + integer :: nsvar ! number of supervariables + integer, dimension(:), allocatable :: parent ! parent of each node in etree + integer, dimension(:), allocatable :: perm2 ! temporary permutation vector + integer(pkg_type), dimension(:), allocatable :: ptr ! column pointers for + ! equivilent matrix + integer :: realn ! Set to actual number of variables present + integer, dimension(:), allocatable :: row ! row indices for equivilent matrix + integer :: st ! stat argument in allocate calls + integer, dimension(:), allocatable :: svara ! array for supervariables + integer, dimension(:), allocatable :: sinvp ! inverse permutation of svars + integer, dimension(:), allocatable :: sperm ! permutation vector of svars + integer(long) :: sz ! temporary var for size of arrays at allocation + + integer, dimension(:), allocatable :: scc + + ! initialise + info = 0 + + ! Ensure allocatable output arguments are deallocated + deallocate(sptr, stat=st) + deallocate(sparent, stat=st) + deallocate(rptr, stat=st) + deallocate(rlist, stat=st) + + ! Initialise inverse permutation and check for duplicates + allocate(invp(n), stat=st) + if(st.ne.0) goto 490 + do i = 1, n + j = perm(i) + invp(j) = i + end do + + if(present(piv_size)) & + call convert_to_blk_piv(n, invp, piv_size) + + ! Determine supernodes, build equivilant lwr matrix and find elimination tree + sz = starts(nelt+1)-1 + if(present(piv_size)) sz = sz + n + allocate(ptr(n+2), row(sz), svara(n+1), parent(n), stat=st) + if(st.ne.0) goto 490 + realn = n + call mc78_elt_equiv_etree(realn, nelt, starts, vars, perm, invp, nsvar, & + svara, ptr, row, eparent, parent, st, block_pivots=piv_size) + if(st.ne.0) goto 490 + + ! Set up permutations of supervariables (initially the idenity) + allocate(sperm(nsvar), sinvp(nsvar), stat=st) + if(st.ne.0) goto 490 + sperm(1:nsvar) = (/ (i, i=1,nsvar) /) + sinvp(1:nsvar) = (/ (i, i=1,nsvar) /) + + ! Postorder tree (modifies perm!) + call mc78_postorder(nsvar, sperm, sinvp, parent, st, & + block_pivots=piv_size) + if(st.ne.0) goto 490 + + ! Determine column counts + allocate(cc(nsvar+1), stat=st) + if(st.ne.0) goto 490 + call mc78_col_counts(nsvar, ptr, row, sperm, sinvp, parent, cc, st, wt=svara) + if(st.ne.0) goto 490 + + ! Identify supernodes + allocate(perm2(nsvar), sptr(nsvar+1), sparent(nsvar), scc(nsvar), stat=st) + if(st.ne.0) goto 490 + call mc78_supernodes(nsvar, nsvar, parent, cc, perm2, nnodes, sptr, & + sparent, scc, sinvp, control, info, st, wt=svara, block_pivots=piv_size) + if(info.eq.MC78_ERROR_ALLOC) goto 490 + if(info.lt.0) return + + ! Apply permutation to obtain final elimination order + call apply_perm(nsvar, perm2, sperm, sinvp, cc, block_pivots=piv_size) + + ! Determine column patterns - keep%nodes(:)%index + allocate(rptr(nnodes+1), rlist(sum(scc(1:nnodes))), stat=st) + if(st.ne.0) goto 490 + call mc78_row_lists(nsvar, svara, n, ptr, row, sperm, sinvp, & + nnodes, sptr, sparent, scc, rptr, rlist, control, info, st) + if(st.ne.0) goto 490 + + ! Unmap from supervariables to real variables + call svar_unmap(n, nsvar, svara, perm, invp, nnodes, sinvp, & + sptr, st) + if(st.ne.0) goto 490 + + ! Calculate info%num_factor and info%num_flops + call mc78_stats(nnodes, sptr, scc, nfact=nfact, nflops=nflops) + + if(control%lopt) then + ! Reorder elimination variables for better cache locality + if(control%sort) then + call mc78_optimize_locality(n, realn, perm, invp, nnodes, sptr, & + sparent, rptr, rlist, st, sort=.true.) + else + call mc78_optimize_locality(n, realn, perm, invp, nnodes, sptr, & + sparent, rptr, rlist, st) + endif + if(st.ne.0) goto 490 + else if(control%sort) then + call dbl_tr_sort(n, nnodes, rptr, rlist, st) + if(st.ne.0) goto 490 + endif + + ! Adjust eparent with final permuation. Use svara to contain a mapping + ! from original variables to supernodes + do i = 1, nnodes + do j = sptr(i), sptr(i+1)-1 + svara(invp(j)) = i + end do + end do + svara(n+1) = n+1 + do i = 1, nelt + eparent(i) = svara(eparent(i)) + end do + + if(present(piv_size)) & + call convert_from_blk_piv(n, perm, piv_size) + + !print *, "n, realn, nelt = ", n, realn, nelt + !print *, "starts = ", starts + !print *, "vars = ", vars + !print *, "nnodes = ", nnodes + !print *, "sptr = ", sptr(1:nnodes+1) + !print *, "sparent = ", sparent(1:nnodes) + !print *, "eparent = ", eparent(:) + !print *, "rptr = ", rptr(1:nnodes+1) + !print *, "rlist = ", rlist(1:rptr(nnodes+1)-1) + !print *, "invp = ", invp + !print *, "perm = ", perm + + return + + !!!!!!!!!!!!!!!!!! + ! Error handlers ! + !!!!!!!!!!!!!!!!!! + + 490 continue + info = MC78_ERROR_ALLOC + if(present(stat)) stat = st + return +end subroutine mc78_analyse_elemental_integer + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! Supervariable routines +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +! +! This subroutine find supervariables of A using the algorithm of [1]. +! +! [1] I.S. Duff and J.K. Reid. "Exploiting zeros on the diagonal in the direct +! solution of indefinite sparse symmetric linear systems". +! ACM TOMS 22(2), pp227-257. 1996. +! +subroutine mc78_supervars_integer(n, ptr, row, perm, invp, nsvar, svar, st) + integer, intent(inout) :: n ! Dimension of system + integer(pkg_type), dimension(n+1), intent(in) :: ptr ! Column pointers + integer, dimension(ptr(n+1)-1), intent(in) :: row ! Row indices + integer, dimension(n), intent(inout) :: perm + ! perm(i) must hold position of i in the pivot sequence. + ! On exit, holds the pivot order to be used by factorization. + integer, dimension(n), intent(inout) :: invp ! inverse of perm + integer, intent(out) :: nsvar ! number of supervariables + integer, dimension(n), intent(out) :: svar ! number of vars in each svar + integer, intent(out) :: st + + logical :: full_rank ! flags if supervariable 1 has ever become empty. + ! If it has not, then the varaibles in s.v. 1 are those that never + ! occur + integer :: i + integer(long) :: ii + integer :: j + integer :: idx ! current index + integer :: next_sv ! head of free sv linked list + integer :: nsv ! new supervariable to move j to + integer :: piv ! current pivot + integer :: col ! current column of A + integer :: sv ! current supervariable + integer :: svc ! temporary holding supervariable count + integer, dimension(:), allocatable :: sv_new ! Maps each supervariable to + ! a new supervariable with which it is associated. + integer, dimension(:), allocatable :: sv_seen ! Flags whether svariables have + ! been seen in the current column. sv_seen(j) is set to col when svar j + ! has been encountered. + integer, dimension(:), allocatable :: sv_count ! number of variables in sv. + + allocate(sv_new(n+1), sv_seen(n+1), sv_count(n+1), stat=st) + if(st.ne.0) return + + svar(:) = 1 + sv_count(1) = n + sv_seen(1) = 0 + + ! Setup linked list of free super variables + next_sv = 2 + do i = 2, n + sv_seen(i) = i+1 + end do + sv_seen(n+1) = -1 + + ! Determine supervariables using modified Duff and Reid algorithm + full_rank = .false. + do col = 1, n + if(ptr(col+1).ne.ptr(col)) then + ! If column is not empty, add implicit diagonal entry + j = col + sv = svar(j) + if(sv_count(sv).eq.1) then ! Are we only (remaining) var in sv + full_rank = full_rank .or. (sv.eq.1) + ! MUST BE the first time that sv has been seen for this + ! column, so just leave j in sv, and go to next variable. + ! (Also there can be no other vars in this block pivot) + else + ! There is at least one other variable remaining in sv + ! MUST BE first occurence of sv in the current row/column, + ! so define a new supervariable and associate it with sv. + sv_seen(sv) = col + sv_new(sv) = next_sv + nsv = next_sv + next_sv = sv_seen(next_sv) + sv_new(nsv) = nsv ! avoids problems with duplicates + sv_seen(nsv) = col + ! Now move j from sv to nsv + nsv = sv_new(sv) + svar(j) = nsv + sv_count(sv) = sv_count(sv) - 1 + sv_count(nsv) = 1 + ! This sv cannot be empty as initial sv_count was > 1 + endif + endif + do ii = ptr(col), ptr(col+1)-1 + j = row(ii) + sv = svar(j) + if(sv_count(sv).eq.1) then ! Are we only (remaining) var in sv + full_rank = full_rank .or. (sv.eq.1) + ! If so, and this is first time that sv has been seen for this + ! column, then we can just leave j in sv, and go to next variable. + if(sv_seen(sv).lt.col) cycle + ! Otherwise, we have already defined a new supervariable associated + ! with sv. Move j to this variable, then retire (now empty) sv. + nsv = sv_new(sv) + if(sv.eq.nsv) cycle + svar(j) = nsv + sv_count(nsv) = sv_count(nsv) + 1 + ! Old sv is now empty, add it to top of free stack + sv_seen(sv) = next_sv + next_sv = sv + else + ! There is at least one other variable remaining in sv + if(sv_seen(sv).lt.col) then + ! this is the first occurence of sv in the current row/column, + ! so define a new supervariable and associate it with sv. + sv_seen(sv) = col + sv_new(sv) = next_sv + sv_new(next_sv) = next_sv ! avoids problems with duplicates + next_sv = sv_seen(next_sv) + sv_count(sv_new(sv)) = 0 + sv_seen(sv_new(sv)) = col + endif + ! Now move j from sv to nsv + nsv = sv_new(sv) + svar(j) = nsv + sv_count(sv) = sv_count(sv) - 1 + sv_count(nsv) = sv_count(nsv) + 1 + ! This sv cannot be empty as sv_count was > 1 + endif + end do + end do + + ! Note: block pivots do not mix well with supervariables as any significant + ! number (unless aligned to s.v.s) will demolish any gain from using them. + ! Converting vlock pivots to s.v.s results in potentially large amount of + ! unneeded fillin to left of block pivot. + !! If block pivots are being used, we force all pivots of a block pivot + !! to be in either the same supervariable, or in supervariables of size 1 + !if(present(block_pivots)) then + ! piv = 1 + ! do while(piv.le.n) + ! ! Check if we need to split pivots + ! split = .false. + ! sv = svar(piv) + ! do i = piv+1, piv+block_pivots(piv) + ! j = invp(i) + ! if(svar(j).ne.sv) then + ! split = .true. + ! exit + ! endif + ! end do + ! ! Do split if required + ! if(split) then + ! j = invp(i) + ! do i = piv, piv+block_pivots(piv) + ! sv = svar(j) + ! if(sv_count(sv).eq.1) cycle ! Already a singleton + ! ! Otherwise create a new sv and move j to it + ! nsv = next_sv + ! next_sv = sv_seen(next_sv) + ! svar(j) = nsv + ! sv_count(nsv) = 1 + ! sv_count(sv) = sv_count(sv) - 1 + ! end do + ! endif + ! piv = piv + block_pivots(piv) + 1 + ! end do + !endif + + ! Now modify pivot order such that all variables in each supervariable are + ! consecutive. Do so by iterating over pivots in elimination order. If a + ! pivot has not already been listed, then order that pivot followed by + ! any other pivots in that supervariable. + + ! We will build a new inverse permutation in invp, and then find perm + ! afterwards. First copy invp to perm: + perm(:) = invp(:) + ! Next we iterate over the pivots that have not been ordered already + ! Note: as we begin, all entries of sv_seen are less than or equal to n+1 + ! hence we can use <=n+1 or >n+1 as a flag to indicate if a variable has been + ! ordered. + idx = 1 + nsvar = 0 + do piv = 1, n + if(sv_seen(piv).gt.n+1) cycle ! already ordered + ! Record information for supervariable + sv = svar(perm(piv)) + if(.not.full_rank .and. sv.eq.1) cycle ! Don't touch unused vars + nsvar = nsvar + 1 + svc = sv_count(sv) + sv_new(nsvar) = svc ! store # vars in s.v. to copy to svar later + j = piv + ! Find all variables that are members of sv and order them. + do while(svc.gt.0) + do j = j, n + if(svar(perm(j)).eq.sv) exit + end do + sv_seen(j) = n+2 ! flag as ordered + invp(idx) = perm(j) + idx = idx + 1 + svc = svc - 1 + j = j + 1 + end do + end do + ! Push unused variables to end - these are those vars still in s.v. 1 + if(.not.full_rank) then + svc = sv_count(1) + ! Find all variables that are members of sv and order them. + j = 1 + do while(svc.gt.0) + do j = j, n + if(svar(perm(j)).eq.1) exit + end do + invp(idx) = perm(j) + idx = idx + 1 + svc = svc - 1 + j = j + 1 + end do + n = n - sv_count(1) + end if + ! Recover perm as inverse of invp + do piv = 1, n + perm(invp(piv)) = piv + end do + ! sv_new has been used to store number of variables in each svar, copy into + ! svar where it is returned. + svar(1:nsvar) = sv_new(1:nsvar) +end subroutine mc78_supervars_integer + +! +! This subroutine takes a set of supervariables and compresses the supplied +! matrix using them. +! +! As we would need a full scan of the matrix to calculate the correct size of +! row2, we instead allow the user to make a guess at a good size and return +! an error if this turns out to be incorrect. An upper bound on the required +! size may be obtained by summing the number of entries in the first column of +! each supervariable. +! +! Error returns: +! MC78_ERROR_ALLOC Failed to allocate memory +! MC78_ERROR_ROW_SMALL row2 too small +subroutine mc78_compress_by_svar_integer(n, ptr, row, invp, nsvar, svar, ptr2, & + lrow2, row2, info, st) + integer, intent(in) :: n ! Dimension of system + integer(pkg_type), dimension(n+1), intent(in) :: ptr ! Column pointers + integer, dimension(ptr(n+1)-1), intent(in) :: row ! Row indices + integer, dimension(n), intent(in) :: invp ! inverse of perm + integer, intent(in) :: nsvar + integer, dimension(nsvar), intent(in) :: svar ! super variables of A + integer(pkg_type), dimension(nsvar+1), intent(out) :: ptr2 + integer(pkg_type), intent(in) :: lrow2 + integer, dimension(lrow2), intent(out) :: row2 + integer, intent(out) :: info + integer, intent(out) :: st + + integer :: piv, svc, sv, col + integer(pkg_type) :: j, idx + integer, dimension(:), allocatable :: flag, sv_map + + info = 0 ! by default completed succefully + + allocate(flag(nsvar), sv_map(n), stat=st) + if(st.ne.0) then + info = MC78_ERROR_ALLOC + return + endif + flag(:) = 0 + + ! Setup sv_map + piv = 1 + do svc = 1, nsvar + do piv = piv, piv + svar(svc) - 1 + sv_map( invp(piv) ) = svc + end do + end do + + piv = 1 + idx = 1 + do svc = 1, nsvar + col = invp(piv) + ptr2(svc) = idx + do j = ptr(col), ptr(col+1)-1 + sv = sv_map(row(j)) + if(flag(sv).eq.piv) cycle ! Already dealt with this supervariable + if(idx.gt.lrow2) then + ! oops, row2 is too small + info = MC78_ERROR_ROW_SMALL + return + endif + ! Add row entry for this sv + row2(idx) = sv + flag(sv) = piv + idx = idx + 1 + end do + piv = piv + svar(svc) + end do + ptr2(svc) = idx +end subroutine mc78_compress_by_svar_integer + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! Elimination tree routines +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +! +! This subroutine determines the elimination tree of a PAP^T where A is a +! sparse symmetric matrix stored in compressed sparse column form with +! entries both above and below the diagonal present in the argument matrix. +! P is a permutation stored in order such that order(i) gives the pivot +! position of column i. i.e. order(3) = 5 means that the fifth pivot is +! A_33. +! +! The elimination tree is returned in the array parent. parent(i) gives the +! parent in the elimination tree of pivot i. +! +! The algorithm used is that of Liu [1]. +! +! [1] Liu, J. W. 1986. A compact row storage scheme for Cholesky factors using +! elimination trees. ACM TOMS 12, 2, 127--148. +! +subroutine mc78_etree_integer(n, ptr, row, perm, invp, parent, st) + integer, intent(in) :: n ! dimension of system + integer(pkg_type), dimension(n+1), intent(in) :: ptr ! column pointers of A + integer, dimension(ptr(n+1)-1), intent(in) :: row ! row indices of A + integer, dimension(n), intent(in) :: perm ! perm(i) is the pivot position + ! of column i + integer, dimension(n), intent(in) :: invp ! inverse of perm + integer, dimension(n), intent(out) :: parent ! parent(i) is the + ! parent of pivot i in the elimination tree + integer, intent(out) :: st ! stat parmeter for allocate calls + + integer(pkg_type) :: i ! next index into row + integer :: j ! current entry in row + integer :: k ! current ancestor + integer :: l ! next ancestor + integer :: piv ! current pivot + integer :: rowidx ! current column of A = invp(piv) + integer, dimension(:), allocatable :: vforest ! virtual forest, used for + ! path compression (shortcuts to top of each tree) + + ! Allocate virtual forest and initialise it + allocate(vforest(n), stat=st) + if(st.ne.0) return + vforest(:) = n+1 + + ! Loop over rows of A in pivot order + piv = 1 + do while(piv.le.n) + !print *, "row ", piv + rowidx = invp(piv) + ! Loop over entries in row in lower triangle of PAP^T + do i = ptr(rowidx), ptr(rowidx+1)-1 + j = perm(row(i)) + if(j.ge.piv) cycle ! not in lower triangle + !print *, " entry ", j + k = j + do while(vforest(k).lt.piv) + l = vforest(k) + vforest(k) = piv + k = l + end do + ! Check if we have already done this pivot + if(vforest(k).eq.piv) cycle + parent(k) = piv + vforest(k) = piv + end do + parent(piv) = n + 1 ! set to be a root if not overwritten + piv = piv + 1 ! move on to next pivot + end do +end subroutine mc78_etree_integer + +! +! This subroutine identifies supervariables of A using a modified variant of +! the algorithm of Duff and Reid [1]. A lower triangular equivilant matrix +! is returned that is expressed in terms of these supervariables. The grouping +! of variables into supervaribles is returned through a modified pivot order +! and an array specifying the number of variables in each supervariable in +! elimination order. Finally the vector eparent is also returned. This contains +! the variable (in natural numbering) that corresponds to the least pivot in +! each supervariable. +! +! [1] I.S. Duff and J.K. Reid. "Exploiting zeros on the diagonal in the direct +! solution of indefinite sparse symmetric linear systems". +! ACM TOMS 22(2), pp227-257. 1996. +! +! Note: If block pivots are present they have priority over supervariables - +! members of same block pivot must remain in same supervariable. This is +! enforced by moving them all at once. +subroutine mc78_elt_equiv_etree_integer(n, nelt, starts, vars, perm, invp, & + nsvar, svar, ptr, row, eparent, parent, st, block_pivots) + integer, intent(inout) :: n ! dimension of system + integer, intent(in) :: nelt ! number of elements + integer(pkg_type), dimension(nelt+1), intent(in) :: starts ! variable + ! pointers of elements + integer, dimension(starts(nelt+1)-1), intent(in) :: vars ! variables of + ! elements + integer, dimension(n), intent(inout) :: perm ! perm(i) is the pivot position + ! of column i + integer, dimension(n), intent(inout) :: invp ! inverse of perm + integer, intent(out) :: nsvar ! number of supervariables found + integer, dimension(n), intent(out) :: svar ! size of each supervariable + integer(pkg_type), dimension(n+1), intent(out) :: ptr ! column pointers + ! for equivilant lower triangular form + integer, dimension(:), intent(out) :: row ! row indices + ! for equivilant lower triangular form + integer, dimension(nelt), intent(out) :: eparent ! parent nodes of each + ! element - i.e. the least pivot in each element + integer, dimension(n), intent(out) :: parent ! parent(i) is parent of node + ! i in the elimination tree + integer, intent(out) :: st ! stat parmeter for allocate calls + integer, dimension(n), optional, intent(inout) :: block_pivots ! Used for + ! block pivots, see description in analyse phase. + + integer :: csv ! column supervariable in loop + integer :: elt ! current element + logical :: full_rank ! flags if supervariable 1 has ever become empty. + ! If it has not, then the varaibles in s.v. 1 are those that never + ! occour + integer :: i + integer(pkg_type) :: ii + integer(pkg_type) :: idx ! Next insert position + integer :: j + integer :: k + integer :: minpiv ! minimum pivot of current element + integer, dimension(:), allocatable :: mp_head, mp_next ! mp_head and mp_next + ! store a linked list of elements for which a given variable is the + ! minimum pivot. + integer :: next_sv ! Top of stack of free supervariables (stored as a linked + ! list in unused part of sv_seen) + integer :: orign ! original system dimension + integer :: nsv ! temporary variable storing new supervariable to move var to + integer :: piv ! current pivot + integer :: sv ! current supervariable + integer :: svc ! temporary variable storing supervariable count remaining + integer, dimension(:), allocatable :: sv_count ! sv_count(s) is the number + ! of variables in supervariable s. + integer, dimension(:), allocatable :: sv_map ! sv_map(v) is the current + ! supervariable to which variable v belongs. + integer, dimension(:), allocatable :: sv_new ! sv_map(s) is new + ! supervariable for variables currently in supervariable s. + integer, dimension(:), allocatable :: sv_seen ! sv_seen(s) is used to flag + ! if supervariable s has been found in the current element before. + ! In addition the part corresponding to unused supervariables is used + ! to store a stack (as a linked list) of empty supervariables. + integer(pkg_type), dimension(:), allocatable :: uprptr ! column pointers for + ! upper triangular equivilant form. + integer, dimension(:), allocatable :: uprrow ! row indices for upper + ! triangular equivilant form. + logical :: used ! flag if a variable has been used + + ! Initialise supervariable representation + allocate(sv_new(max(nelt+1,n+1)), sv_seen(max(nelt,n)+1), & + sv_map(max(nelt,n)+1), sv_count(max(nelt,n)+1), stat=st) + if(st.ne.0) return + sv_map(:) = 1 ! All vars are intially in supervariable 1 + sv_count(1) = n ! ... which thus has all variables + sv_seen(1) = 0 ! Flag supervariable 1 as unseen on first iteration + orign = n + + if(present(block_pivots)) then + ! Do not mix supervariables and block pivots + + ! Still need to determine minimum pivots and rank + sv_seen(:) = 0 + do elt = 1, nelt + minpiv = n+1 + do ii = starts(elt), starts(elt+1)-1 + j = vars(ii) + ! Mark variable as used + sv_seen(j) = 1 + ! Determine minimum pivot + minpiv = min(minpiv, perm(j)) + end do + ! Store the minimum pivot as original variable (avoids messy remapping) + if(minpiv.le.n) eparent(elt) = invp(minpiv) + end do + + ! Build invp that pushes unsued vars to the end. Be careful of unused vars + ! that are in fact part of block pivots, split them out. + perm(:) = invp(:) + piv = 1 + j = 1 + ! Handle variables that are actually used + do while(piv.le.n) + used = .true. + do i = piv, n + used = used .and. (sv_seen(perm(i)).eq.1) + if(block_pivots(i).ge.2) exit ! end of block pivot + end do + + if(used) then + ! Block pivot is entirely composed of used variables + do piv = piv, i + invp(j) = perm(piv) + sv_seen(perm(piv)) = 2 + j = j + 1 + end do + else + ! Block pivot has some unused variables in it + k = 0 + do piv = piv, i + if(sv_seen(perm(piv)).eq.1) then + invp(j) = perm(piv) + sv_seen(perm(piv)) = 2 + j = j + 1 + if(k.eq.0) then + ! This is the new start of the block pivot + select case(block_pivots(piv)) + case(0) ! was in the middle. now a start + block_pivots(piv) = 1 + case(2) ! was the end. now a 1x1 + block_pivots(piv) = 3 + end select + endif + k = piv + endif + end do + if(k.ne.0) then + ! The was at least one used variable in the block pivot + select case(block_pivots(k)) + case(0) ! was the middle. now an end + block_pivots(k) = 2 + case(1) ! was the start. now a 1x1 + block_pivots(k) = 3 + end select + endif + endif + piv = i + 1 + end do + ! Handle unused variables; build supervariables + nsvar = 0 + do piv = 1, n + i = perm(piv) + if(sv_seen(i).eq.0) then + invp(j) = i + j = j + 1 + block_pivots(piv) = 3 ! Force to 1x1 + else + nsvar = nsvar + 1 + svar(nsvar) = 1 + sv_new(i) = nsvar + endif + end do + ! Map block_pivots in original variable order into sv_map + do i = 1, n + sv_map(perm(i)) = block_pivots(i) + end do + ! Map sv_map in new pivot order back into block_pivots + do i = 1, n + block_pivots(i) = sv_map(invp(i)) + end do + ! Reestablish perm + do i = 1, n + perm(invp(i)) = i + end do + else + ! Setup linked list of free supervariables - we utilise the unused part + ! of sv_seen for this + next_sv = 2 + do i = 2, n + sv_seen(i) = i+1 + end do + sv_seen(n+1) = -1 + + ! Determine supervariables. At the same time find the least pivot + ! associated with each element. + nsvar = 1 + full_rank = .false. + do elt = 1, nelt + minpiv = n+1 + do ii = starts(elt), starts(elt+1)-1 + j = vars(ii) + ! Determine minimum pivot + minpiv = min(minpiv, perm(j)) + sv = sv_map(j) + if(sv_count(sv).eq.1) then ! Are we only (remaining) var in sv + full_rank = full_rank .or. (sv.eq.1) + ! If so, and this is first time that sv has been seen for this + ! element, then we can just leave j in sv, and go to next + ! variable. + if(sv_seen(sv).lt.elt) cycle + ! Otherwise, we have already defined a new supervariable + ! associated with sv. Move j to this variable, then retire (now + ! empty) sv. + ! Note: as only var in sv, cannot have fellows in block pivot + nsv = sv_new(sv) + if(sv.eq.nsv) cycle ! don't delete a variable because of a + ! duplicate + sv_map(j) = nsv + sv_count(nsv) = sv_count(nsv) + 1 + ! Old sv is now empty, add it to top of free stack + sv_seen(sv) = next_sv + next_sv = sv + nsvar = nsvar - 1 + else + ! There is at least one other variable remaining in sv + if(sv_seen(sv).lt.elt) then + ! this is the first occurence of sv in the current element, + ! so define a new supervariable and associate it with sv. + sv_seen(sv) = elt + sv_new(sv) = next_sv + sv_new(next_sv) = next_sv ! ensure we are tolerant of + ! duplicates + next_sv = sv_seen(next_sv) + sv_count(sv_new(sv)) = 0 + sv_seen(sv_new(sv)) = elt + nsvar = nsvar + 1 + endif + ! Now move j from sv to nsv + nsv = sv_new(sv) + sv_map(j) = nsv + sv_count(sv) = sv_count(sv) - 1 + sv_count(nsv) = sv_count(nsv) + 1 + ! We know sv can't be empty, so it doesn't need adding to free + ! stack + endif + end do + ! Store the minimum pivot as original variable (avoids messy remapping) + if(minpiv.le.n) then + eparent(elt) = invp(minpiv) + else + eparent(elt) = n+1 + endif + end do + + ! Now modify pivot order such that all variables in each supervariable are + ! consecutive. Do so by iterating over pivots in elimination order. If a + ! pivot has not already been listed, then order that pivot followed by + ! any other pivots in that supervariable. + + ! We will build a new inverse permutation in invp, and then find perm + ! afterwards. First copy invp to perm: + perm(:) = invp(:) + ! Next we iterate over the pivots that have not been ordered already + ! Note: as we begin, all entries of sv_seen are less than or equal to n+1 + ! hence we can use <=n+1 or >n+1 as a flag to indicate if a variable has + ! been ordered. + idx = 1 + nsvar = 0 + do piv = 1, n + if(sv_seen(piv).gt.n+1) cycle ! already ordered + ! Record information for supervariable + sv = sv_map(perm(piv)) + if(.not.full_rank .and. sv.eq.1) cycle ! Don't touch unused vars + svc = sv_count(sv) + nsvar = nsvar + 1 + svar(nsvar) = svc + ! Find all variables that are members of sv and order them. + j = piv + do while(svc.gt.0) + do j = j, n + if(sv_map(perm(j)).eq.sv) exit + end do + sv_seen(j) = n+2 ! flag as ordered + sv_new(perm(j)) = nsvar ! new mapping to sv + invp(idx) = perm(j) + idx = idx + 1 + svc = svc - 1 + j = j + 1 + end do + end do + sv_new(n+1) = nsvar+1 + ! Push unused variables to end - these are those vars still in s.v. 1 + if(.not.full_rank) then + svc = sv_count(1) + ! Find all variables that are members of sv and order them. + j = 1 + do while(svc.gt.0) + do j = j, n + if(sv_map(perm(j)).eq.1) exit + end do + invp(idx) = perm(j) + idx = idx + 1 + svc = svc - 1 + j = j + 1 + end do + n = n - sv_count(1) + end if + ! Recover perm as inverse of invp + do piv = 1, n + perm(invp(piv)) = piv + end do + endif + + ! build linked lists by supervariable + allocate(mp_head(nsvar+1), mp_next(nelt), stat=st) + if(st.ne.0) return + mp_head(:) = -1 + do elt = 1, nelt + if(eparent(elt).gt.orign) cycle + minpiv = sv_new(eparent(elt)) + if(present(block_pivots) .and. minpiv.ne.1) then + do while(block_pivots(minpiv-1).lt.2) + minpiv = minpiv - 1 + if(minpiv.eq.1) exit + end do + endif + ! Store element in linked list for minpiv + mp_next(elt) = mp_head(minpiv) + mp_head(minpiv) = elt + end do + + ! Iterate over columns in pivot order, storing the lower triangular + ! equivilant matrix as we go. At the same time, build the column counts for + ! the upper triangle in uprptr, but offset by 2 (ie uprptr(i+2) for col i). + ! Observe that all the pivots associated with the supervariable + ! to which minpiv belongs _must_ appear in each element that minpiv does. + ! Note: This only generates the lower triangular part of the matrix! + allocate(uprptr(nsvar+2), stat=st) + if(st.ne.0) return + uprptr(:) = 0 + sv_seen(:) = 0 + idx = 1 + ptr(:) = -1 + do csv = 1, nsvar + elt = mp_head(csv) + ptr(csv) = idx + sv_seen(csv) = csv ! Mark diagonal as seen, as it is implicit. + do while(elt.ne.-1) + do ii = starts(elt), starts(elt+1)-1 + sv = sv_new(vars(ii)) + ! Skip this sv if it is already included (or is implicit) + if(sv_seen(sv).ge.csv) cycle + sv_seen(sv) = csv ! Mark as seen + ! If we can't skip it, then add entry (sv,csv) to lwr matrix + row(idx) = sv + idx = idx + 1 + ! Add count in upper triangle for (csv,sv) + uprptr(sv+2) = uprptr(sv+2) + 1 + end do + ! Move on to next element for which this is the minimum pivot + elt = mp_next(elt) + end do + if(present(block_pivots) .and. csv.ne.nsvar) then + ! Add entry (csv+1,csv) to ensure elimination tree correct + if(block_pivots(csv).lt.2 .and. sv_seen(csv+1).ne.csv) then + sv_seen(csv+1) = csv + row(idx) = csv+1 + idx = idx + 1 + ! Add count in upper triangle for (csv, csv+1) + uprptr(csv+1+2) = uprptr(csv+1+2) + 1 + endif + endif + end do + ptr(nsvar+1) = idx + + ! Build upper form - work out column start for col i in uprptr(i+1) + uprptr(1:2) = 1 + do i = 1, nsvar + uprptr(i+2) = uprptr(i+1) + uprptr(i+2) + end do + + ! Now iterate over lwr form, droppping entries into upr form + allocate(uprrow(uprptr(nsvar+2)), stat=st) + if(st.ne.0) return + do csv = 1, nsvar + do ii = ptr(csv), ptr(csv+1) - 1 + sv = row(ii) + uprrow(uprptr(sv+1)) = csv + uprptr(sv+1) = uprptr(sv+1) + 1 + end do + end do + + ! Now determine supervariable elimination tree + call etree_no_perm(nsvar, uprptr, uprrow, parent, st) + if(st.ne.0) return +end subroutine mc78_elt_equiv_etree_integer + +! +! Specialised version of mc78_etree that assumes elimination order is identity +! +subroutine etree_no_perm(n, ptr, row, parent, st) + integer, intent(in) :: n ! dimension of system + integer(pkg_type), dimension(n+1), intent(in) :: ptr ! column pointers of A + integer, dimension(ptr(n+1)-1), intent(in) :: row ! row indices of A + integer, dimension(n), intent(out) :: parent ! parent(i) is the + ! parent of pivot i in the elimination tree + integer, intent(out) :: st ! stat parmeter for allocate calls + + integer(pkg_type) :: ii ! next index into row + integer :: k ! current ancestor + integer :: l ! next ancestor + integer :: piv ! current pivot + integer, dimension(:), allocatable :: vforest ! virtual forest, used for + ! path compression (shortcuts to top of each tree) + + ! Allocate virtual forest and initialise it + allocate(vforest(n), stat=st) + if(st.ne.0) return + vforest(:) = n+1 + + ! Loop over rows of A in pivot order + do piv = 1, n + ! Loop over entries in row in lower triangle of PAP^T + do ii = ptr(piv), ptr(piv+1)-1 + k = row(ii) + do while(vforest(k).lt.piv) + l = vforest(k) + vforest(k) = piv + k = l + end do + if(vforest(k).eq.piv) cycle ! Already done from here, don't overwrite + parent(k) = piv + vforest(k) = piv + end do + parent(piv) = n + 1 ! set to be a root if not overwritten + end do +end subroutine etree_no_perm + +! +! This subroutine will postorder the elimination tree. That is to say it will +! reorder the nodes of the tree such that they are in depth-first search order. +! +! This is done by performing a depth-first search to identify mapping from the +! original pivot order to the new one. This map is then applied to order, invp +! and parent to enact the relabelling. +! +subroutine mc78_postorder_std(n, perm, invp, parent, st, block_pivots) + integer, intent(in) :: n + integer, dimension(n), intent(inout) :: perm ! perm(i) is the pivot + ! position of column i + integer, dimension(n), intent(inout) :: invp ! inverse of perm + integer, dimension(n), intent(inout) :: parent ! parent(i) is the + ! parent of pivot i in the elimination tree + integer, intent(out) :: st ! stat parmeter for allocate calls + integer, dimension(n), optional, intent(inout) :: block_pivots ! If + ! present, then matches pivot order and specifies block pivots. + ! block_pivots(i) may take one of the following values: + ! 0 - pivot i is in the middle of a block pivot + ! 1 - pivot i is the first pivot of a block pivot + ! 2 - pivot i is the last pivot of a block pivot + ! 3 - pivot i is a 1x1 pivot + + integer, dimension(:), allocatable :: chead ! chead(i) is first child of i + integer, dimension(:), allocatable :: cnext ! cnext(i) is next child of i + integer :: i + integer :: id + integer :: j + integer, dimension(:), allocatable :: map ! mapping from original pivot + ! order to new one + integer :: node + integer :: shead ! pointer to top of stack + integer, dimension(:), allocatable :: stack ! stack for depth first search + + ! + ! Build linked lists of children for each node + ! + allocate(chead(n+1), cnext(n+1), stat=st) + if(st.ne.0) return + chead(:) = -1 ! no parent if necessary + do i = n, 1, -1 ! do in reverse order so they come off in original order + j = parent(i) + cnext(i) = chead(j) + chead(j) = i + end do + + ! + ! Perform depth first search to build map + ! + allocate(map(n+1), stack(n), stat=st) + if(st.ne.0) return + ! Place virtual root on top of stack + shead = 1 + stack(shead) = n+1 + id = n + 1 ! next node id + do while(shead.ne.0) + ! Get node from top of stack + node = stack(shead) + shead = shead - 1 + + ! Number it + map(node) = id + id = id - 1 + + ! Place all its children on the stack such that the last child is + ! at the top of the stack and first child closest to the bottom + i = chead(node) + do while(i.ne.-1) + shead = shead + 1 + stack(shead) = i + i = cnext(i) + end do + end do + + ! + ! Apply map to perm, invp and parent (and block_pivots if present) + ! + + ! invp is straight forward, use stack as a temporary + stack(1:n) = invp(1:n) + do i = 1, n + j = map(i) + invp(j) = stack(i) + end do + + ! perm can be easily done as the inverse of invp + do i = 1, n + perm(invp(i)) = i + end do + + ! parent is done in two stages. The first copies it to stack and permutes + ! parent(i), but not the locations. i.e. if 1 is a parent of 3, and + ! map(1)=2 and map(3)=4, then the first stage sets stack(1) = 4. + ! The second stage then permutes the entries of map back into parent + do i = 1, n + stack(i) = map(parent(i)) + end do + do i = 1, n + parent(map(i)) = stack(i) + end do + + ! permute block_pivots if required + if(present(block_pivots)) then + stack(1:n) = block_pivots(1:n) + do i = 1, n + block_pivots(map(i)) = stack(i) + end do + endif +end subroutine mc78_postorder_std + +! +! This subroutine will postorder the elimination tree. That is to say it will +! reorder the nodes of the tree such that they are in depth-first search order. +! +! This is done by performing a depth-first search to identify mapping from the +! original pivot order to the new one. This map is then applied to order, invp +! and parent to enact the relabelling. +! +subroutine mc78_postorder_detect(n, realn, ptr, perm, invp, parent, st, & + block_pivots) + integer, intent(in) :: n + integer, intent(out) :: realn + integer(pkg_type), dimension(n+1), intent(in) :: ptr + integer, dimension(n), intent(inout) :: perm ! perm(i) is the pivot + ! position of column i + integer, dimension(n), intent(inout) :: invp ! inverse of perm + integer, dimension(n), intent(inout) :: parent ! parent(i) is the + ! parent of pivot i in the elimination tree + integer, intent(out) :: st ! stat parmeter for allocate calls + integer, dimension(n), optional, intent(inout) :: block_pivots ! If + ! present, then matches pivot order and specifies block pivots. + ! block_pivots(i) may take one of the following values: + ! 0 - pivot i is in the middle of a block pivot + ! 1 - pivot i is the first pivot of a block pivot + ! 2 - pivot i is the last pivot of a block pivot + ! 3 - pivot i is a 1x1 pivot + + integer, dimension(:), allocatable :: chead ! chead(i) is first child of i + integer, dimension(:), allocatable :: cnext ! cnext(i) is next child of i + integer :: i + integer :: id + integer :: j + integer, dimension(:), allocatable :: map ! mapping from original pivot + ! order to new one + integer :: node + integer :: shead ! pointer to top of stack + integer, dimension(:), allocatable :: stack ! stack for depth first search + + realn = n + + ! + ! Build linked lists of children for each node + ! + allocate(chead(n+1), cnext(n+1), stat=st) + if(st.ne.0) return + chead(:) = -1 ! no parent if necessary + do i = n, 1, -1 ! do in reverse order so they come off in original order + j = parent(i) + cnext(i) = chead(j) + chead(j) = i + end do + + ! + ! Perform depth first search to build map + ! + allocate(map(n+1), stack(n), stat=st) + if(st.ne.0) return + ! Place virtual root on top of stack + shead = 1 + stack(shead) = n+1 + id = n + 1 ! next node id + do while(shead.ne.0) + ! Get node from top of stack + node = stack(shead) + shead = shead - 1 + + ! Number it + map(node) = id + id = id - 1 + + ! Place all its children on the stack such that the last child is + ! at the top of the stack and first child closest to the bottom + if(node.eq.n+1) then + ! Virtual root node, detect children with no entries at same time + ! placing those that are empty at the top of the stack + ! First do those which are proper roots + i = chead(node) + do while(i.ne.-1) + if(ptr(invp(i)+1)-ptr(invp(i)).eq.0) then + i = cnext(i) + cycle + endif + shead = shead + 1 + stack(shead) = i + i = cnext(i) + end do + ! Second do those which are null roots + i = chead(node) + do while(i.ne.-1) + if(ptr(invp(i)+1)-ptr(invp(i)).ne.0) then + i = cnext(i) + cycle + endif + realn = realn - 1 + shead = shead + 1 + stack(shead) = i + i = cnext(i) + end do + else ! A normal node + i = chead(node) + do while(i.ne.-1) + shead = shead + 1 + stack(shead) = i + i = cnext(i) + end do + endif + end do + + ! + ! Apply map to perm, invp and parent (and block_pivots if present) + ! + + ! invp is straight forward, use stack as a temporary + stack(1:n) = invp(1:n) + do i = 1, n + j = map(i) + invp(j) = stack(i) + end do + + ! perm can be easily done as the inverse of invp + do i = 1, n + perm(invp(i)) = i + end do + + ! parent is done in two stages. The first copies it to stack and permutes + ! parent(i), but not the locations. i.e. if 1 is a parent of 3, and + ! map(1)=2 and map(3)=4, then the first stage sets stack(1) = 4. + ! The second stage then permutes the entries of map back into parent + do i = 1, n + stack(i) = map(parent(i)) + end do + do i = 1, n + parent(map(i)) = stack(i) + end do + + ! permute block_pivots if required + if(present(block_pivots)) then + stack(1:n) = block_pivots(1:n) + do i = 1, n + block_pivots(map(i)) = stack(i) + end do + endif +end subroutine mc78_postorder_detect + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! Column count routines +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +! +! This subroutine determines column counts given the elimination tree and +! pattern of the matrix PAP^T. +! +! The algorithm is a specialisation of that given by Gilbert, Ng and Peyton [1], +! to only determine column counts. It is also described in Section 4.4 "Row +! counts" of [2]. +! +! The essential technique is to determine the net number of entries introduced +! at a node (the "weight" in [1]). This is composed over the following terms: +! wt[i] = [ - #children of node i +! - #common indices between children +! + #additional "new" row indices from column of A ] +! +! The clever part of this algorithm is how to determine the number of common +! indices between the children. This is accomplished by storing the last column +! at which an index was encountered, and a partial elimination tree. This +! partial elimination tree consists of all nodes processed so far, plus their +! parents. As we have a postorder on the tree, the current top of the tree +! containing node i is the least common ancestor of node i and the current node. +! We then observe that the first time an index will be double counted is at the +! least common ancestor of the current node and the last node where it was +! encountered. +! +! [1] Gilbert, Ng, Peyton, "An efficient algorithm to compute row and column +! counts for sparse Cholesky factorization", SIMAX 15(4) 1994. +! +! [2] Tim Davis's book "Direct Methods for Sparse Linear Systems", SIAM 2006. +! +subroutine mc78_col_counts_integer(n, ptr, row, perm, invp, parent, cc, st, wt) + integer, intent(in) :: n ! dimension of system + integer(pkg_type), dimension(n+1), intent(in) :: ptr ! column pointers of A + integer, dimension(ptr(n+1)-1), intent(in) :: row ! row indices of A + integer, dimension(n), intent(in) :: perm ! perm(i) is the pivot + ! position of column i + integer, dimension(n), intent(in) :: invp ! inverse of perm + integer, dimension(n), intent(in) :: parent ! parent(i) is the + ! parent of pivot i in the elimination tree + integer, dimension(n+1), intent(out) :: cc ! On exit, cc(i) is the + ! number of entries in the lower triangular part of L (includes diagonal) + ! for the column containing pivot i. For most of the routine however, it + ! is used as a work space to track the net number of entries appearing + ! for the first time at node i of the elimination tree (this may be + ! negative). + integer, intent(out) :: st ! stat parmeter for allocate calls + integer, dimension(:), optional, intent(in) :: wt ! weights (eg number of + ! variables in each supervariable) + + integer :: col ! column of matrix associated with piv + integer, dimension(:), allocatable :: first ! first descendants + integer :: i + integer(pkg_type) :: ii + integer :: totalwt + integer, dimension(:), allocatable :: last_nbr ! previous neighbour + integer, dimension(:), allocatable :: last_p ! previous p? + integer :: par ! parent node of piv + integer :: piv ! current pivot + integer :: pp ! last pivot where u was encountered + integer :: lca ! least common ancestor of piv and pp + integer :: u ! current entry in column col + integer :: uwt ! weight of u + integer, dimension(:), allocatable :: vforest ! virtual forest + + ! + ! Determine first descendants, and set cc = 1 for leaves and cc = 0 for + ! non-leaves. + ! + allocate(first(n+1), stat=st) + if(st.ne.0) return + do i = 1, n+1 + first(i) = i + end do + if(present(wt)) then + totalwt = 0 ! Find sum of weights so we can determine non-physical value + do i = 1, n + par = parent(i) + first(par) = min(first(i), first(par)) ! first descendant + if(first(i).eq.i) then ! is it a leaf or not? + cc(i) = wt(invp(i)) + else + cc(i) = 0 + endif + totalwt = totalwt + wt(invp(i)) + end do + cc(n+1) = totalwt + 1 ! Set to non-physical value + else + do i = 1, n + par = parent(i) + first(par) = min(first(i), first(par)) ! first descendant + if(first(i).eq.i) then ! is it a leaf or not? + cc(i) = 1 + else + cc(i) = 0 + endif + end do + cc(n+1) = n + 1 ! Set to non-physical value + endif + + ! + ! We store the partial elimination trees in a virtual forest. It is + ! initialised such that each node is in its own tree to begin with. + ! + allocate(vforest(n+1), stat=st) + if(st.ne.0) return + vforest(:) = 0 + + ! + ! Initialise previous pivot and neightbour arrays to indicate no previous + ! pivot or neightbour. + ! + allocate(last_p(n+1), last_nbr(n+1), stat=st) + if(st.ne.0) return + last_p(:) = 0 + last_nbr(:) = 0 + + ! + ! Determine cc(i), the number of net new entries to pass up tree from + ! node i. + ! + do piv = 1, n + ! Loop over entries in column below the diagonal + col = invp(piv) + do ii = ptr(col), ptr(col+1)-1 + u = perm(row(ii)) + if(u.le.piv) cycle ! not in lower triangular part + + ! Check if entry has been seen by a descendant of this pivot, if + ! so we skip the tests that would first add one to the current + ! pivot's weight before then subtracting it again. + if(first(piv).gt.last_nbr(u)) then + ! Count new entry in current column + uwt = 1 + if(present(wt)) uwt = wt(invp(u)) + cc(piv) = cc(piv) + uwt + + ! Determine least common ancestor of piv and the node at which + ! u was last encountred + pp = last_p(u) + if(pp.ne.0) then + ! u has been seen before, find top of partial elimination + ! tree for node pp + lca = FIND(vforest, pp) + ! prevent double counting of u at node lca + cc(lca) = cc(lca) - uwt + endif + + ! Update last as u has now been seen at piv. + last_p(u) = piv + endif + + ! Record last neighbour of u so we can determine if it has been + ! seen in this subtree before + last_nbr(u) = piv + end do + ! Pass uneliminated variables up to parent + par = parent(piv) + if(present(wt)) then + cc(par) = cc(par) + cc(piv) - wt(invp(piv)) + else + cc(par) = cc(par) + cc(piv) - 1 + endif + + ! place the parent of piv into the same partial elimination tree as piv + vforest(piv) = par ! operation "UNION" from [1] + end do +end subroutine mc78_col_counts_integer + +! Return top most element of tree containing u. +! Implements path compression to speed up subsequent searches. +integer function FIND(vforest, u) + integer, dimension(:), intent(inout) :: vforest + integer, intent(in) :: u + + integer :: current, prev + + prev = -1 + current = u + do while(vforest(current).ne.0) + prev = current + current = vforest(current) + if(vforest(current).ne.0) vforest(prev) = vforest(current) + end do + + FIND = current +end function FIND + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! Supernode amalgamation routines +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +! +! This subroutine identifies (relaxed) supernodes from the elimination tree +! and column counts. +! +! A node, u, and its parent, v, are merged if: +! (a) No new fill-in is introduced i.e. cc(v) = cc(u)-1 +! (b) The number of columns in both u and v is less than nemin +! +! Note: assembly tree must be POSTORDERED on output +subroutine mc78_supernodes(n, realn, parent, cc, sperm, nnodes, sptr, sparent, & + scc, invp, control, info, st, wt, block_pivots) + integer, intent(in) :: n + integer, intent(in) :: realn + integer, dimension(n), intent(in) :: parent ! parent(i) is the + ! parent of supernode i in the elimination/assembly tree. + integer, dimension(n), intent(in) :: cc ! cc(i) is the column count + ! of supernode i, including elements eliminated at supernode i. + integer, dimension(n), intent(out) :: sperm ! on exit contains a permutation + ! from pivot order to a new pivot order with contigous supernodes + integer, intent(out) :: nnodes ! number of supernodes + integer, dimension(n+1), intent(out) :: sptr + integer, dimension(n), intent(out) :: sparent + integer, dimension(n), intent(out) :: scc + integer, dimension(n), intent(in) :: invp + type(mc78_control), intent(in) :: control + integer, intent(inout) :: info + integer, intent(out) :: st ! stat paremter from allocate calls + integer, dimension(n), optional, intent(in) :: wt ! weights (number of vars + ! in each initial node) + integer, dimension(n), optional, intent(in) :: block_pivots ! If + ! present, then matches pivot order and specifies block pivots. + ! block_pivots(i) may take one of the following values: + ! 0 - pivot i is in the middle of a block pivot + ! 1 - pivot i is the first pivot of a block pivot + ! 2 - pivot i is the last pivot of a block pivot + ! 3 - pivot i is a 1x1 pivot + + integer :: i, j, k + integer :: flag + integer, dimension(:), allocatable :: height ! used to track height of tree + logical, dimension(:), allocatable :: mark ! flag array for nodes to finalise + integer, dimension(:), allocatable :: map ! map vertex idx -> supernode idx + integer, dimension(:), allocatable :: nelim ! number of eliminated variables + integer, dimension(:), allocatable :: nvert ! number of elimd supervariables + integer :: node + integer, dimension(:), allocatable :: npar ! temporary array of snode pars + integer :: par ! parent of current node + integer :: shead ! current head of stack + integer, dimension(:), allocatable :: stack ! used to navigate tree + integer :: v + integer, dimension(:), allocatable :: vhead ! heads of vertex linked lists + integer, dimension(:), allocatable :: vnext ! next element in linked lists + integer(long), dimension(:), allocatable :: ezero ! number of explicit zeros + integer, dimension(:), allocatable :: chead ! chead(i) is first child of i + integer, dimension(:), allocatable :: cnext ! cnext(i) is next child of i + integer, dimension(:), allocatable :: child + integer :: nchild + integer :: start ! First pivot in block pivot + integer :: totalwt ! sum of weights + + ! + ! Initialise supernode representation + ! + allocate(nelim(n+1), nvert(n+1), vhead(n+1), vnext(n+1), stack(n), & + height(n+1), mark(n), stat=st) + if(st.ne.0) goto 490 + vnext(:) = -1 + vhead(:) = -1 + height(:) = 1 + + ! Initialise number of variables in each node + if(present(wt)) then + totalwt = 0 + do i = 1, n + nelim(i) = wt(invp(i)) + totalwt = totalwt + wt(invp(i)) + end do + else ! All nodes initially contain a single variable + nelim(:) = 1 + totalwt = n + endif + nvert(:) = 1 + + allocate(map(n+1), npar(n+1), ezero(n+1), stat=st) + if(st.ne.0) goto 490 + + ezero(:) = 0 ! Initially no explicit zeros + ezero(n+1) = huge(ezero) ! ensure root is not merged + + ! Ensure virtual root never gets amlgamated + nelim(n+1) = totalwt+1 + control%nemin + + ! + ! Build child linked lists for nodes; merge block pivots if needed + ! + allocate(chead(n+1), cnext(n+1), child(n), stat=st) + if(st.ne.0) goto 490 + if(present(block_pivots)) then + chead(:) = -1 ! no parent if necessary + do i = realn, 1, -1 ! do in reverse order so come off in original order + if(block_pivots(i).lt.2) cycle + j = parent(i) + if(j.ne.n+1) then + do while(block_pivots(j).lt.2) + j = parent(j) + end do + end if + cnext(i) = chead(j) + chead(j) = i + end do + else + chead(:) = -1 ! no parent if necessary + do i = realn, 1, -1 ! do in reverse order so come off in original order + j = parent(i) + cnext(i) = chead(j) + chead(j) = i + end do + endif + + ! + ! Merge supernodes. + ! + flag = 0 + v = 1 + nnodes = 0 + start=n+2 + do par = 1, n+1 + if(present(block_pivots) .and. par.lt.n+1) then + if(block_pivots(par).lt.2) then + if(start.ge.n+1) start = par + cycle + endif + ! Merge pivots start to par, but don't add to vertex list (yet) + + do node = start, par-1 + ! Add together eliminated variables + nelim(par) = nelim(par) + nelim(node) + nvert(par) = nvert(par) + nvert(node) + + ! nodes have same height + height(par) = max(height(par), height(node)) + end do + endif + + nchild = 0 + node = chead(par) + do while(node.ne.-1) + nchild = nchild + 1 + child(nchild) = node + node = cnext(node) + end do + call sort_by_val(nchild, child, cc, st) + if(st.ne.0) goto 490 + + do j = 1, nchild + node = child(j) + if(do_merge(node, par, nelim, cc, ezero, control, invp, flag, wt)) then + ! Merge contents of node into par. Delete node. + call merge_nodes(node, par, nelim, nvert, vhead, vnext, height, & + ezero, cc) + mark(node) = .false. + else + mark(node) = .true. + endif + end do + + if(present(block_pivots) .and. par.lt.n+1) then + if(block_pivots(par).ge.2) then + ! Add vertices start to par-1 into par + do node = start, par-1 + vnext(node) = vhead(par) + vhead(par) = node + mark(node) = .false. + end do + start = n+2 + endif + endif + end do + + if(flag.ne.0) then + if(control%unit_error.gt.0) write(control%unit_error, "(a)") & + "MC78 Internal Error: Unrecognised amalgamation heuristic." + info = MC78_ERROR_UNKNOWN + return + endif + + do node = 1, realn + if(.not.mark(node)) cycle + ! Node not merged, now a complete supernode + + ! Record start of supernode + nnodes = nnodes + 1 + sptr(nnodes) = v + npar(nnodes) = parent(node) + if(present(wt)) then + scc(nnodes) = cc(node) + nelim(node) - wt(invp(node)) + else + scc(nnodes) = cc(node) + nelim(node) - 1 + endif + + ! Record height in tree of parent vertices + height(parent(node)) = max(height(parent(node)), height(node) + 1) + + ! Determine last vertex of node so we can number backwards + v = v + nvert(node) + k = v + + ! Loop over member vertices of node and number them + shead = 1 + stack(shead) = node + do while(shead.gt.0) + i = stack(shead) + shead = shead - 1 + + ! Order current vertex + k = k - 1 + sperm(i) = k + map(i) = nnodes + + ! Stack successor, if any + if(vnext(i).ne.-1) then + shead = shead + 1 + stack(shead) = vnext(i) + endif + + ! Descend into tree rooted at i + if(vhead(i).ne.-1) then + shead = shead + 1 + stack(shead) = vhead(i) + endif + end do + end do + sptr(nnodes+1) = v ! Record end of final supernode + map(n+1) = nnodes + 1 ! virtual root vertex maps to virtual root sn + npar(nnodes+1) = n + 1 + + ! Handle permutation of empty columns + do i = realn+1, n + sperm(i) = i + end do + + ! Allocate arrays for return and copy data into them correctly + do node = 1, nnodes + par = npar(node) ! parent /vertex/ of supernode + par = map(par) ! parent /node/ of supernode + sparent(node) = par ! store parent + end do + + return + + 490 continue + info = MC78_ERROR_ALLOC + return +end subroutine mc78_supernodes + +! +! Sort n items labelled by idx into decreasing order of val(idx(i)) +! +recursive subroutine sort_by_val(n, idx, val, st) + integer, intent(in) :: n + integer, dimension(n), intent(inout) :: idx + integer, dimension(:), intent(in) :: val + integer, intent(out) :: st + + integer :: ice_idx, ice_val, ik_idx, ik_val + integer :: klo,kor,k,kdummy + + st = 0 + + if(n.ge.minsz_ms) then + call sort_by_val_ms(n, idx, val, st) + else + klo = 2 + kor = n + do kdummy = klo,n + ! items kor, kor+1, .... ,nchild are in order + ice_idx = idx(kor-1) + ice_val = val(ice_idx) + do k = kor,n + ik_idx = idx(k) + ik_val = val(ik_idx) + if (ice_val >= ik_val) exit + idx(k-1) = ik_idx + end do + idx(k-1) = ice_idx + kor = kor - 1 + end do + endif +end subroutine sort_by_val + +! Sort n items labelled by idx into decreasing order of val(idx(i)) +! +! Merge sort version, dramatically improves performance for nodes with large +! numbers of children +! (Passes to simple sort for small numbers of entries) +recursive subroutine sort_by_val_ms(n, idx, val, st) + integer, intent(in) :: n + integer, dimension(n), intent(inout) :: idx + integer, dimension(:), intent(in) :: val + integer, intent(out) :: st + + integer :: i, j, jj, jj2, k, kk, kk2 + integer :: mid + integer, dimension(:), allocatable :: work + + if(n.le.1) return + if(n.lt.minsz_ms) then + call sort_by_val(n, idx, val, st) + return + endif + mid = (n-1)/2 + 1 + + ! Recurse to order half lists + call sort_by_val_ms(mid, idx(1:mid), val, st) + if(st.ne.0) return + call sort_by_val_ms(n - mid, idx(mid+1:n), val, st) + if(st.ne.0) return + + ! Merge two half lists + ! (Take a copy of the first half list so we don't overwrite it) + allocate(work(mid), stat=st) + if(st.ne.0) return + work(:) = idx(1:mid) + j = 1 + k = mid+1 + jj = work(j) + jj2 = val(jj) + kk = idx(k) + kk2 = val(kk) + do i = 1, n + if(jj2.ge.kk2) then + idx(i) = jj + j = j + 1 + if(j.gt.mid) exit + jj = work(j) + jj2 = val(jj) + else + idx(i) = kk + k = k + 1 + if(k.gt.n) exit + kk = idx(k) + kk2 = val(kk) + endif + end do + if(j.le.mid) idx(i+1:n) = work(j:mid) +end subroutine sort_by_val_ms + +! +! Return .true. if we should merge node and par, .false. if we should not +! +logical function do_merge(node, par, nelim, cc, ezero, control, invp, info, wt) + integer, intent(in) :: node ! node to merge and delete + integer, intent(in) :: par ! parent to merge into + integer, dimension(:), intent(in) :: nelim + integer, dimension(:), intent(in) :: cc + integer(long), dimension(:), intent(in) :: ezero + type(mc78_control), intent(in) :: control + integer, dimension(:), intent(in) :: invp + integer, intent(out) :: info + integer, dimension(:), optional, intent(in) :: wt + + real(dp) :: z, ne + + info = 0 + + if(ezero(par).eq.huge(ezero)) then + do_merge = .false. + return + endif + + select case(control%heuristic) + case(1) + ! + ! HSL_MA77 style nemin + ! + if(present(wt)) then + do_merge = (cc(par).eq.cc(node)-wt(invp(node)) .and. & + nelim(par).eq.wt(invp(par))) .or. & + (nelim(par).lt.control%nemin .and. nelim(node).lt.control%nemin) + else + do_merge = (cc(par).eq.cc(node)-1 .and. nelim(par).eq.1) .or. & + (nelim(par).lt.control%nemin .and. nelim(node).lt.control%nemin) + endif + case(2) + ! + ! CHOLMOD style nrelax/zrelax + ! + ! FIXME: currently assumes nodes are square, not trapezoidal + + ! calculate number of non-zeros in new node + z = ezero(par) + ezero(node) + & + (cc(par)-1+nelim(par) - cc(node)+1) * nelim(par) + ! find this as a fraction of total non-zeros in new node + ne = nelim(par) + nelim(node) + z = z / ( (cc(par)-1+ne)*ne ) + + do_merge = (ne .le. control%nrelax(1)) .or. & + (cc(par).eq.cc(node)-1 .and. nelim(par).eq.1) .or. & + (ne .le. control%nrelax(2) .and. z .lt. control%zrelax(1)) .or. & + (ne .le. control%nrelax(3) .and. z .lt. control%zrelax(2)) .or. & + (z .lt. control%zrelax(3)) + case default + ! Note: This bit of code should NEVER execute + do_merge = .false. + info = MC78_ERROR_UNKNOWN + end select +end function do_merge + +! +! This subroutine merges node with its parent, deleting node in the process. +! +subroutine merge_nodes(node, par, nelim, nvert, vhead, vnext, height, ezero, cc) + integer, intent(in) :: node ! node to merge and delete + integer, intent(in) :: par ! parent to merge into + integer, dimension(:), intent(inout) :: nelim + integer, dimension(:), intent(inout) :: nvert + integer, dimension(:), intent(inout) :: vhead + integer, dimension(:), intent(inout) :: vnext + integer, dimension(:), intent(inout) :: height + integer(long), dimension(:), intent(inout) :: ezero + integer, dimension(:), intent(in) :: cc + + ! Add node to list of children merged into par + vnext(node) = vhead(par) + vhead(par) = node + + ! Work out number of explicit zeros in new node + ! FIXME: probably wrong now with weights and block pivots + ezero(par) = ezero(par) + ezero(node) + & + (cc(par)-1+nelim(par) - cc(node) + 1_long) * nelim(par) + + ! Add together eliminated variables + nelim(par) = nelim(par) + nelim(node) + nvert(par) = nvert(par) + nvert(node) + + ! nodes have same height + height(par) = max(height(par), height(node)) +end subroutine merge_nodes + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! Statistics routines +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +! +! This subroutine merely calculates interesting statistics +! +subroutine mc78_stats(nnodes, sptr, scc, nfact, nflops) + integer, intent(in) :: nnodes + integer, dimension(nnodes+1), intent(in) :: sptr + integer, dimension(nnodes), intent(in) :: scc + integer(long), optional, intent(out) :: nfact + integer(long), optional, intent(out) :: nflops + + integer :: j + integer :: m ! number of entries in retangular part of ndoe + integer :: nelim ! width of node + integer :: node ! current node of assembly tree + integer(long) :: r_nfact, r_nflops + + if(.not.present(nfact) .and. .not.present(nflops)) return ! nothing to do + + r_nfact = 0 + r_nflops = 0 + do node = 1, nnodes + nelim = sptr(node+1) - sptr(node) + m = scc(node) - nelim + + ! number of entries + r_nfact = r_nfact + (nelim * (nelim+1)) / 2 ! triangular block + r_nfact = r_nfact + nelim * m ! below triangular block + + ! flops + do j = 1, nelim + r_nflops = r_nflops + (m+j)**2 + end do + end do + + if(present(nfact)) nfact = r_nfact + if(present(nflops)) nflops = r_nflops + + !print *, "n = ", n + !print *, "nnodes = ", nnodes + !print *, "nfact = ", nfact + !print *, "sum cc=", sum(cc(1:n)) + !print *, "nflops = ", nflops +end subroutine mc78_stats + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! Row list routines +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +! +! This subroutine determines the row indices for each supernode +! +subroutine mc78_row_lists_nosvar_integer(n, ptr, row, perm, invp, nnodes, & + sptr, sparent, scc, rptr, rlist, control, info, st) + integer, intent(in) :: n + integer(pkg_type), dimension(n+1), intent(in) :: ptr + integer, dimension(ptr(n+1)-1), intent(in) :: row + integer, dimension(n), intent(in) :: perm + integer, dimension(n), intent(in) :: invp + integer, intent(in) :: nnodes + integer, dimension(nnodes+1), intent(in) :: sptr + integer, dimension(nnodes), intent(in) :: sparent + integer, dimension(nnodes), intent(in) :: scc + integer(long), dimension(nnodes+1), intent(out) :: rptr + integer, dimension(sum(scc(1:nnodes))), intent(out) :: rlist + type(mc78_control), intent(in) :: control + integer, intent(inout) :: info + integer, intent(out) :: st + + integer :: child ! current child of node + integer :: col ! current column of matrix corresponding to piv + integer(long) :: i + integer(long) :: idx ! current insert position into nodes(node)%index + integer :: j + integer :: node ! current node of assembly tree + integer :: piv ! current pivot position + integer, dimension(:), allocatable :: seen ! tag last time index was seen + integer, dimension(:), allocatable :: chead ! head of child linked lists + integer, dimension(:), allocatable :: cnext ! pointer to next child + + ! Allocate and initialise memory + allocate(seen(n), chead(nnodes+1), cnext(nnodes+1), stat=st) + if(st.ne.0) then + info = MC78_ERROR_ALLOC + return + endif + seen(:) = 0 + chead(:) = -1 + + ! Build child linked lists (backwards so pop off in good order) + do node = nnodes, 1, -1 + i = sparent(node) + cnext(node) = chead(i) + chead(i) = node + end do + + ! Loop over nodes from bottom up building row lists. + rptr(1) = 1 + do node = 1, nnodes + + ! Allocate space for row indices + rptr(node+1) = rptr(node) + scc(node) + idx = rptr(node) ! insert position + + ! Add entries eliminated at this node + do piv = sptr(node), sptr(node+1)-1 + seen(piv) = node + rlist(idx) = piv + idx = idx + 1 + end do + + ! Find indices inherited from children + child = chead(node) + do while (child.ne.-1) + do i = rptr(child), rptr(child+1)-1 + j = rlist(i) + if(j.lt.sptr(node)) cycle ! eliminated + if(seen(j).eq.node) cycle ! already seen + seen(j) = node + rlist(idx) = j + idx = idx + 1 + end do + child = cnext(child) + end do + + ! Find new indices from A + do piv = sptr(node), sptr(node+1)-1 + col = invp(piv) + do i = ptr(col), ptr(col+1)-1 + j = perm(row(i)) + if(j.lt.piv) cycle ! in upper triangle + if(seen(j).eq.node) cycle ! already seen in this snode + ! Otherwise, this is a new entry + seen(j) = node + rlist(idx) = j + idx = idx + 1 + end do + end do + + ! Note: following error check won't work with block pivots + !if(idx .ne. rptr(node+1)) then + ! ! Note: This bit of code should NEVER execute + ! if(control%unit_error.gt.0) write(control%unit_error, "(3(a,i8))") & + ! "MC78 Internal Error: node ", node, ": found ", idx-rptr(node), & + ! " entries, but expected to find ", rptr(node+1)-rptr(node) + ! info = MC78_ERROR_UNKNOWN + ! !print *, rlist(1:idx-1) + ! return + !endif + end do +end subroutine mc78_row_lists_nosvar_integer + +subroutine mc78_row_lists_svar_integer(nsvar, svar, n, ptr, row, perm, invp, & + nnodes, sptr, sparent, scc, rptr, rlist, control, info, st) + integer, intent(in) :: nsvar + integer, dimension(nsvar), intent(in) :: svar + integer, intent(in) :: n + integer(pkg_type), dimension(nsvar+1), intent(in) :: ptr + integer, dimension(ptr(nsvar+1)-1), intent(in) :: row + integer, dimension(nsvar), intent(in) :: perm + integer, dimension(nsvar), intent(in) :: invp + integer, intent(in) :: nnodes + integer, dimension(nnodes+1), intent(in) :: sptr + integer, dimension(nnodes), intent(in) :: sparent + integer, dimension(nnodes), intent(in) :: scc + integer(long), dimension(nnodes+1), intent(out) :: rptr + integer, dimension(sum(scc(1:nnodes))), intent(out) :: rlist + type(mc78_control), intent(in) :: control + integer, intent(inout) :: info + integer, intent(out) :: st + + integer :: child ! current child of node + integer :: col ! current column of matrix corresponding to piv + integer(long) :: i + integer(long) :: idx ! current insert position into nodes(node)%index + integer :: j + integer :: k + integer :: node ! current node of assembly tree + integer :: piv ! current pivot position + integer, dimension(:), allocatable :: seen ! tag last time index was seen + integer, dimension(:), allocatable :: chead ! head of child linked lists + integer, dimension(:), allocatable :: cnext ! pointer to next child + integer, dimension(:), allocatable :: svptr ! pointers for row list starts + + ! Allocate and initialise memory + allocate(seen(n), chead(nnodes+1), cnext(nnodes+1), svptr(nsvar+1), stat=st) + if(st.ne.0) return + seen(:) = 0 + chead(:) = -1 + + ! Build svptr array + svptr(1) = 1 + do i = 1, nsvar + svptr(i+1) = svptr(i) + svar(invp(i)) + end do + + ! Build child linked lists (backwards so pop off in good order) + do node = nnodes, 1, -1 + i = sparent(node) + cnext(node) = chead(i) + chead(i) = node + end do + + ! Loop over nodes from bottom up building row lists. + rptr(1) = 1 + do node = 1, nnodes + + ! Allocate space for row indices + rptr(node+1) = rptr(node) + scc(node) + idx = rptr(node) ! insert position + + ! Add entries eliminated at this node + do i = sptr(node), sptr(node+1)-1 + do piv = svptr(i), svptr(i+1)-1 + seen(piv) = nnodes+1 + rlist(idx) = piv + idx = idx + 1 + end do + end do + + ! Find indices inherited from children + child = chead(node) + do while (child.ne.-1) + do i = rptr(child), rptr(child+1)-1 + j = rlist(i) + if(seen(j).ge.node) cycle ! already seen (or eliminated already) + seen(j) = node + rlist(idx) = j + idx = idx + 1 + end do + child = cnext(child) + end do + + ! Find new indices from A + do piv = sptr(node), sptr(node+1)-1 + col = invp(piv) + do i = ptr(col), ptr(col+1)-1 + j = perm(row(i)) + if(seen(svptr(j)).ge.node) cycle ! already seen (or eliminated) + ! Otherwise, this is a new entry + ! Iterate over variables in supervariable + do k = svptr(j), svptr(j+1)-1 + seen(k) = node + rlist(idx) = k + idx = idx + 1 + end do + end do + end do + + if(idx .ne. rptr(node+1)) then + ! Note: This bit of code should NEVER execute + if(control%unit_error.gt.0) write(control%unit_error, "(3(a,i8))") & + "MC78 Internal Error: node ", node, ": found ", idx-rptr(node), & + " entries, but expected to find ", rptr(node+1)-rptr(node) + info = MC78_ERROR_UNKNOWN + !print *, rlist(1:idx-1) + return + endif + end do +end subroutine mc78_row_lists_svar_integer + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! Optimize cache locality routines +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +! +! The following subroutine reorders the elimination order within each node in +! such a way that the order of the variables in +! the "primary" child has ordering agreement with the node. Consider +! the following tree: +! A +! / \ +! B C +! +! and assume B has more partially summed variables than C. Then +! B is the primary child and the ordering of the +! corresponding fully summed variables in the parent A matches the ordering +! of the partially summed variables in B (but not in C). Any additional +! partially summed variables present in C but not in B are then ordered in A +! such that they match C. +! +! This is done by two passes of the tree. +! The first builds a map from variables to the nodes at which +! they are eliminated, and orders the children of each node such +! that the first has the largest number of partially summed variables. +! The second pass uses a depth first search of the now ordered tree. It loops +! over non-fully summed variables and when it first encounters each it will +! place it as the next variable at its elimination node. +! +subroutine mc78_optimize_locality(n, realn, perm, invp, nnodes, sptr, sparent, & + rptr, rlist, st, sort) + + integer, intent(in) :: n ! dimension of system + integer, intent(in) :: realn ! symbolic dimension of system + integer, dimension(n), intent(inout) :: perm ! on exit, will have been + ! reordered for better cache locality + integer, dimension(n), intent(inout) :: invp ! inverse of perm. on exit + ! will have been changed to match new perm + integer, intent(in) :: nnodes ! number of supernodes + integer, dimension(nnodes+1), intent(in) :: sptr + integer, dimension(nnodes), intent(in) :: sparent + integer(long), dimension(nnodes+1), intent(in) :: rptr + integer, dimension(rptr(nnodes+1)-1), intent(inout) :: rlist + integer, intent(out) :: st ! stat parameter + logical, optional, intent(in) :: sort + + integer :: i + integer(long) :: ii ! loop index + integer :: id ! current insert position into list + integer :: k + integer :: j ! temporary variable + integer, allocatable :: list(:) ! list of nodes in a weighted depth-first + ! order such that children are visitied in decreasing number of + ! partially summed variables (ie child with most p.s.v. visited first) + integer, allocatable :: map(:) ! maps variables to nodes where + ! they are eliminated + integer :: node ! current node + integer, allocatable :: ord(:) ! tracks number of variables ordered at + ! each node + integer, allocatable :: perm2(:) ! permutation to apply to perm + integer :: pnode ! parent node + integer :: shead ! current top of stack + integer, allocatable :: stack(:) ! used for depth first walk of tree + integer :: start ! first entry on stack of child from current node + integer, allocatable :: chead(:) ! heads of child linked lists + integer, allocatable :: cnext(:) ! tails of child linked lists + + ! Allocate arrays for depth first search of tree + allocate (map(n), list(nnodes+1), stack(nnodes), chead(nnodes+1), & + cnext(nnodes), stat=st) + if (st /= 0) return + + ! + ! Build elimination map + ! + do node = 1, nnodes + do ii = sptr(node), sptr(node+1)-1 + map(ii) = node + end do + end do + + ! + ! Build child linked lists + ! + chead(:) = -1 ! no child if necessary + do i = nnodes, 1, -1 ! do in reverse order so they come off in original order + j = sparent(i) + cnext(i) = chead(j) + chead(j) = i + end do + + ! + ! Perform depth first search of tree, such that children of a node are + ! visited in order of the number of partially summer variables, largest + ! first. + ! + shead = 1 + stack(shead) = nnodes + 1 + id = nnodes+1 + do while(shead.ne.0) + ! Get node from top of stack + node = stack(shead) + shead = shead - 1 + + ! Number it + list(id) = node + id = id - 1 + + ! Place all its children on the stack + start = shead + 1 + i = chead(node) + do while(i.ne.-1) + shead = shead + 1 + stack(shead) = i + i = cnext(i) + end do + ! Order children just placed on stack such that child with least partially + ! summed variables is at the top + call order_children(shead-start+1, stack(start:shead), nnodes, sptr, & + rptr, st) + if(st.ne.0) return + end do + + ! + ! Next loop over children reordering partially summed variables. + ! + allocate(ord(nnodes),perm2(n),stat=st) + if (st.ne.0) return + + do node = 1, nnodes + ord(node) = sptr(node) + end do + + do k = 1, nnodes + node = list(k) + + ! Order variables first encountered at this node + do ii = rptr(node), rptr(node+1)-1 + j = rlist(ii) + pnode = map(j) + if(pnode .ne. -1) then ! check if we have ordered j already + ! order at parent + perm2(j) = ord(pnode) + ord(pnode) = ord(pnode) + 1 + map(j) = -1 ! mark as ordered + endif + rlist(ii) = perm2(j) + end do + end do + + do i = realn+1, n + perm2(i) = i + end do + + ! + ! Apply permutation to perm and invp + ! + ! Use perm as a temporary variable to permute invp. + perm(1:n) = invp(1:n) + do i = 1, n + j = perm2(i) + invp(j) = perm(i) + end do + + ! Recover invp as inverse of perm + do i = 1, n + perm(invp(i)) = i + end do + + if(present(sort)) then + if(sort) then + call dbl_tr_sort(n, nnodes, rptr, rlist, st) + if(st.ne.0) return + endif + endif +end subroutine mc78_optimize_locality + +! Orders nodes stored in child(1:n) such that the number of partially summed +! variables at each node is decreasing (ie one with least is in posn n) +! +! Simple sort version, good for nodes with small numbers of children +! (Passes to mergesort for large numbers of entries) +recursive subroutine order_children(n, child, nnodes, sptr, rptr, st) + integer, intent(in) :: n + integer, dimension(n), intent(inout) :: child + integer, intent(in) :: nnodes + integer, dimension(nnodes+1), intent(in) :: sptr + integer(long), dimension(nnodes+1), intent(in) :: rptr + integer, intent(out) :: st + + integer :: nelim, m + integer :: k, kdummy, klo, kor + integer :: ice_idx, ice_psum, ik_idx, ik_psum + + st = 0 + + if(n.ge.minsz_ms) then + call order_children_ms(n, child, nnodes, sptr, rptr, st) + else + klo = 2 + kor = n + do kdummy = klo, n + ! items kor, kor+1, .... ,n are in order + ice_idx = child(kor-1) + nelim = sptr(ice_idx+1) - sptr(ice_idx) + m = int(rptr(ice_idx+1) - rptr(ice_idx)) + ice_psum = m - nelim + do k = kor, n + ik_idx = child(k) + nelim = sptr(ik_idx+1) - sptr(ik_idx) + m = int(rptr(ik_idx+1) - rptr(ik_idx)) + ik_psum = m - nelim + if (ice_psum .ge. ik_psum) exit + child(k-1) = ik_idx + end do + child(k-1) = ice_idx + kor = kor - 1 + end do + endif +end subroutine order_children + +! Orders nodes stored in child(1:n) such that the number of partially summed +! variables at each node is decreasing (ie one with least is in posn n) +! +! Merge sort version, dramatically improves performance for nodes with large +! numbers of children +! (Passes to simple sort for small numbers of entries) +recursive subroutine order_children_ms(n, child, nnodes, sptr, rptr, st) + integer, intent(in) :: n + integer, dimension(n), intent(inout) :: child + integer, intent(in) :: nnodes + integer, dimension(nnodes+1), intent(in) :: sptr + integer(long), dimension(nnodes+1), intent(in) :: rptr + integer, intent(out) :: st + + integer :: i, j, jj, jj2, k, kk, kk2, m, nelim + integer :: mid + integer, dimension(:), allocatable :: work + + if(n.le.1) return + if(n.lt.minsz_ms) then + call order_children(n, child, nnodes, sptr, rptr, st) + return + endif + mid = (n-1)/2 + 1 + + ! Recurse to order half lists + call order_children_ms(mid, child(1:mid), nnodes, sptr, rptr, st) + if(st.ne.0) return + call order_children_ms(n - mid, child(mid+1:n), nnodes, sptr, rptr, st) + if(st.ne.0) return + + ! Merge two half lists + ! (Take a copy of the first half list so we don't overwrite it) + allocate(work(mid), stat=st) + if(st.ne.0) return + work(:) = child(1:mid) + j = 1 + k = mid+1 + jj = work(j) + nelim = sptr(jj+1) - sptr(jj) + m = int(rptr(jj+1) - rptr(jj)) + jj2 = m - nelim + kk = child(k) + nelim = sptr(kk+1) - sptr(kk) + m = int(rptr(kk+1) - rptr(kk)) + kk2 = m - nelim + do i = 1, n + if(jj2.ge.kk2) then + child(i) = jj + j = j + 1 + if(j.gt.mid) exit + jj = work(j) + nelim = sptr(jj+1) - sptr(jj) + m = int(rptr(jj+1) - rptr(jj)) + jj2 = m - nelim + else + child(i) = kk + k = k + 1 + if(k.gt.n) exit + kk = child(k) + nelim = sptr(kk+1) - sptr(kk) + m = int(rptr(kk+1) - rptr(kk)) + kk2 = m - nelim + endif + end do + if(j.le.mid) child(i+1:n) = work(j:mid) +end subroutine order_children_ms + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! Assorted auxilary routines +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +! +! Converts piv_size to block_pivots: +! piv_size(i) is size of block pivot containing column i of A +! block_pivots(j) is a flag for pivot j of L and has one of the following values +! 0 - pivot i is in the middle of a block pivot +! 1 - pivot i is the first pivot of a block pivot +! 2 - pivot i is the last pivot of a block pivot +! 3 - pivot i is a 1x1 pivot +! +subroutine convert_to_blk_piv(n, invp, block) + integer, intent(in) :: n + integer, dimension(n), intent(in) :: invp + integer, dimension(n), intent(inout) :: block + + integer, dimension(:), allocatable :: blk2 + integer :: i, cnt + + allocate(blk2(n)) + + ! Take a copy of block so we can change it + blk2(1:n) = block(1:n) + + ! Iterate over pivots in elimination order, recording starts and ends of blks + cnt = blk2(invp(1))-1 ! Initialise for first pivot + block(1) = 1 ! First pivot is start of a block + do i = 2, n + block(i) = 0 + if(cnt.eq.0) then + ! this is first pivot of a block, previous is last pivot of a block + cnt = blk2(invp(i)) + block(i-1) = block(i-1) + 2 + block(i) = block(i) + 1 + endif + cnt = cnt - 1 + end do + block(n) = block(n) + 2 ! end of matrix must end a block pivot + +end subroutine convert_to_blk_piv + +! +! Converts block_pivots back to piv_size: +! block_pivots(j) is a flag for pivot j of L and has one of the following values +! 0 - pivot i is in the middle of a block pivot +! 1 - pivot i is the first pivot of a block pivot +! 2 - pivot i is the last pivot of a block pivot +! 3 - pivot i is a 1x1 pivot +! piv_size(i) is size of block pivot containing column i of A +! +subroutine convert_from_blk_piv(n, perm, block) + integer, intent(in) :: n + integer, dimension(n), intent(in) :: perm + integer, dimension(n), intent(inout) :: block + + integer, dimension(:), allocatable :: blk2 + integer :: i, sa, cnt + + allocate(blk2(n)) + + ! convert first/last notation to block size notation + cnt = -1; sa = -1 ! these values should never actually be used + do i = 1, n + select case(block(i)) + case (0) ! middle pivot of a block + cnt = cnt + 1 + case (1) ! first pivot of a block + sa = i + cnt = 1 + case (2) ! end pivot of a block + cnt = cnt + 1 + block(sa:i) = cnt + case (3) ! only pivot of a block + block(i) = 1 + end select + end do + + ! Permute back to original matrix order + blk2(1:n) = block(1:n) + do i = 1, n + block(i) = blk2(perm(i)) + end do +end subroutine convert_from_blk_piv + +! +! This subroutine copies a matrix pattern and adds subdiagonal entries as +! needed to force block pivots to have a parent-child relation in the +! elimination tree. +! +subroutine mc78_block_prep(n, ptr, row, bptr, brow, perm, invp, block_pivots, & + st) + integer, intent(in) :: n ! Dimension of system + integer(pkg_type), dimension(n+1), intent(in) :: ptr ! Column pointers + integer, dimension(ptr(n+1)-1), intent(in) :: row ! Row indices + integer(pkg_type), dimension(n+1), intent(out) :: bptr ! Column pointers + integer, dimension(:), intent(out) :: brow ! Row indices + integer, dimension(n), intent(inout) :: perm + ! perm(i) must hold position of i in the pivot sequence. + ! On exit, holds the pivot order to be used by factorization. + integer, dimension(n), intent(inout) :: invp ! inverse permutation of perm + integer, dimension(n), intent(inout) :: block_pivots ! Matches pivot order + ! and specifies block pivots. + ! block_pivots(i) may take one of the following values: + ! 0 - pivot i is in the middle of a block pivot + ! 1 - pivot i is the first pivot of a block pivot + ! 2 - pivot i is the last pivot of a block pivot + ! 3 - pivot i is a 1x1 pivot + integer, intent(out) :: st + + integer :: col + integer :: i, j, k + integer(pkg_type) :: ii + integer :: idx + integer :: piv + integer, dimension(:), allocatable :: seen + + allocate(seen(n), stat=st) + if(st.ne.0) return + + ! First pass through ptr and ensure that all block pivots contain no + ! empty columns + perm(:) = invp(:) + piv = 1 + j = 1 + ! Handle variables that are actually used + do while(piv.le.n) + do i = piv, n + if(block_pivots(i).ge.2) exit ! end of block pivot + end do + + k = 0 + do piv = piv, i + if(ptr(perm(piv)).eq.ptr(perm(piv)+1)) cycle + invp(j) = perm(piv) + j = j + 1 + if(k.eq.0) then + ! This is the new start of the block pivot + select case(block_pivots(piv)) + case(0) ! was in the middle. now a start + block_pivots(piv) = 1 + case(2) ! was the end. now a 1x1 + block_pivots(piv) = 3 + end select + endif + k = piv + end do + if(k.ne.0) then + ! The was at least one used variable in the block pivot + select case(block_pivots(k)) + case(0) ! was the middle. now an end + block_pivots(k) = 2 + case(1) ! was the start. now a 1x1 + block_pivots(k) = 3 + end select + endif + piv = i + 1 + end do + ! Handle unused variables + do piv = 1, n + i = perm(piv) + if(ptr(i).eq.ptr(i+1)) then + invp(j) = i + j = j + 1 + block_pivots(piv) = 3 ! Force to 1x1 + endif + end do + ! Map block_pivots in original variable order into sv_map + do i = 1, n + seen(perm(i)) = block_pivots(i) + end do + ! Map sv_map in new pivot order back into block_pivots + do i = 1, n + block_pivots(i) = seen(invp(i)) + end do + ! Reestablish perm + do i = 1, n + perm(invp(i)) = i + end do + + ! Now iterate over cleaned up block pivot sequence + seen(:) = 0 + piv = 1 + idx = 1 + do col = 1, n + piv = perm(col) + bptr(col) = idx + if(block_pivots(piv).eq.3) then + ! 1x1 pivot, just copy the column + idx = idx + int(ptr(col+1) - ptr(col)) + brow(bptr(col):idx-1) = row(ptr(col):ptr(col+1)-1) + else + ! copy the column, but add an entry on subdiagonal(s) + do ii = ptr(col), ptr(col+1)-1 + j = row(ii) + seen(j) = col + brow(idx) = j + idx = idx + 1 + end do + if(block_pivots(piv).ne.1) then + ! Not the first column, add an entry above the diagonal + j = invp(piv-1) + if(seen(j).lt.col) then + brow(idx) = j + idx = idx + 1 + endif + endif + if(block_pivots(piv).ne.2) then + ! Not the last column, add an entry below the diagonal + j = invp(piv+1) + if(seen(j).lt.col) then + brow(idx) = j + idx = idx + 1 + endif + endif + endif + end do + bptr(n+1) = idx +end subroutine mc78_block_prep + +! +! This subroutine will take information concerning a compressed matrix and a +! supervariable map, and will decompress the information so it relates to +! the original matrix +! +subroutine svar_unmap(n, nsvar, svar, perm, invp, nnodes, sinvp, & + snptr, st) + integer, intent(in) :: n + integer, intent(in) :: nsvar + integer, dimension(nsvar), intent(in) :: svar + integer, dimension(n), intent(out) :: perm + integer, dimension(n), intent(inout) :: invp + integer, intent(in) :: nnodes + integer, dimension(nsvar), intent(in) :: sinvp + integer, dimension(nnodes+1), intent(inout) :: snptr + integer, intent(out) :: st + + integer, dimension(:), allocatable :: svptr + integer :: i, j, k + integer :: j1, j2 + integer :: idx + + ! Set up svptr + allocate(svptr(nsvar+1), stat=st) + if(st.ne.0) return + svptr(1) = 1 + do i = 1, nsvar + svptr(i+1) = svptr(i) + svar(i) + end do + + ! Take a copy of invp in perm to ease remapping + perm(:) = invp(:) + + ! Remap invp + idx = 1 + do i = 1, nsvar + j = sinvp(i) + do k = svptr(j), svptr(j+1)-1 + invp(idx) = perm(k) + idx = idx + 1 + end do + end do + + ! Expand supernode pointer + j1 = snptr(1) + do i = 1, nnodes + j2 = snptr(i+1) + snptr(i+1) = snptr(i) + do j = j1, j2-1 + snptr(i+1) = snptr(i+1) + svar(sinvp(j)) + end do + j1 = j2 + end do + + ! Finally, recover perm as inverse of invp + do i = 1, n + perm(invp(i)) = i + end do +end subroutine svar_unmap + + +! +! This subroutine performs a double transpose sort on the row indices of sn +! +subroutine dbl_tr_sort(n, nnodes, rptr, rlist, st) + integer, intent(in) :: n + integer, intent(in) :: nnodes + integer(long), dimension(nnodes+1), intent(in) :: rptr + integer, dimension(rptr(nnodes+1)-1), intent(inout) :: rlist + integer, intent(out) :: st + + integer :: node + integer :: i, j + integer(long) :: ii, jj + integer(long), dimension(:), allocatable :: ptr + integer(long), dimension(:), allocatable :: nptr + integer, dimension(:), allocatable :: col + + allocate(ptr(n+2), stat=st) + if(st.ne.0) return + ptr(:) = 0 + + ! Count number of entries in each row. ptr(i+2) = #entries in row i + do node = 1, nnodes + do ii = rptr(node), rptr(node+1)-1 + j = rlist(ii) ! row entry + ptr(j+2) = ptr(j+2) + 1 + end do + end do + + ! Determine row starts. ptr(i+1) = start of row i + ptr(1:2) = 1 + do i = 1, n + ptr(i+2) = ptr(i+1) + ptr(i+2) + end do + + jj = ptr(n+2)-1 ! total number of entries + allocate(col(jj), stat=st) + if(st.ne.0) return + + ! Now fill in col array + do node = 1, nnodes + do ii = rptr(node), rptr(node+1)-1 + j = rlist(ii) ! row entry + col( ptr(j+1) ) = node + ptr(j+1) = ptr(j+1) + 1 + end do + end do + + ! Finally transpose back into nodes + allocate(nptr(nnodes)) + nptr(:) = rptr(1:nnodes) + do i = 1, n + do jj = ptr(i), ptr(i+1)-1 + node = col(jj) + rlist(nptr(node)) = i + nptr(node) = nptr(node) + 1 + end do + end do +end subroutine dbl_tr_sort + +! +! This subroutine applies the permutation perm to order, invp and cc +! +subroutine apply_perm(n, perm, order, invp, cc, block_pivots) + integer, intent(in) :: n + integer, dimension(n), intent(in) :: perm + integer, dimension(n), intent(inout) :: order + integer, dimension(n), intent(inout) :: invp + integer, dimension(n), intent(inout) :: cc + integer, dimension(n), optional, intent(inout) :: block_pivots + + integer :: i + integer :: j + + ! Use order as a temporary variable to permute cc. Don't care about cc(n+1) + order(1:n) = cc(1:n) + do i = 1, n + j = perm(i) + cc(j) = order(i) + end do + + ! Use order as a temporary variable to permute invp. + order(1:n) = invp(1:n) + do i = 1, n + j = perm(i) + invp(j) = order(i) + end do + + ! Use order as a temporary variable to permute block_pivots if present + if(present(block_pivots)) then + order(1:n) = block_pivots(1:n) + do i = 1, n + j = perm(i) + block_pivots(j) = order(i) + end do + endif + + ! Recover order as inverse of invp + do i = 1, n + order(invp(i)) = i + end do +end subroutine apply_perm + +end module hsl_mc78_integer +! COPYRIGHT (c) 2009 Council for the Central Laboratory +! of the Research Councils +! Original date 20 October 2009. Version 1.0.0. + +! Fortran 95 version of the mc34 package. + +! 18 May 2010 Version 1.1.0 -jhogg +! Create hsl_mc34_integer +! Change from logical Hermitian to integer sym_type to cope with +! skew symmetric matrices as well as Hermitian and symmetric ones. + +! to change precision: +! change _double, kind(0.0d0) +! For complex version: +! change real to complex +! For Hermitian case, take conjugate for upper triangle entries +! For integer version: +! change real to integer, kind(0) + + module hsl_mc34_double + implicit none + private + public mc34_expand + + integer, parameter :: wp = kind(0.0d0) + + interface mc34_expand + module procedure mc34_expand_double + end interface + + contains + + subroutine mc34_expand_double(n,row,ptr,iw,a,sym_type) + +! this subroutine generates the expanded structure for a +! matrix a with a symmetric sparsity pattern given the structure +! for the lower triangular part. diagonal entries need not be present. + + integer, intent(in) :: n ! holds the order of a. + + integer, intent(inout) :: row(*) ! must be set by the user to +! hold the row indices of the lower triangular part of a. +! the entries of a single column must be +! contiguous. the entries of column j must precede those of column +! j+1, and there must be no wasted space between +! columns. row indices within a column may be in any order. on +! exit, it will have the same meaning but will be changed to hold +! the row indices of the entries in the expanded structure. diagonal +! entries need not be present. the new row indices added in the +! upper triangular part will be in order for each column and will +! precede the row indices for the lower triangular part which will +! remain in the input order. + + integer, intent(inout) ::ptr(n+1) ! must be set +! by the user so that ptr(j) is the position in row +! of the first entry in column j and +! ptr(n+1) must be set to one more than the total number of +! entries. on exit, ptr(j) will have the same meaning but +! will be changed to point to the position of the first entry of +! column j in the expanded structure. the new value of +! ptr(n+1) will be one greater than the number of entries in +! the expanded structure. + + integer :: iw(n) ! workspace + + real(wp), optional, intent(inout) :: a(*) +! if present, a(1:ptr(n+1)-1) must be set by the user so that +! a(k) holds the value of the entry in row(k). +! on exit, a will hold the values of the entries in the expanded +! structure corresponding to the output values of row. + + integer, optional, intent(in) :: sym_type +! if present with value 1, matrix is skew symmetric. +! if present with value 2, matrix is hermitian. +! otherwise matrix is symmetric. + + integer :: ckp1 ! used as running pointer + integer :: i,i1,i2,ii,ipkp1,ipos + integer :: j,jstart + integer :: lenk ! number of entries in col. j of original structure + integer :: ndiag ! number diagonal entries present + integer :: newtau ! number of entries in expanded storage + integer :: oldtau ! number of entries in symmetric storage + integer :: r_sym_type ! real sym_type value (used as argument is optional) + + oldtau = ptr(n+1) - 1 + iw(1:n) = 0 + +! iw(j) set to total number entries in col. j of expanded mx. + ndiag = 0 + do j = 1,n + i1 = ptr(j) + i2 = ptr(j+1) - 1 + iw(j) = iw(j) + i2 - i1 + 1 + do ii = i1,i2 + i = row(ii) + if (i /= j) then + iw(i) = iw(i) + 1 + else + ndiag = ndiag + 1 + end if + end do + end do + + newtau = 2*oldtau - ndiag +! ipkp1 points to position after end of column being currently processed + ipkp1 = oldtau + 1 +! ckp1 points to position after end of same column in expanded structure + ckp1 = newtau + 1 +! go through the array in the reverse order placing lower triangular +! elements in appropriate slots. + do j = n,1,-1 + i1 = ptr(j) + i2 = ipkp1 + lenk = i2 - i1 +! jstart is running pointer to position in new structure + jstart = ckp1 +! set ikp1 for next column + ipkp1 = i1 + i2 = i2 - 1 +! run through columns in reverse order +! lower triangular part of col. moved to end of same column in expanded form + if (present(a)) then + do ii = i2,i1,-1 + jstart = jstart - 1 + a(jstart) = a(ii) + row(jstart) = row(ii) + end do + else + do ii = i2,i1,-1 + jstart = jstart - 1 + row(jstart) = row(ii) + end do + end if +! ptr is set to position of first entry in lower triangular part of +! column j in expanded form + ptr(j) = jstart +! set ckp1 for next column + ckp1 = ckp1 - iw(j) +! reset iw(j) to number of entries in lower triangle of column. + iw(j) = lenk + end do + +! again sweep through the columns in the reverse order, this +! time when one is handling column j the upper triangular +! elements a(j,i) are put in position. + do j = n,1,-1 + i1 = ptr(j) + i2 = ptr(j) + iw(j) - 1 +! run down column in order +! note that i is always greater than or equal to j + if (present(a)) then + r_sym_type = 0 ! symmetric + if(present(sym_type)) r_sym_type = sym_type + select case(r_sym_type) + case(1) ! skew symmetric + do ii = i1,i2 + i = row(ii) + if (i == j) cycle + ptr(i) = ptr(i) - 1 + ipos = ptr(i) + a(ipos) = -a(ii) + row(ipos) = j + end do + case default ! symmetric or hermitian + do ii = i1,i2 + i = row(ii) + if (i == j) cycle + ptr(i) = ptr(i) - 1 + ipos = ptr(i) + a(ipos) = a(ii) + row(ipos) = j + end do + end select + else + do ii = i1,i2 + i = row(ii) + if (i == j) cycle + ptr(i) = ptr(i) - 1 + ipos = ptr(i) + row(ipos) = j + end do + end if + end do + ptr(n+1) = newtau + 1 + + end subroutine mc34_expand_double + end module hsl_mc34_double +! COPYRIGHT (c) 2007 Science & Technology Facilities Council +! Original date 1 August 2007. Version 1.0.0. (Sue Dollar) +! +! 1 Decemeber 2010 Version 2.0.0 (Jonathan Hogg) +! Modify interface to allow specificaiton of source and destination ranges, +! substantially rewrite and simplify code, add long integer support, remove +! support for unallocated arrays on input + +! To convert to single: +! s/double/single +! change myreal definition +! To convert to integer: +! s/double/integer +! s/real(myreal)/integer(myinteger) +! s/REAL (kind=myreal)/INTEGER (kind=myinteger) +! change myreal definintion to myinteger +! To convert to long integer: +! s/double/long +! s/real(myreal)/integer(myinteger) +! s/REAL (kind=myreal)/INTEGER (kind=myinteger) +! change myreal definintion to myinteger +! To convert to double complex: +! s/double/complex +! s/COMPLEX (kind=mycomplex)/COMPLEX (kind=mycomplex) +! s/complex(mycomplex)/complex(mycomplex) +! change myreal definition to mycomplex +! To convert to complex: +! s/double/complex +! s/COMPLEX (kind=mycomplex)/COMPLEX (kind=mycomplex) +! s/complex(mycomplex)/complex(mycomplex) +! change myreal definition to mycomplex +MODULE hsl_zb01_integer + + IMPLICIT NONE + PRIVATE + + ! --------------------------------------------------- + ! Precision + ! --------------------------------------------------- + + INTEGER, PARAMETER :: myinteger = kind(1) + INTEGER, PARAMETER :: myint = kind(1) + INTEGER, PARAMETER :: long = selected_int_kind(18) + + ! --------------------------------------------------- + ! Error flags + ! --------------------------------------------------- + INTEGER (kind=myint), PARAMETER :: & + zb01_err_lw = -1, & ! lw<=lkeep/size(w) on input + zb01_err_lw_1 = -2, & ! lw<1 on input + zb01_err_lw_both = -3, & ! both -1 and -2 + zb01_err_lkeep = -4, & ! lkeep>size(w) on input + zb01_err_lkeep_l = -5, & ! lkeep<1 + zb01_err_lkeep_both = -6, &! both -4 and -5 + zb01_err_filename = -7, & ! filename too long + zb01_err_file_size = -8, & ! file_size <2**12 + zb01_err_filename_exists = -9, & ! filename already exists + zb01_err_mode = -10, & ! mode out of range + zb01_err_memory_alloc = -11, & ! memory alloc error + zb01_err_memory_dealloc = -12, & ! memory dealloc error + zb01_err_inquire = -13, & ! error in Fortran inquire statement + zb01_err_open = -14, & ! error in Fortran open statement + zb01_err_read = -15, & ! error in Fortran read statement + zb01_err_write = -16, & ! error in Fortran write statement + zb01_err_close = -17, & ! error in Fortran close statement + zb01_err_src_dest = -18, & ! src and dest sizes do not match + zb01_err_w_unalloc = -19 ! w is unallocated on entry + + ! --------------------------------------------------- + ! Warning flags + ! --------------------------------------------------- + INTEGER (kind=myint), PARAMETER :: & + zb01_warn_lw = 1 ! size_out changed + + ! --------------------------------------------------- + ! Derived type definitions + ! --------------------------------------------------- + + TYPE, PUBLIC :: zb01_info + INTEGER :: flag = 0 ! error/warning flag + INTEGER :: iostat = 0 ! holds Fortran iostat parameter + INTEGER :: stat = 0 ! holds Fortran stat parameter + INTEGER :: files_used = 0 ! unit number scratch file written to + END TYPE zb01_info + + INTERFACE zb01_resize1 + MODULE PROCEDURE zb01_resize1_integer + END INTERFACE + + INTERFACE zb01_resize2 + MODULE PROCEDURE zb01_resize2_integer + END INTERFACE + + PUBLIC zb01_resize1, zb01_resize2 + +CONTAINS + +SUBROUTINE zb01_resize1_integer(w,size_in,size_out,info,src,dest,filename, & + file_size,mode) + + ! -------------------------------------- + ! Expands w to have larger size and copies all or part of the + ! original array into the new array + ! -------------------------------------- + + ! w: is a REAL allocatable array of INTENT(INOUT). Must be allocated on entry. + INTEGER (kind=myinteger), DIMENSION (:), ALLOCATABLE, INTENT (INOUT) :: w + + ! size_in: is an INTEGER OF INTENT(IN). It holds the extent of w on entry. + INTEGER (kind=long), INTENT(IN) :: size_in + + ! size_out: is an INTEGER of INTENT(INOUT). It holds the required size of w + ! on input and the actual size of w on output + INTEGER (kind=long), INTENT (INOUT) :: size_out + + ! info: is of derived type ZB01_info with intent(out). + ! info%flag = ZB01_ERR_LW if 1<=size_out<=lkeep/size(w) on input + ! ZB01_ERR_LW_L if size_out<=0 + ! ZB01_ERR_LKEEP if lkeep>size(w) on input + ! ZB01_ERR_LKEEP_L if lkeep<1 on input + ! ZB01_ERR_FILENAME if filename too long + ! ZB01_ERR_FILE_SIZE if file_size <2**12 + ! ZB01_ERR_FILENAME_EXISTS if filename already exists + ! ZB01_ERR_MODE if mode out of range + ! ZB01_ERR_MEMORY_ALLOC if memory alloc error + ! ZB01_ERR_MEMORY_DEALLOC if memory dealloc error + ! ZB01_ERR_INQUIRE if error in Fortran inquire statement + ! ZB01_ERR_OPEN if error in Fortran open statement + ! ZB01_ERR_READ if error in Fortran read statement + ! ZB01_ERR_WRITE if error in Fortran write statement + ! ZB01_ERR_CLOSE if error in Fortran close statement + ! ZB01_WARN_LW if size_out changed by subroutine + ! ZB01_WARN_W if w not allocated on input + ! info%iostat holds Fortran iostat parameter + ! info%stat holds Fortran stat parameter + ! info%unit holds unit number scratch file written to (negative if + ! not) + TYPE (zb01_info), INTENT (OUT) :: info + + ! src and dest: are OPTIONAL INTEGER arrays of INTENT(IN). They specify + ! the source and destination ranges for any values to be kept. + ! dest(2)-dest(1) must equal src(2)-src(1) and minval(src,dest)>0. + INTEGER (kind=long), DIMENSION(2), INTENT (IN), OPTIONAL :: src + INTEGER (kind=long), DIMENSION(2), INTENT (IN), OPTIONAL :: dest + + ! filename: is an OPTIONAL STRING OF CHARACTERS of INTENT(IN). + ! It holds the name of the file to be used + CHARACTER (len=*), INTENT (IN), OPTIONAL :: filename + + ! file_size: is an OPTIONAL INTEGER of INTENT(IN). It holds the length + ! of + ! of the files to be used if necessary + INTEGER (kind=long), INTENT (IN), OPTIONAL :: file_size + + ! mode: is an OPTIONAL INTEGER of INTENT(IN). If mode==0, then the + ! subroutine will firstly try to use a temporary array. If mode==1, + ! then + ! the subroutine will immediately use temporary files + INTEGER, INTENT (IN), OPTIONAL :: mode + + ! -------------------------------------- + ! Local variables + ! -------------------------------------- + + ! wtemp: is a REAL allocatable array + INTEGER (kind=myinteger), DIMENSION (:), ALLOCATABLE :: wtemp + + ! length to use for wtemp + INTEGER :: lwtemp + + ! Fortran stat parameter + INTEGER :: stat + + INTEGER :: number_files, mode_copy + INTEGER (kind=long) :: file_size_copy + INTEGER, DIMENSION (:), ALLOCATABLE :: units + integer (kind=long), dimension(2,2) :: src_copy, dest_copy + + ! -------------------------------------- + ! Check input for errors + ! -------------------------------------- + + info%flag = 0 + + ! Check w is allocated + if(.not.allocated(w)) then + info%flag = zb01_err_w_unalloc + return + endif + + ! Setup src_copy and dest_copy + src_copy(1,1) = 1 + src_copy(2,1) = size_in + src_copy(1,2) = 1 + src_copy(2,2) = 1 + if(present(src)) then + src_copy(:,1) = src(:) + elseif(present(dest)) then + src_copy(:,1) = dest(:) + endif + dest_copy(:,:) = src_copy(:,:) + if(present(dest)) then + dest_copy(:,1) = dest(:) + endif + + if(minval(src_copy).lt.0 .or. minval(dest_copy).lt.0) & + info%flag = zb01_err_lkeep_l + + if(maxval(src_copy) .gt. size_in) then + if(info%flag.eq.zb01_err_lkeep_l) then + info%flag = zb01_err_lkeep_both + else + info%flag = zb01_err_lkeep + endif + endif + if(info%flag.lt.0) return + + if(any(src_copy(2,:)-src_copy(1,:) .ne. & + dest_copy(2,:)-dest_copy(1,:))) then + info%flag = zb01_err_src_dest + return + endif + + if(size_out.lt.1) then + info%flag = zb01_err_lw_1 + return + endif + if(maxval(dest_copy).gt.size_out) then + info%flag = zb01_err_lw + return + endif + + IF (present(filename)) THEN + IF (len(filename)>400) THEN + ! Error: len(filename) > 400 + info%flag = zb01_err_filename + RETURN + END IF + END IF + + + file_size_copy = 2**22_long + if (present(file_size)) file_size_copy = file_size + + IF (file_size_copy<2**12) THEN + ! Error: filesize < 2**12 + info%flag = zb01_err_file_size + RETURN + END IF + + mode_copy = 0 + if(present(mode)) mode_copy = mode + IF (mode_copy<0 .OR. mode_copy>1) THEN + ! Error: filesize < 2**12 + info%flag = zb01_err_mode + RETURN + END IF + + IF (src_copy(2,1)-src_copy(1,1)+1.le.0) THEN + + ! -------------------------------------- + ! No entries need to be copied + ! -------------------------------------- + + ! -------------------------------------- + ! Check whether expansion is required + ! -------------------------------------- + IF (size_out==size_in) RETURN + + ! -------------------------------------- + ! Deallocate w + ! -------------------------------------- + DEALLOCATE (w,STAT=info%stat) + IF (info%stat>0) THEN + info%flag = zb01_err_memory_dealloc + RETURN + END IF + + ! -------------------------------------- + ! Reallocate w + ! -------------------------------------- + ALLOCATE (w(size_out),STAT=info%stat) + IF (info%stat>0) THEN + ! -------------------------------------- + ! Allocation of w failed + ! -------------------------------------- + info%flag = zb01_err_memory_alloc + RETURN + END IF + + ELSE + + ! -------------------------------------- + ! entries need to be copied + ! -------------------------------------- + + + ! -------------------------------------- + ! Check whether expansion is required + ! -------------------------------------- + IF (size_out==size_in .and. all(src_copy(:,:).eq.dest_copy(:,:))) RETURN + + ! -------------------------------------- + ! Attempt to allocate temporary array + ! -------------------------------------- + stat = 0 + ! Length of temporary array + lwtemp = src_copy(2,1) - src_copy(1,1) + 1 + + ! Allocate temporary array + IF (mode_copy==0) ALLOCATE (wtemp(lwtemp),STAT=stat) + + IF (stat==0 .AND. mode_copy==0) THEN + ! -------------------------------------- + ! Allocation successful + ! -------------------------------------- + + ! -------------------------------------- + ! Copy entries into wtemp + ! -------------------------------------- + wtemp(1:lwtemp) = w(src_copy(1,1):src_copy(2,1)) + !print *, "copy w to wtemp" + + ! -------------------------------------- + ! Deallocate w + ! -------------------------------------- + DEALLOCATE (w,STAT=info%stat) + IF (info%stat>0) THEN + info%flag = zb01_err_memory_dealloc + RETURN + END IF + + ! -------------------------------------- + ! Reallocate w + ! -------------------------------------- + ALLOCATE (w(size_out),STAT=stat) + IF (stat>0) THEN + !print *, "fail alloc of w, copy wtemp to file", src_copy, size_out + + + ! -------------------------------------- + ! Allocation not successful + ! -------------------------------------- + call write_to_file(wtemp, size_in, src_copy, & + units, number_files, file_size_copy, info, filename) + if(info%flag.lt.0) return + + ! -------------------------------------- + ! Deallocate wtemp + ! -------------------------------------- + DEALLOCATE (wtemp,STAT=info%stat) + IF (info%stat>0) THEN + info%flag = zb01_err_memory_dealloc + RETURN + END IF + + ! -------------------------------------- + ! Reallocate w + ! -------------------------------------- + ALLOCATE (w(size_out),STAT=info%stat) + IF (info%stat>0) THEN + !print *, "still can't alloc w. give up (try and preserve)." + ! -------------------------------------- + ! Allocation of w to desired size failed + ! Try size=lwtemp + ! -------------------------------------- + + + ALLOCATE (w(lwtemp),STAT=info%stat) + IF (info%stat==0) THEN + ! -------------------------------------- + ! Reassign lw + ! -------------------------------------- + size_out = lwtemp + info%flag = zb01_warn_lw + + ELSE + !print *, "can't even do that!" + + ! -------------------------------------- + ! Allocation of w still failed - delete files + ! -------------------------------------- + call delete_files(units, number_files, info, filename) + if(info%flag.lt.0) return + + info%flag = zb01_err_memory_alloc + RETURN + END IF + END IF + + !print *, "restore entries to w" + ! -------------------------------------- + ! Copy entries back into w + ! -------------------------------------- + call read_from_file(w, size_in, dest_copy, units, & + number_files, file_size_copy, info, filename) + + RETURN + END IF + + !print *, "copy wtemp back to w" + ! -------------------------------------- + ! Copy entries + ! -------------------------------------- + w(dest_copy(1,1):dest_copy(2,1)) = wtemp(1:lwtemp) + + ! -------------------------------------- + ! Deallocate wtemp + ! -------------------------------------- + DEALLOCATE (wtemp,STAT=info%stat) + IF (info%stat>0) THEN + info%flag = zb01_err_memory_dealloc + RETURN + END IF + RETURN + + ELSE + !print *, "can't alloc wtemp, stow direct in file" + ! -------------------------------------- + ! Allocation not successful + ! -------------------------------------- + call write_to_file(w, size_in, src_copy, units, & + number_files, file_size_copy, info, filename) + if(info%flag.lt.0) return + + ! -------------------------------------- + ! Deallocate w + ! -------------------------------------- + DEALLOCATE (w,STAT=info%stat) + IF (info%stat>0) THEN + info%flag = zb01_err_memory_dealloc + RETURN + END IF + + ! -------------------------------------- + ! Reallocate w + ! -------------------------------------- + ALLOCATE (w(size_out),STAT=info%stat) + IF (info%stat>0) THEN + !print *, "can't alloc w" + ! -------------------------------------- + ! Allocation of w to desired size failed + ! Try size=lwtemp + ! -------------------------------------- + + ALLOCATE (w(lwtemp),STAT=info%stat) + IF (info%stat==0) THEN + ! -------------------------------------- + ! Reassign lw + ! -------------------------------------- + size_out = lwtemp + info%flag = zb01_warn_lw + + ELSE + ! -------------------------------------- + ! Allocation of w failed again - delete files + ! -------------------------------------- + call delete_files(units, number_files, info, filename) + if(info%flag.lt.0) return + + info%flag = zb01_err_memory_alloc + RETURN + END IF + END IF + + !print *, "restore values from file" + call read_from_file(w, size_in, dest_copy, units, & + number_files, file_size_copy, info, filename) + + END IF + END IF + +END SUBROUTINE zb01_resize1_integer + +! --------------------------------------------------------------- + +SUBROUTINE zb01_resize2_integer(w,size_in,size_out,info,src,dest,filename, & + file_size,mode) + + ! -------------------------------------- + ! Expands w to have larger size and copies all or part of the + ! original array into the new array + ! -------------------------------------- + + ! w: is a REAL allocatable array of INTENT(INOUT). Must be allocated on entry. + INTEGER (kind=myinteger), DIMENSION (:,:), ALLOCATABLE, INTENT (INOUT) :: w + + ! size_in: is an INTEGER array INTENT(IN). It holds the extent of w on entry. + INTEGER (kind=long), INTENT(IN) :: size_in(2) + + ! size_out: is an INTEGER array of rank-one with size 2 and of + ! INTENT(INOUT). + ! On input, size_out(1) holds the required number of rows of w and size_out(2) + ! holds + ! the required number of columns of w. On successful output it + ! contains + ! the number of rows and columns that w has. + INTEGER (kind=long), INTENT (INOUT) :: size_out(2) + + ! info: is of derived type ZB01_info with intent(out). + ! info%flag = ZB01_ERR_LW if 1<=size_out<=lkeep/size(w) on input + ! ZB01_ERR_LW_L if size_out<=0 + ! ZB01_ERR_LKEEP if lkeep>size(w) on input + ! ZB01_ERR_LKEEP_L if lkeep<1 on input + ! ZB01_ERR_FILENAME if filename too long + ! ZB01_ERR_FILE_SIZE if file_size <2**12 + ! ZB01_ERR_FILENAME_EXISTS if filename already exists + ! ZB01_ERR_MODE if mode out of range + ! ZB01_ERR_MEMORY_ALLOC if memory alloc error + ! ZB01_ERR_MEMORY_DEALLOC if memory dealloc error + ! ZB01_ERR_INQUIRE if error in Fortran inquire statement + ! ZB01_ERR_OPEN if error in Fortran open statement + ! ZB01_ERR_READ if error in Fortran read statement + ! ZB01_ERR_WRITE if error in Fortran write statement + ! ZB01_ERR_CLOSE if error in Fortran close statement + ! ZB01_WARN_LW if size_out changed by subroutine + ! ZB01_WARN_W if w not allocated on input + ! info%iostat holds Fortran iostat parameter + ! info%stat holds Fortran stat parameter + ! info%files_used holds unit number of files written to + TYPE (zb01_info), INTENT (OUT) :: info + + ! src and dest: are OPTIONAL INTEGER arrays of INTENT(IN). They specify + ! the source and destination ranges for any values to be kept. + ! dest(2,:)-dest(1,:) must equal src(2,:)-src(1,:) and must be + ! non-negative. + INTEGER (kind=long), DIMENSION(2,2), INTENT (IN), OPTIONAL :: src + INTEGER (kind=long), DIMENSION(2,2), INTENT (IN), OPTIONAL :: dest + + ! filename: is an OPTIONAL STRING OF CHARACTERS of INTENT(IN). + ! It holds the name of the file to be used + CHARACTER (len=*), INTENT (IN), OPTIONAL :: filename + + + ! file_size: is an OPTIONAL INTEGER of INTENT(IN). It holds the length + ! of the files to be used if necessary + INTEGER (kind=long), INTENT (IN), OPTIONAL :: file_size + + ! mode: is an OPTIONAL INTEGER of INTENT(IN). If mode==0, then the + ! subroutine will firstly try to use a temporary array. If mode==1, + ! then the subroutine will immediately use temporary files + INTEGER, INTENT (IN), OPTIONAL :: mode + + + ! -------------------------------------- + ! Local variables + ! -------------------------------------- + + ! wtemp: is a REAL allocatable array + INTEGER (kind=myinteger), DIMENSION (:,:), ALLOCATABLE :: wtemp + + ! lengths to use for wtemp + INTEGER :: lwtemp1, lwtemp2 + + ! Fortran stat parameter + INTEGER :: stat + + INTEGER :: number_files, mode_copy + INTEGER (kind=long) :: file_size_copy + INTEGER, DIMENSION (:), ALLOCATABLE :: units + + integer(long), dimension(2,2) :: src_copy, dest_copy + + info%flag = 0 + + ! -------------------------------------- + ! Check input for errors + ! -------------------------------------- + + ! Check w is allocated + if(.not.allocated(w)) then + info%flag = zb01_err_w_unalloc + return + endif + + src_copy(1,1) = 1 + src_copy(2,1) = size_in(1) + src_copy(1,2) = 1 + src_copy(2,2) = size_in(2) + if(present(src)) then + src_copy(:,:) = src(:,:) + elseif(present(dest)) then + src_copy(:,:) = dest(:,:) + endif + dest_copy(:,:) = src_copy(:,:) + if(present(dest)) dest_copy(:,:) = dest(:,:) + + if(minval(src_copy).lt.0 .or. minval(dest_copy).lt.0) & + info%flag = zb01_err_lkeep_l + + if(maxval(src_copy(:,1)).gt.size_in(1) .or. & + maxval(src_copy(:,2)).gt.size_in(2)) then + if(info%flag.eq.zb01_err_lkeep_l) then + info%flag = zb01_err_lkeep_both + else + info%flag = zb01_err_lkeep + endif + endif + if(info%flag.lt.0) return + + ! Note: be careful to only return one error for each dimension + ! (combination of flags possible if dimensions are differently wrong) + ! this is to match v1.0.0 behaviour + if(minval(size_out).lt.1) info%flag = zb01_err_lw_1 + if((maxval(dest_copy(:,1)).gt.size_out(1) .and. size_out(1).ge.1) .or. & + (maxval(dest_copy(:,2)).gt.size_out(2) .and. size_out(2).ge.1)) then + if(info%flag.eq.zb01_err_lw_1) then + info%flag = zb01_err_lw_both + else + info%flag = zb01_err_lw + endif + endif + if(info%flag.lt.0) return + + if(any(src_copy(2,:)-src_copy(1,:) .ne. & + dest_copy(2,:)-dest_copy(1,:))) then + info%flag = zb01_err_src_dest + return + endif + + IF (present(filename)) THEN + IF (len(filename)>400) THEN + ! Error: len(filename) > 400 + info%flag = zb01_err_filename + RETURN + END IF + END IF + + file_size_copy = 2**22_long + if (present(file_size)) file_size_copy = file_size + IF (file_size_copy<2**12) THEN + ! Error: filesize < 2**12 + info%flag = zb01_err_file_size + RETURN + END IF + + mode_copy = 0 + if(present(mode)) mode_copy = mode + IF (mode_copy<0 .OR. mode_copy>1) THEN + ! Error: mode out of range + info%flag = zb01_err_mode + RETURN + END IF + + IF (any(src_copy(2,:)-src_copy(1,:)+1.le.0)) THEN + + ! -------------------------------------- + ! No entries need to be copied + ! -------------------------------------- + + ! -------------------------------------- + ! Check whether expansion is required + ! -------------------------------------- + IF (size_out(1)==size_in(1) .AND. size_out(2)==size_in(2)) RETURN + + ! -------------------------------------- + ! Deallocate w + ! -------------------------------------- + DEALLOCATE (w,STAT=info%stat) + IF (info%stat>0) THEN + info%flag = zb01_err_memory_dealloc + RETURN + END IF + + ! -------------------------------------- + ! Reallocate w + ! -------------------------------------- + ALLOCATE (w(size_out(1),size_out(2)),STAT=info%stat) + IF (info%stat>0) THEN + ! -------------------------------------- + ! Allocation of w failed + ! -------------------------------------- + info%flag = zb01_err_memory_alloc + RETURN + END IF + + ELSE + + ! -------------------------------------- + ! Entries need to be copied + ! -------------------------------------- + + + ! -------------------------------------- + ! Check whether expansion is required + ! -------------------------------------- + IF (size_out(1)==size_in(1) .AND. size_out(2)==size_in(2) .and. & + all(src_copy(:,:).eq.dest_copy(:,:))) RETURN + + ! -------------------------------------- + ! Attempt to allocate temporary array + ! -------------------------------------- + stat = 0 + ! Size of temporary array + lwtemp1 = src_copy(2,1) - src_copy(1,1) + 1 + lwtemp2 = src_copy(2,2) - src_copy(1,2) + 1 + + ! Allocate temporary array + IF (mode_copy==0) ALLOCATE (wtemp(lwtemp1,lwtemp2),STAT=stat) + IF (stat==0 .AND. mode_copy==0) THEN + ! -------------------------------------- + ! Allocation of temporary array successful + ! -------------------------------------- + + ! -------------------------------------- + ! Copy entries into wtemp + ! -------------------------------------- + !print *, "copy to wtemp" + wtemp(1:lwtemp1, 1:lwtemp2) = & + w(src_copy(1,1):src_copy(2,1), src_copy(1,2):src_copy(2,2)) + + ! -------------------------------------- + ! Deallocate w + ! -------------------------------------- + DEALLOCATE (w,STAT=info%stat) + IF (info%stat>0) THEN + info%flag = zb01_err_memory_dealloc + RETURN + END IF + + ! -------------------------------------- + ! Reallocate w + ! -------------------------------------- + ALLOCATE (w(size_out(1),size_out(2)),STAT=info%stat) + IF (info%stat>0) THEN + ! -------------------------------------- + ! Allocation of w not successful so copy temp into files + ! -------------------------------------- + !print *, "copy wtemp to file" + call write_to_file(wtemp, lwtemp1+0_long, src_copy, & + units, number_files, file_size_copy, info, filename) + if(info%flag.lt.0) return + + + ! -------------------------------------- + ! Deallocate wtemp + ! -------------------------------------- + DEALLOCATE (wtemp,STAT=info%stat) + IF (info%stat>0) THEN + info%flag = zb01_err_memory_dealloc + RETURN + END IF + + ! -------------------------------------- + ! Reallocate w + ! -------------------------------------- + ALLOCATE (w(size_out(1),size_out(2)),STAT=info%stat) + IF (info%stat>0) THEN + ! -------------------------------------- + ! Allocation of w to desired size failed + ! Try size=lwtemp + ! -------------------------------------- + + ALLOCATE (w(lwtemp1,lwtemp2),STAT=info%stat) + IF (info%stat==0) THEN + ! -------------------------------------- + ! Reassign size_out + ! -------------------------------------- + size_out(1) = lwtemp1 + size_out(2) = lwtemp2 + info%flag = zb01_warn_lw + + ELSE + ! Delete files + call delete_files(units, number_files, info, filename) + if(info%flag.lt.0) return + + info%flag = zb01_err_memory_alloc + RETURN + END IF + END IF + + !print *, "restore from file1" + call read_from_file(w, size_in(1), dest_copy, & + units, number_files, file_size_copy, info, filename) + + RETURN + + END IF + + ! -------------------------------------- + ! Copy entries + ! -------------------------------------- + w(dest_copy(1,1):dest_copy(2,1), dest_copy(1,2):dest_copy(2,2)) =& + wtemp(1:lwtemp1, 1:lwtemp2) + + ! -------------------------------------- + ! Deallocate wtemp + ! -------------------------------------- + DEALLOCATE (wtemp,STAT=info%stat) + IF (info%stat>0) THEN + info%flag = zb01_err_memory_dealloc + RETURN + END IF + + RETURN + + ELSE + ! -------------------------------------- + ! Allocation of temporary array not successful or mode = 1 + ! -------------------------------------- + call write_to_file(w, size_in(1), src_copy, & + units, number_files, file_size_copy, info, filename) + if(info%flag.lt.0) return + + ! -------------------------------------- + ! Deallocate w + ! -------------------------------------- + DEALLOCATE (w,STAT=info%stat) + IF (info%stat>0) THEN + info%flag = zb01_err_memory_dealloc + RETURN + END IF + + ! -------------------------------------- + ! Reallocate w + ! -------------------------------------- + ALLOCATE (w(size_out(1),size_out(2)),STAT=info%stat) + IF (info%stat>0) THEN + ! -------------------------------------- + ! Allocation of w to desired size failed + ! Try size=lwtemp + ! -------------------------------------- + + ALLOCATE (w(lwtemp1,lwtemp2),STAT=info%stat) + IF (info%stat==0) THEN + ! -------------------------------------- + ! Reassign lw + ! -------------------------------------- + size_out(1) = lwtemp1 + size_out(2) = lwtemp2 + info%flag = zb01_warn_lw + + ELSE + ! -------------------------------------- + ! Allocation of w fialed - Delete files + ! -------------------------------------- + call delete_files(units, number_files, info, filename) + if(info%flag.lt.0) return + + info%flag = zb01_err_memory_alloc + RETURN + END IF + END IF + + call read_from_file(w, size_out(1), dest_copy, & + units, number_files, file_size_copy, info, filename) + + + END IF + + END IF + +END SUBROUTINE zb01_resize2_integer + +subroutine write_to_file(w, ldw, src, units, number_files, & + file_size_copy, info, filename) + integer(long), intent(in) :: ldw ! leading edge of array w + integer(myinteger), dimension(ldw, *), intent(in) :: w + integer(long), dimension(2,2), intent(in) :: src + integer, dimension(:), allocatable, intent(out) :: units + integer, intent(out) :: number_files + integer(long), intent(in) :: file_size_copy + type(ZB01_info), intent(inout) :: info + character(len=*), optional, intent(in) :: filename + + integer :: iolen + CHARACTER (402) :: filename_no + integer(long) :: ncol + integer(long) :: nrow + integer(long) :: total_size + integer :: i, u + CHARACTER (10) :: ci ! Filename extension + logical :: ex + integer(long) :: idx1 ! first index into w + integer(long) :: idx2 ! second index into w + integer(long) :: written ! number of bytes written to current file + integer(long) :: len ! length to write to file + + !print *, "write to file ", src(:,1), ",", src(:,2) + + ! -------------------------------------- + ! Work out number of files required + ! -------------------------------------- + INQUIRE (iolength=iolen) w(1,1) + nrow = src(2,1) - src(1,1) + ncol = src(2,2) - src(1,2) + total_size = nrow*ncol*iolen + + number_files = (total_size-1)/file_size_copy + 1 + info%files_used = number_files + + ! -------------------------------------- + ! Check files do not exist + ! -------------------------------------- + IF (present(filename)) THEN + DO i = 1, number_files + IF (number_files/=1) THEN + WRITE (ci,'(i5)') i + filename_no = trim(filename) // adjustl(ci) + ELSE + filename_no = trim(filename) + END IF + INQUIRE (file=trim(filename_no),exist=ex, iostat=info%iostat) + IF (info%iostat/=0) THEN + info%flag = zb01_err_inquire + return + ELSE IF (ex) THEN + info%flag = zb01_err_filename_exists + return + END IF + END DO + END IF + + + ! -------------------------------------- + ! Allocate array for holding unit numbers + ! -------------------------------------- + i = number_files + IF (present(filename)) i = 1 + ALLOCATE (units(i),STAT=info%stat) + IF (info%stat>0) THEN + info%flag = zb01_err_memory_alloc + return + END IF + + ! -------------------------------------- + ! Find unit numbers + ! -------------------------------------- + call find_units(units, info%iostat) + if(info%iostat.ne.0) return + + ! -------------------------------------- + ! Open temporary files + ! -------------------------------------- + + IF (present(filename)) THEN + DO i = 1, number_files + IF (number_files/=1) THEN + WRITE (ci,'(i5)') i + filename_no = trim(filename) // adjustl(ci) + ELSE + filename_no = trim(filename) + END IF + u = units(1) + OPEN (unit=u,file=trim(filename_no),iostat=info%iostat, & + err=70,status='new',recl=file_size_copy,form='unformatted', & + action='readwrite') + CLOSE (unit=u,iostat=info%iostat,err=80,status='keep') + END DO + ELSE + DO i = 1, number_files + ! write(6,*) 'unit=',units(i) + u = units(i) + OPEN (unit=u,iostat=info%iostat,err=70,status='scratch', & + recl=file_size_copy,form='unformatted',action='readwrite') + END DO + END IF + + ! -------------------------------------- + ! Copy entries + ! -------------------------------------- + + idx1 = src(1,1) + idx2 = src(1,2) + written = 0 + files: do i = 1, number_files + if(present(filename)) then + IF (number_files/=1) THEN + WRITE (ci,'(i5)') i + filename_no = trim(filename) // adjustl(ci) + ELSE + filename_no = trim(filename) + END IF + u = units(1) + OPEN (unit=u,file=trim(filename_no), & + iostat=info%iostat,err=70,status='old',recl=file_size_copy, & + form='unformatted',action='readwrite', & + position='rewind') + else + u = units(i) + endif + do while(file_size_copy - written .gt. 0) + len = src(2,1) - idx1 + 1 ! amount to reach end of current column + len = min(len, (file_size_copy-written)/iolen) ! limit to file size + WRITE (unit=u,iostat=info%iostat,err=90) w(idx1:idx1+len-1,idx2) + written = written + len*iolen + idx1 = idx1 + len + if(idx1.gt.src(2,1)) then + idx1 = src(1,1) + idx2 = idx2 + 1 + if(idx2.gt.src(2,2)) then + if(present(filename)) & + CLOSE (unit=u,iostat=info%iostat,err=80,status='keep') + exit files + endif + endif + end do + if(present(filename)) & + CLOSE (unit=u,iostat=info%iostat,err=80,status='keep') + end do files + + return + + 70 info%flag = zb01_err_open + RETURN + + 80 info%flag = zb01_err_close + RETURN + + 90 info%flag = zb01_err_write + RETURN +end subroutine write_to_file + +! +! This subroutine fills the array units with available unit numbers +! on which files can be opened +! +subroutine find_units(units, iost) + integer, dimension(:), intent(out) :: units + integer, intent(inout) :: iost + + integer :: i ! element of units we need to find + integer :: u ! current unit to try + logical :: ex ! .true. if unit exists + logical :: open ! .true. if unit is not open + + iost = 0 ! initialise in case we do no loop iterations + + u = 8 ! unit to start with + DO i = 1, size(units) + DO u = u, huge(0) + IF (u==100 .OR. u==101 .OR. u==102) CYCLE + INQUIRE (unit=u,iostat=iost,exist=ex, opened=open) + if(iost.ne.0) return + IF (ex .AND. .NOT. open) THEN + units(i) = u + EXIT + END IF + END DO + u = units(i) + 1 + END DO +end subroutine find_units + +subroutine read_from_file(w, ldw, dest, units, number_files, & + file_size_copy, info, filename) + integer(long), intent(in) :: ldw + integer(myinteger), dimension(ldw,*), intent(out) :: w + integer(long), dimension(2,2), intent(in) :: dest + integer, dimension(:), intent(in) :: units + integer, intent(in) :: number_files + integer(long), intent(in) :: file_size_copy + type(ZB01_info), intent(inout) :: info + character(len=*), optional, intent(in) :: filename + + integer :: iolen ! io length of a single element of w + CHARACTER (402) :: filename_no + character (10) :: ci + integer :: i ! current file + integer :: u ! current unit + integer(long) :: idx1 ! first index into w + integer(long) :: idx2 ! second index into w + integer(long) :: done ! number of bytes read from current file + integer(long) :: len ! length to read from file + + !print *, "read from file ", dest(:,1), ",", dest(:,2) + + INQUIRE (iolength=iolen) w(1,1) + + idx1 = dest(1,1) + idx2 = dest(1,2) + done = 0 + files: do i = 1, number_files + if(present(filename)) then + IF (number_files/=1) THEN + WRITE (ci,'(i5)') i + filename_no = trim(filename) // adjustl(ci) + ELSE + filename_no = trim(filename) + END IF + u = units(1) + OPEN (unit=u,file=trim(filename_no), & + iostat=info%iostat,err=70,status='old',recl=file_size_copy, & + form='unformatted',action='readwrite', & + position='rewind') + else + u = units(i) + rewind(u) + endif + do while(file_size_copy - done .gt. 0) + len = dest(2,1) - idx1 + 1 ! amount to reach end of current column + len = min(len, (file_size_copy-done)/iolen) ! limit to file size + READ (unit=u,iostat=info%iostat,err=90) w(idx1:idx1+len-1,idx2) + done = done + len*iolen + idx1 = idx1 + len + if(idx1.gt.dest(2,1)) then + idx1 = dest(1,1) + idx2 = idx2 + 1 + if(idx2.gt.dest(2,2)) then + if(present(filename)) & + CLOSE (unit=u,iostat=info%iostat,err=80,status='delete') + exit files + endif + endif + end do + CLOSE (unit=u,iostat=info%iostat,err=80,status='delete') + end do files + + return + + 70 info%flag = zb01_err_open + RETURN + + 80 info%flag = zb01_err_close + RETURN + + 90 info%flag = zb01_err_read + RETURN +end subroutine read_from_file + +subroutine delete_files(units, number_files, info, filename) + integer, dimension(:), intent(in) :: units + integer, intent(in) :: number_files + type(ZB01_info), intent(inout) :: info + character(len=*), optional, intent(in) :: filename + + character(402) :: filename_no + character(10) :: ci + integer :: i, u + + IF (present(filename)) THEN + do i = 1, number_files + IF (number_files/=1) THEN + WRITE (ci,'(i5)') i + filename_no = trim(filename) // adjustl(ci) + ELSE + filename_no = trim(filename) + END IF + u = units(1) + OPEN (unit=u,file=trim(filename_no), & + iostat=info%iostat,err=70,status='old', & + form='unformatted',action='readwrite') + CLOSE (unit=u,iostat=info%iostat,err=80, & + status='delete') + END DO + ELSE + DO i = 1, number_files + u = units(i) + CLOSE (unit=u,iostat=info%iostat,err=80, & + status='delete') + END DO + END IF + + RETURN + + 70 info%flag = zb01_err_open + RETURN + + 80 info%flag = zb01_err_close + RETURN + +end subroutine delete_files + +END MODULE hsl_zb01_integer +! COPYRIGHT (c) 2010 Science and Technology Facilities Council +! Original date 18 January 2011. Version 1.0.0 +! +! Written by: Jonathan Hogg, John Reid, and Sue Thorne +! +! Version 1.4.1 +! For version history, see ChangeLog +! +module hsl_mc69_double + implicit none + + private + public :: HSL_MATRIX_UNDEFINED, & + HSL_MATRIX_REAL_RECT, HSL_MATRIX_CPLX_RECT, & + HSL_MATRIX_REAL_UNSYM, HSL_MATRIX_CPLX_UNSYM, & + HSL_MATRIX_REAL_SYM_PSDEF, HSL_MATRIX_CPLX_HERM_PSDEF, & + HSL_MATRIX_REAL_SYM_INDEF, HSL_MATRIX_CPLX_HERM_INDEF, & + HSL_MATRIX_CPLX_SYM, & + HSL_MATRIX_REAL_SKEW, HSL_MATRIX_CPLX_SKEW + public :: mc69_cscl_clean, mc69_verify, mc69_print, mc69_csclu_convert, & + mc69_coord_convert, mc69_set_values, mc69_csrlu_convert, & + mc69_cscl_convert, mc69_cscu_convert, mc69_csru_convert, & + mc69_csrl_convert + + integer, parameter :: wp = kind(0d0) + real(wp), parameter :: zero = 0.0_wp + + ! matrix types : real + integer, parameter :: HSL_MATRIX_UNDEFINED = 0 ! undefined/unknown + integer, parameter :: HSL_MATRIX_REAL_RECT = 1 ! real rectangular + integer, parameter :: HSL_MATRIX_REAL_UNSYM = 2 ! real unsymmetric + integer, parameter :: HSL_MATRIX_REAL_SYM_PSDEF = 3 ! real symmetric pos def + integer, parameter :: HSL_MATRIX_REAL_SYM_INDEF = 4 ! real symmetric indef + integer, parameter :: HSL_MATRIX_REAL_SKEW = 6 ! real skew symmetric + + ! matrix types : complex + integer, parameter :: HSL_MATRIX_CPLX_RECT = -1 ! complex rectangular + integer, parameter :: HSL_MATRIX_CPLX_UNSYM = -2 ! complex unsymmetric + integer, parameter :: HSL_MATRIX_CPLX_HERM_PSDEF= -3 ! hermitian pos def + integer, parameter :: HSL_MATRIX_CPLX_HERM_INDEF= -4 ! hermitian indef + integer, parameter :: HSL_MATRIX_CPLX_SYM = -5 ! complex symmetric + integer, parameter :: HSL_MATRIX_CPLX_SKEW = -6 ! complex skew symmetric + + ! Error flags + integer, parameter :: MC69_SUCCESS = 0 + integer, parameter :: MC69_ERROR_ALLOCATION = -1 + integer, parameter :: MC69_ERROR_MATRIX_TYPE = -2 + integer, parameter :: MC69_ERROR_N_OOR = -3 + integer, parameter :: MC69_ERROR_M_NE_N = -4 + integer, parameter :: MC69_ERROR_PTR_1 = -5 + integer, parameter :: MC69_ERROR_PTR_MONO = -6 + integer, parameter :: MC69_ERROR_ROW_BAD_ORDER = -7 + integer, parameter :: MC69_ERROR_ROW_OOR = -8 + integer, parameter :: MC69_ERROR_ROW_DUP = -9 + integer, parameter :: MC69_ERROR_ALL_OOR = -10 + integer, parameter :: MC69_ERROR_MISSING_DIAGONAL = -11 + integer, parameter :: MC69_ERROR_IMAG_DIAGONAL = -12 + integer, parameter :: MC69_ERROR_MISMATCH_LWRUPR = -13 + integer, parameter :: MC69_ERROR_UPR_ENTRY = -14 + integer, parameter :: MC69_ERROR_VAL_MISS = -15 + integer, parameter :: MC69_ERROR_LMAP_MISS = -16 + + + ! warning flags + integer, parameter :: MC69_WARNING_IDX_OOR = 1 + integer, parameter :: MC69_WARNING_DUP_IDX = 2 + integer, parameter :: MC69_WARNING_DUP_AND_OOR = 3 + integer, parameter :: MC69_WARNING_MISSING_DIAGONAL = 4 + integer, parameter :: MC69_WARNING_MISS_DIAG_OORDUP = 5 + +! Possible error returns: + +! MC69_ERROR_ALLOCATION Allocation error +! MC69_ERROR_MATRIX_TYPE Problem with matrix_type +! MC69_ERROR_N_OOR n < 0 or m < 0 +! MC69_ERROR_PTR_1 ptr(1) < 1 +! MC69_ERROR_PTR_MONO Error in ptr (not monotonic) +! MC69_ERROR_VAL_MISS Only one of val_in and val_out is present +! MC69_ERROR_ALL_OOR All the variables in a column are out-of-range +! MC69_ERROR_IMAG_DIAGONAL Hermitian case and diagonal not real +! MC69_ERROR_ROW_BAD_ORDER Entries within a column are not sorted by +! increasing row index +! MC69_ERROR_MISMATCH_LWRUPR Symmetric, skew symmetric or Hermitian: +! entries in upper and lower +! triangles do not match +! MC69_ERROR_MISSING_DIAGONAL Pos def and diagonal entries missing +! MC69_ERROR_ROW_OOR Row contains out-of-range entries +! MC69_ERROR_ROW_DUP Row contains duplicate entries +! MC69_ERROR_M_NE_N Square matrix and m .ne. n + +! Possible warnings: + +! MC69_WARNING_IDX_OOR Out-of-range variable indices +! MC69_WARNING_DUP_IDX Duplicated variable indices +! MC69_WARNING_DUP_AND_OOR out of range and duplicated indices +! MC69_WARNING_MISSING_DIAGONAL Indefinite case and diagonal entries missing +! MC69_WARNING_MISS_DIAG_OORDUP As MC69_WARNING_MISSING_DIAGONAL, and +! out-of-range and/or duplicates + + +!!!!!!!!!!!!!!!!!!!!!!!! +! Internal types +!!!!!!!!!!!!!!!!!!!!!!!! +type dup_list + integer :: src + integer :: dest + type(dup_list), pointer :: next => null() +end type dup_list + +interface mc69_verify + module procedure mc69_verify_double +end interface mc69_verify +interface mc69_print + module procedure mc69_print_double +end interface +interface mc69_cscl_clean + module procedure mc69_cscl_clean_double +end interface mc69_cscl_clean +interface mc69_set_values + module procedure mc69_set_values_double +end interface mc69_set_values +interface mc69_cscl_convert + module procedure mc69_cscl_convert_double +end interface mc69_cscl_convert +interface mc69_cscu_convert + module procedure mc69_cscu_convert_double +end interface mc69_cscu_convert +interface mc69_csclu_convert + module procedure mc69_csclu_convert_double +end interface mc69_csclu_convert +interface mc69_csrl_convert + module procedure mc69_csrl_convert_double +end interface mc69_csrl_convert +interface mc69_csru_convert + module procedure mc69_csru_convert_double +end interface mc69_csru_convert +interface mc69_csrlu_convert + module procedure mc69_csrlu_convert_double +end interface mc69_csrlu_convert +interface mc69_coord_convert + module procedure mc69_coord_convert_double +end interface mc69_coord_convert + +contains + +! +! To verify that a matrix is in HSL format, or identify why it is not +! +subroutine mc69_verify_double(lp, matrix_type, m, n, ptr, row, flag, more, val) + integer, intent(in) :: lp ! output unit + integer, intent(in) :: matrix_type ! what sort of symmetry is there? + integer, intent(in) :: m ! number of rows + integer, intent(in) :: n ! number of columns + integer, dimension(*), intent(in) :: ptr ! column starts + integer, dimension(*), intent(in) :: row ! row indices. + ! Entries within each column must be sorted in order of + ! increasing row index. no duplicates and/or out of range entries allowed. + integer, intent(out) :: flag ! return code + integer, intent(out) :: more ! futher error information (or set to 0) + real(wp), dimension(:), optional, intent(in) :: val ! matrix values,if any + + integer :: col ! current column + character(50) :: context ! Procedure name (used when printing). + logical :: diag ! flag for detection of diagonal + integer :: i + integer :: j + integer :: k + integer :: last ! last row index + logical :: lwronly + integer, dimension(:), allocatable :: ptr2 + integer :: st + + context = 'mc69_verify' + flag = MC69_SUCCESS + + more = 0 ! ensure more is not undefined. + + ! Check matrix_type + select case(matrix_type) + case(0) + ! Undefined matrix. OK, do nothing + case(1:4,6) + ! Real matrix. OK, do nothing + case(-6:-1) + ! Complex matrix. Issue error + flag = MC69_ERROR_MATRIX_TYPE + call mc69_print_flag(context,lp,flag) + return + case default + ! Out of range value. Issue error + flag = MC69_ERROR_MATRIX_TYPE + call mc69_print_flag(context,lp,flag) + return + end select + + ! Check m and n are valid; skip remaining tests if n=0 + if(n < 0 .or. m < 0) then + flag = MC69_ERROR_N_OOR + call mc69_print_flag(context,lp,flag) + return + end if + if(abs(matrix_type).ne.HSL_MATRIX_REAL_RECT .and. m.ne.n) then + flag = MC69_ERROR_M_NE_N + call mc69_print_flag(context,lp,flag) + return + endif + if(n == 0 .or. m == 0) return + + ! Check ptr(1) is valid + if(ptr(1) < 1) then + more = ptr(1) + flag = MC69_ERROR_PTR_1 + call mc69_print_flag(context,lp,flag) + return + end if + + ! Check ptr is monotonically increasing + do i = 1, n + if(ptr(i+1).ge.ptr(i)) cycle ! ptr is monotonically increasing, good. + flag = MC69_ERROR_PTR_MONO + more = i + 1 + call mc69_print_flag(context,lp,flag) + return + end do + + ! Count number of entries in each row. Also: + ! * Check ordering of entries + ! * Check for out-of-range entries + ! * Check for duplicate entries + ! * Lack of diagonal entries in real pos. def. case. + + ! ptr2(k+2) is set to hold the number of entries in row k + allocate(ptr2(m+2), stat=st) + if(st.ne.0) goto 100 + ptr2(:) = 0 + + lwronly = (abs(matrix_type).ne.HSL_MATRIX_UNDEFINED) .and. & + (abs(matrix_type).ne.HSL_MATRIX_REAL_RECT) .and. & + (abs(matrix_type).ne.HSL_MATRIX_REAL_UNSYM) + do col = 1, n + last = -1 + diag = .false. + do j = ptr(col), ptr(col+1)-1 + k = row(j) + ! Check out-of-range + if(k.lt.1 .or. k.gt.m) then + flag = MC69_ERROR_ROW_OOR + more = j + call mc69_print_flag(context,lp,flag) + return + endif + if(lwronly .and. k.lt.col) then + flag = MC69_ERROR_UPR_ENTRY + more = j + call mc69_print_flag(context,lp,flag) + return + endif + if(abs(matrix_type).eq.HSL_MATRIX_REAL_SKEW .and. k.eq.col) then + flag = MC69_ERROR_UPR_ENTRY + more = j + call mc69_print_flag(context,lp,flag) + return + endif + ! Check duplicate + if(k.eq.last) then + flag = MC69_ERROR_ROW_DUP + more = j-1 + call mc69_print_flag(context,lp,flag) + return + endif + ! Check order + if(k.lt.last) then + flag = MC69_ERROR_ROW_BAD_ORDER + more = j + call mc69_print_flag(context,lp,flag) + return + endif + ! Check for diagonal + diag = diag .or. (k.eq.col) + ! Increase count for row k + ptr2(k+2) = ptr2(k+2) + 1 + ! Store value for next loop + last = k + end do + ! If marked as positive definite, check if diagonal was present + if(abs(matrix_type).eq.HSL_MATRIX_REAL_SYM_PSDEF .and. .not.diag) then + flag = MC69_ERROR_MISSING_DIAGONAL + more = col + call mc69_print_flag(context,lp,flag) + return + endif + end do + + if(present(val)) then + select case(matrix_type) + case(HSL_MATRIX_REAL_SYM_PSDEF) + ! Check for positive diagonal entries + do j = 1,n + k = ptr(j) + ! Note: column cannot be empty as previously checked pattern ok + if(real(val(k))<=zero) then + flag = MC69_ERROR_MISSING_DIAGONAL + more = j + call mc69_print_flag(context,lp,flag) + return + end if + end do + end select + endif + + return + + 100 continue ! Allocation error + flag = MC69_ERROR_ALLOCATION + more = st + call mc69_print_flag(context,lp,flag) + return + +end subroutine mc69_verify_double + +!**************************************** + +! +! Pretty prints a matrix as best it can +! +subroutine mc69_print_double(lp, lines, matrix_type, m, n, ptr, row, val, cbase) + integer, intent(in) :: lp ! unit to print on + integer, intent(in) :: lines ! max number of lines to use (ignored if -ive) + integer, intent(in) :: matrix_type ! type of matrix + integer, intent(in) :: m ! number of rows in matrix + integer, intent(in) :: n ! number of cols in matrix + integer, dimension(n+1), intent(in) :: ptr ! column pointers + integer, dimension(ptr(n+1)-1), intent(in) :: row ! row indices + real(wp), dimension(ptr(n+1)-1), optional, intent(in) :: val ! matrix vals + logical, optional, intent(in) :: cbase ! is true, rebase for C + + integer :: col, j, k + integer :: llines + integer, dimension(:,:), allocatable :: dmat + character(len=5) :: mfrmt, nfrmt, nefrmt + character(len=12) :: negfrmt, valfrmt, emptyfrmt + integer :: rebase + + if(lp.lt.0) return ! invalid unit + + ! Check if we need to rebase for C consistent output + rebase = 0 + if(present(cbase)) then + if(cbase) rebase = 1 + endif + + ! Calculate number of lines to play with + llines = huge(llines) + if(lines.gt.0) llines = lines + + ! Print a summary statement about the matrix + mfrmt = digit_format(m) + nfrmt = digit_format(n) + nefrmt = digit_format(ptr(n+1)-1) + + select case(matrix_type) + case(HSL_MATRIX_UNDEFINED) + write(lp, "(a)", advance="no") & + "Matrix of undefined type, dimension " + case(HSL_MATRIX_REAL_RECT) + write(lp, "(a)", advance="no") & + "Real rectangular matrix, dimension " + case(HSL_MATRIX_REAL_UNSYM) + write(lp, "(a)", advance="no") & + "Real unsymmetric matrix, dimension " + case(HSL_MATRIX_REAL_SYM_PSDEF) + write(lp, "(a)", advance="no") & + "Real symmetric positive definite matrix, dimension " + case(HSL_MATRIX_REAL_SYM_INDEF) + write(lp, "(a)", advance="no") & + "Real symmetric indefinite matrix, dimension " + case(HSL_MATRIX_REAL_SKEW) + write(lp, "(a)", advance="no") & + "Real skew symmetric matrix, dimension " + case default + write(lp, "(a,i5)") & + "Unrecognised matrix_type = ", matrix_type + return + end select + write(lp, mfrmt, advance="no") m + write(lp, "(a)", advance="no") "x" + write(lp, nfrmt, advance="no") n + write(lp, "(a)", advance="no") " with " + write(lp, nefrmt, advance="no") ptr(n+1)-1 + write(lp, "(a)") " entries." + + ! immediate return if m = 0 or n = 0 + if (m == 0 .or. n == 0) return + + if(((present(val) .and. n.lt.10) .or. (.not.present(val) .and. n.lt.24)) & + .and. m+1.le.llines) then + ! Print the matrix as if dense + allocate(dmat(m, n)) + dmat(:,:) = 0 + do col = 1, n + do j = ptr(col), ptr(col+1) - 1 + k = row(j) + if(abs(matrix_type).ge.HSL_MATRIX_REAL_SYM_PSDEF) then + dmat(col, k) = -j + endif + dmat(k, col) = j + end do + end do + + select case(n) + case(:6) + valfrmt = "(1x,es12.4)" + negfrmt = valfrmt + emptyfrmt = "(1x,a12)" + case(7) + valfrmt = "(1x,es10.2)" + negfrmt = valfrmt + emptyfrmt = "(1x,a10)" + case(8:) + valfrmt = "(1x,es8.2)" + negfrmt = "(1x,es8.1)" + emptyfrmt = "(1x,a8)" + end select + + do k = 1, m + write(lp,mfrmt,advance="no") k-rebase + write(lp,"(':')",advance="no") + if(present(val)) then + do j = 1, n + if(dmat(k,j).eq.0) then + ! nothing here + write(lp,emptyfrmt,advance="no") ' ' + elseif(dmat(k,j).gt.0) then + if(val(dmat(k,j)).gt.zero) then + write(lp,valfrmt,advance="no") val(dmat(k,j)) + else + write(lp,negfrmt,advance="no") val(dmat(k,j)) + endif + else + ! in upper triangle + select case(matrix_type) + case(HSL_MATRIX_REAL_SYM_INDEF,HSL_MATRIX_REAL_SYM_PSDEF) + if(val(-dmat(k,j)).gt.zero) then + write(lp,valfrmt,advance="no") val(-dmat(k,j)) + else + write(lp,negfrmt,advance="no") val(-dmat(k,j)) + endif + case(HSL_MATRIX_REAL_SKEW) + if(-val(-dmat(k,j)).gt.zero) then + write(lp,valfrmt,advance="no") -val(-dmat(k,j)) + else + write(lp,negfrmt,advance="no") -val(-dmat(k,j)) + endif + end select + endif + end do + else ! pattern only + do j = 1, n + if(dmat(k,j).eq.0) then + ! nothing here + write(lp,"(' ')",advance="no") + else + write(lp,"(1x,'x')",advance="no") + endif + end do + end if + write(lp,"()") + end do + else + ! Output first x entries from each column + llines = llines - 1 ! Discount first info line + if(llines.le.2) return + write(lp, "(a)") "First 4 entries in columns:" + llines = llines - 1 + do col = 1, llines + write(lp, "(a)", advance="no") "Col " + write(lp, nfrmt, advance="no") col-rebase + write(lp, "(':')", advance="no") + do j = ptr(col), min(ptr(col+1)-1, ptr(col)+3) + write(lp, "(' ')", advance="no") + write(lp, mfrmt, advance="no") row(j)-rebase + if(present(val)) then + write(lp, "(' (',es12.4,')')", advance="no") val(j) + endif + end do + write(lp, "()") + end do + endif +end subroutine mc69_print_double + +!**************************************** + +character(len=5) function digit_format(x) + integer, intent(in) :: x + + integer :: ndigit + + ndigit = int(log10(real(x))) + 1 + if(ndigit<10) then + write(digit_format,"('(i',i1,')')") ndigit + else + write(digit_format,"('(i',i2,')')") ndigit + endif +end function digit_format + +!**************************************** + +! Convert a matrix held in lower compressed sparse column format to standard +! HSL format in-place. Duplicates are summed and out-of-range entries are +! remove. For symmetric, skew-symmetric and Hermitian matrices, entries in +! the upper triangle are removed and discarded. +! +! Note: this routine is in place! cscl_convert is the out of place version. +subroutine mc69_cscl_clean_double(matrix_type, m, n, ptr, row, flag, & + val, lmap, map, lp, noor, ndup) + integer, intent(in) :: matrix_type ! what sort of symmetry is there? + integer, intent(in) :: m, n ! matrix dimensions + integer, dimension(n+1), intent(inout) :: ptr ! column pointers + integer, dimension(*), intent(inout) :: row ! row indices + integer, intent(out) :: flag ! return code + real(wp), optional, dimension(*), intent(inout) :: val ! values + integer, optional, intent(out) :: lmap ! size of map + integer, optional, allocatable, dimension(:) :: map + ! map(1:size(val_out)) gives source: map(i) = j means val_out(i)=val(j). + ! map(size(val_out)+1:) gives pairs: map(i:i+1) = (j,k) means + ! val_out(j) = val_out(j) + val(k) + integer, optional, intent(in) :: lp ! unit for printing output if wanted + integer, optional, intent(out) :: noor ! number of out-of-range entries + integer, optional, intent(out) :: ndup ! number of duplicates summed + + + ! Local variables + integer :: col ! current column + character(50) :: context ! Procedure name (used when printing). + integer :: i + integer :: idiag ! number of columns with a diagonal entry + integer :: idup ! number of duplicates summed + integer :: ioor ! number of out-of-range entries + integer :: j + integer :: k + integer :: k1 + integer :: k2 + integer :: l + integer :: nout ! output unit (set to -1 if nout not present) + integer :: st ! stat parameter + integer, allocatable :: temp(:) ! work array + + context = 'mc69_cscl_clean' + + flag = MC69_SUCCESS + + nout = -1 + if(present(lp)) nout = lp + + ! --------------------------------------------- + ! Check that restrictions are adhered to + ! --------------------------------------------- + + ! Note: have to change this test for complex code + if(matrix_type < 0 .or. matrix_type == 5 .or. matrix_type > 6) then + flag = MC69_ERROR_MATRIX_TYPE + call mc69_print_flag(context,nout,flag) + return + end if + + if(m < 0 .or. n < 0) then + flag = MC69_ERROR_N_OOR + call mc69_print_flag(context,nout,flag) + return + end if + + if(abs(matrix_type) > 1 .and. m /= n) then + flag = MC69_ERROR_M_NE_N + call mc69_print_flag(context,nout,flag) + return + end if + + if(ptr(1) < 1) then + flag = MC69_ERROR_PTR_1 + call mc69_print_flag(context,nout,flag) + return + end if + + if(present(map).neqv.present(lmap)) then + flag = MC69_ERROR_LMAP_MISS + call mc69_print_flag(context,nout,flag) + return + end if + + ! --------------------------------------------- + + ! allocate work array + + allocate(temp(m),stat=st) + if(st /= 0) then + flag = MC69_ERROR_ALLOCATION + call mc69_print_flag(context,lp,flag) + return + endif + temp(:) = 0 + + ! count duplicates and out-of-range indices + idup = 0; ioor = 0; idiag = 0 + k = 0 ! last diagonal seen + l = 1 + do col = 1, n + if(ptr(col+1).lt.ptr(col)) then + flag = MC69_ERROR_PTR_MONO + call mc69_print_flag(context,nout,flag) + return + endif + if(abs(matrix_type) > 2) l = col + do i = ptr(col), ptr(col+1)-1 + j = row(i) + if(jm) then + ioor = ioor + 1 + row(i) = m+1 + else + if(temp(j)==col) idup = idup + 1 + temp(j) = col + end if + if(j.eq.col .and. krow(i-1)) then + k = k + 1 + row(k) = row(i) + map(k) = map(i) + val(k) = val(i) + else + map(l) = k + map(l+1) = map(i) + val(k) = val(k) + val(i) + l = l + 2 + end if + end do + end do + else + do col = 1, n + k1 = ptr(col) + ptr(col) = k + 1 + k2 = ptr(col+1)-1 + if(k2-k1<0) cycle + call sort (row(k1), k2-k1+1, map=map(k1:)) + ! Squeeze out duplicates and out-of-range indices + if(row(k1) /= m+1) then + k = k + 1 + row(k) = row(k1) + map(k) = map(k1) + end if + do i = k1+1,k2 + if(row(i) == m+1) then + exit + else if(row(i)>row(i-1)) then + k = k + 1 + row(k) = row(i) + map(k) = map(i) + else + map(l) = k + map(l+1) = map(i) + l = l + 2 + end if + end do + end do + end if + l = ptr(n+1) - 1 + ptr(n+1) = k + 1 + ! Move duplicate pair in map forward + do i = 1, idup*2 + map(k+i) = map(l+i) + end do + else if(present(val)) then + do col = 1, n + k1 = ptr(col) + ptr(col) = k + 1 + k2 = ptr(col+1)-1 + if(k2-k1<0) cycle + call sort (row(k1), k2-k1+1, val=val(k1)) + ! Squeeze out duplicates and out-of-range indices + if(row(k1) /= m+1) then + k = k + 1 + row(k) = row(k1) + val(k) = val(k1) + end if + do i = k1+1,k2 + if(row(i) == m+1) then + exit + else if(row(i)>row(i-1)) then + k = k + 1 + row(k) = row(i) + val(k) = val(i) + else + val(k) = val(k) + val(i) + l = l + 2 + end if + end do + end do + ptr(n+1) = k + 1 + else + do col = 1, n + k1 = ptr(col) + ptr(col) = k + 1 + k2 = ptr(col+1)-1 + if(k2-k1<0) cycle + call sort (row(k1), k2-k1+1) + ! Squeeze out duplicates and out-of-range indices + if(row(k1) /= m+1) then + k = k + 1 + row(k) = row(k1) + end if + do i = k1+1,k2 + if(row(i) == m+1) then + exit + else if(row(i)>row(i-1)) then + k = k + 1 + row(k) = row(i) + end if + end do + end do + ptr(n+1) = k + 1 + end if + + select case(matrix_type) + case(HSL_MATRIX_REAL_SYM_PSDEF) + ! Check for positive diagonal entries + do j = 1,n + k = ptr(j) + ! Note: we're OK if the column is empty - row(k) is still a diagonal + ! entry, however we must be careful that we've not gone past the + ! end of the matrix + if(k.ge.ptr(n+1)) exit + if(row(k)/=j)then + flag = MC69_ERROR_MISSING_DIAGONAL + call mc69_print_flag(context,nout,flag) + return + end if + if(present(val))then + if(val(k)<=zero)then + flag = MC69_ERROR_MISSING_DIAGONAL + call mc69_print_flag(context,nout,flag) + return + end if + end if + end do + end select + + ! Check whether a warning needs to be raised + if(ioor > 0 .or. idup > 0 .or. idiag < n) then + if(ioor > 0) flag = MC69_WARNING_IDX_OOR + if(idup > 0) flag = MC69_WARNING_DUP_IDX + if(idup > 0 .and. ioor > 0) flag = MC69_WARNING_DUP_AND_OOR + if(abs(matrix_type) .ne. HSL_MATRIX_REAL_SKEW) then + if(idiag < n .and. ioor > 0) then + flag = MC69_WARNING_MISS_DIAG_OORDUP + else if(idiag < n .and. idup > 0) then + flag = MC69_WARNING_MISS_DIAG_OORDUP + else if(idiag < n) then + flag = MC69_WARNING_MISSING_DIAGONAL + end if + endif + call mc69_print_flag(context,nout,flag) + end if + +end subroutine mc69_cscl_clean_double + +!**************************************** + +! +! Converts CSC with lower entries only for symmetric, skew-symmetric and +! Hermitian matrices to HSL standard format +! +subroutine mc69_cscl_convert_double(matrix_type, m, n, ptr_in, row_in, ptr_out,& + row_out, flag, val_in, val_out, lmap, map, lp, noor, ndup) + integer, intent(in) :: matrix_type ! what sort of symmetry is there? + integer, intent(in) :: m ! number of rows + integer, intent(in) :: n ! number of columns + integer, dimension(*), intent(in) :: ptr_in ! column pointers on input + integer, dimension(*), intent(in) :: row_in ! row indices on input. + ! These may be unordered within each column and may contain + ! duplicates and/or out-of-range entries + integer, dimension(*), intent(out) :: ptr_out ! col ptr output + integer, allocatable, dimension(:), intent(out) :: row_out ! row indices out + ! Duplicates and out-of-range entries are dealt with and + ! the entries within each column are ordered by increasing row index. + integer, intent(out) :: flag ! return code + real(wp), optional, dimension(*), intent(in) :: val_in ! values input + real(wp), optional, allocatable, dimension(:) :: val_out + ! values on output + integer, optional, intent(out) :: lmap + integer, optional, allocatable, dimension(:) :: map + ! map(1:size(val_out)) gives src: map(i) = j means val_out(i)=val_in(j). + ! map(size(val_out)+1:) gives pairs: map(i:i+1) = (j,k) means + ! val_out(j) = val_out(j) + val_in(k) + integer, optional, intent(in) :: lp ! unit for printing output if wanted + integer, optional, intent(out) :: noor ! number of out-of-range entries + integer, optional, intent(out) :: ndup ! number of duplicates summed + + ! Local variables + character(50) :: context ! Procedure name (used when printing). + integer :: nout ! output unit (set to -1 if nout not present) + + context = 'mc69_cscl_convert' + + nout = -1 + if(present(lp)) nout = lp + + ! Note: have to change this test for complex code + if(matrix_type < 0 .or. matrix_type == 5 .or. matrix_type > 6) then + flag = MC69_ERROR_MATRIX_TYPE + call mc69_print_flag(context,nout,flag) + return + end if + + call mc69_cscl_convert_main(context, 1, matrix_type, m, n, & + ptr_in, row_in, ptr_out, row_out, flag, val_in, val_out, lmap, map, & + lp, noor, ndup) +end subroutine mc69_cscl_convert_double + +!**************************************** + +! +! Converts CSC (with lower entries only for symmetric, skew-symmetric and +! Hermitian matrices) to HSL standard format. +! Also used for symmetric, skew-symmetric and Hermitian matrices in upper +! CSR format +! +subroutine mc69_cscl_convert_main(context, multiplier, matrix_type, m, n, & + ptr_in, row_in, ptr_out, row_out, flag, val_in, val_out, lmap, map, & + lp, noor, ndup) + character(50), intent(in) :: context ! Procedure name (used when printing). + integer, intent(in) :: multiplier ! -1 or 1, differs for csc/csr + integer, intent(in) :: matrix_type ! what sort of symmetry is there? + integer, intent(in) :: m ! number of rows + integer, intent(in) :: n ! number of columns + integer, dimension(*), intent(in) :: ptr_in ! column pointers on input + integer, dimension(*), intent(in) :: row_in ! row indices on input. + ! These may be unordered within each column and may contain + ! duplicates and/or out-of-range entries + integer, dimension(*), intent(out) :: ptr_out ! col ptr output + integer, allocatable, dimension(:), intent(out) :: row_out ! row indices out + ! Duplicates and out-of-range entries are dealt with and + ! the entries within each column are ordered by increasing row index. + integer, intent(out) :: flag ! return code + real(wp), optional, dimension(*), intent(in) :: val_in ! values input + real(wp), optional, allocatable, dimension(:) :: val_out + ! values on output + integer, optional, intent(out) :: lmap + integer, optional, allocatable, dimension(:) :: map + ! map(1:size(val_out)) gives src: map(i) = j means val_out(i)=val_in(j). + ! map(size(val_out)+1:) gives pairs: map(i:i+1) = (j,k) means + ! val_out(j) = val_out(j) + val_in(k) + integer, optional, intent(in) :: lp ! unit for printing output if wanted + integer, optional, intent(out) :: noor ! number of out-of-range entries + integer, optional, intent(out) :: ndup ! number of duplicates summed + + + ! Local variables + integer :: col ! current column + integer :: i + integer :: idiag + integer :: idup + integer :: ioor + integer :: j + integer :: k + integer :: nout ! output unit (set to -1 if nout not present) + integer :: st ! stat parameter + integer :: minidx + + type(dup_list), pointer :: dup + type(dup_list), pointer :: duphead + + ! --------------------------------------------- + ! Check that restrictions are adhered to + ! --------------------------------------------- + + nullify(dup, duphead) + + flag = MC69_SUCCESS + + nout = -1 + if(present(lp)) nout = lp + + if(n < 0 .or. m < 0) then + flag = MC69_ERROR_N_OOR + call mc69_print_flag(context,nout,flag) + return + end if + + if(ptr_in(1) < 1) then + flag = MC69_ERROR_PTR_1 + call mc69_print_flag(context,nout,flag) + return + end if + + if(present(val_in).neqv.present(val_out)) then + flag = MC69_ERROR_VAL_MISS + call mc69_print_flag(context,nout,flag) + return + end if + + if(present(map).neqv.present(lmap)) then + flag = MC69_ERROR_LMAP_MISS + call mc69_print_flag(context,nout,flag) + return + end if + + ! --------------------------------------------- + + ! ensure output arrays are not allocated + + deallocate(row_out,stat=st) + if(present(val_out)) deallocate(val_out,stat=st) + if(present(map)) deallocate(map,stat=st) + + idup = 0; ioor = 0; idiag = 0 + + allocate(row_out(ptr_in(n+1)-1),stat=st) + if(st.ne.0) goto 100 + if(present(map)) then + ! Allocate map for worst case where all bar one are duplicates + allocate(map(2*ptr_in(n+1)-2),stat=st) + k = 1 ! insert location + do col = 1, n + ptr_out(col) = k + if(ptr_in(col+1).lt.ptr_in(col)) then + flag = MC69_ERROR_PTR_MONO + call mc69_print_flag(context,nout,flag) + call cleanup_dup(duphead) + return + endif + minidx = 1 + if(abs(matrix_type).ge.HSL_MATRIX_REAL_SYM_PSDEF) minidx = col + if(abs(matrix_type).eq.HSL_MATRIX_REAL_SKEW) minidx = col + 1 + ! Loop over column, copy across while dropping any out of range entries + do i = ptr_in(col), ptr_in(col+1)-1 + j = row_in(i) + if(j.lt.minidx .or. j.gt.m) then + ! out of range, ignore + ioor = ioor + 1 + cycle + endif + row_out(k) = row_in(i) + map(k) = multiplier*i + k = k + 1 + end do + ! Sort entries into order + i = k - ptr_out(col) + if(i.eq.0 .and. ptr_in(col+1)-ptr_in(col).ne.0) then + flag = MC69_ERROR_ALL_OOR + call mc69_print_flag(context,nout,flag) + call cleanup_dup(duphead) + return + endif + if(i.ne.0) then + call sort(row_out(ptr_out(col):k-1), i, map=map(ptr_out(col):k-1)) + ! Loop over sorted list and drop duplicates + i = k-1 ! last entry in column + k = ptr_out(col)+1 ! insert position + ! Note: we are skipping the first entry as it cannot be a duplicate + if(row_out(ptr_out(col)).eq.col) then + idiag = idiag + 1 + elseif(abs(matrix_type).eq.HSL_MATRIX_REAL_SYM_PSDEF) then + flag = MC69_ERROR_MISSING_DIAGONAL + call mc69_print_flag(context,nout,flag) + call cleanup_dup(duphead) + return + endif + do i = ptr_out(col)+1, i + if(row_out(i).eq.row_out(i-1)) then + ! duplicate, drop + idup = idup + 1 + allocate(dup,stat=st) + if(st.ne.0) goto 100 + dup%next => duphead + duphead => dup + dup%src = map(i) + dup%dest = k-1 + cycle + endif + if(row_out(i).eq.col) idiag = idiag + 1 + row_out(k) = row_out(i) + map(k) = map(i) + k = k + 1 + end do + elseif(abs(matrix_type).eq.HSL_MATRIX_REAL_SYM_PSDEF) then + flag = MC69_ERROR_MISSING_DIAGONAL + call mc69_print_flag(context,nout,flag) + call cleanup_dup(duphead) + return + endif + end do + ptr_out(n+1) = k + lmap = k-1 + elseif(present(val_out)) then + allocate(val_out(ptr_in(n+1)-1),stat=st) + if(st.ne.0) goto 100 + k = 1 ! insert location + do col = 1, n + ptr_out(col) = k + if(ptr_in(col+1).lt.ptr_in(col)) then + flag = MC69_ERROR_PTR_MONO + call mc69_print_flag(context,nout,flag) + return + endif + minidx = 1 + if(abs(matrix_type).ge.HSL_MATRIX_REAL_SYM_PSDEF) minidx = col + if(abs(matrix_type).eq.HSL_MATRIX_REAL_SKEW) minidx = col + 1 + ! Loop over column, copy across while dropping any out of range entries + select case(matrix_type) + case(HSL_MATRIX_REAL_SKEW) + do i = ptr_in(col), ptr_in(col+1)-1 + j = row_in(i) + if(j.lt.minidx .or. j.gt.m) then + ! out of range, ignore + ioor = ioor + 1 + cycle + endif + row_out(k) = row_in(i) + val_out(k) = multiplier*val_in(i) + k = k + 1 + end do + case default + do i = ptr_in(col), ptr_in(col+1)-1 + j = row_in(i) + if(j.lt.minidx .or. j.gt.m) then + ! out of range, ignore + ioor = ioor + 1 + cycle + endif + row_out(k) = row_in(i) + val_out(k) = val_in(i) + k = k + 1 + end do + end select + ! Sort entries into order + i = k - ptr_out(col) + if(i.eq.0 .and. ptr_in(col+1)-ptr_in(col).ne.0) then + flag = MC69_ERROR_ALL_OOR + call mc69_print_flag(context,nout,flag) + return + endif + if(i.ne.0) then + call sort(row_out(ptr_out(col):k-1), i, & + val=val_out(ptr_out(col):k-1)) + ! Loop over sorted list and drop duplicates + i = k-1 ! last entry in column + k = ptr_out(col)+1 ! insert position + ! Note: we are skipping the first entry as it cannot be a duplicate + if(row_out(ptr_out(col)).eq.col) then + idiag = idiag + 1 + elseif(abs(matrix_type).eq.HSL_MATRIX_REAL_SYM_PSDEF) then + flag = MC69_ERROR_MISSING_DIAGONAL + call mc69_print_flag(context,nout,flag) + return + endif + do i = ptr_out(col)+1, i + if(row_out(i).eq.row_out(i-1)) then + ! duplicate, sum then drop from pattern + idup = idup + 1 + val_out(i-1) = val_out(i-1) + val_out(i) + cycle + endif + if(row_out(i).eq.col) idiag = idiag + 1 + row_out(k) = row_out(i) + val_out(k) = val_out(i) + k = k + 1 + end do + elseif(abs(matrix_type).eq.HSL_MATRIX_REAL_SYM_PSDEF) then + flag = MC69_ERROR_MISSING_DIAGONAL + call mc69_print_flag(context,nout,flag) + return + endif + end do + ptr_out(n+1) = k + else ! pattern only + k = 1 ! insert location + do col = 1, n + ptr_out(col) = k + if(ptr_in(col+1).lt.ptr_in(col)) then + flag = MC69_ERROR_PTR_MONO + call mc69_print_flag(context,nout,flag) + return + endif + minidx = 1 + if(abs(matrix_type).ge.HSL_MATRIX_REAL_SYM_PSDEF) minidx = col + if(abs(matrix_type).eq.HSL_MATRIX_REAL_SKEW) minidx = col + 1 + ! Loop over column, copy across while dropping any out of range entries + do i = ptr_in(col), ptr_in(col+1)-1 + j = row_in(i) + if(j.lt.minidx .or. j.gt.m) then + ! out of range, ignore + ioor = ioor + 1 + cycle + endif + row_out(k) = row_in(i) + k = k + 1 + end do + ! Sort entries into order + i = k - ptr_out(col) + if(i.eq.0 .and. ptr_in(col+1)-ptr_in(col).ne.0) then + flag = MC69_ERROR_ALL_OOR + call mc69_print_flag(context,nout,flag) + return + endif + if(i.ne.0) then + call sort(row_out(ptr_out(col):k-1), i) + ! Loop over sorted list and drop duplicates + i = k-1 ! last entry in column + k = ptr_out(col)+1 ! insert position + ! Note: we are skipping the first entry as it cannot be a duplicate + if(row_out(ptr_out(col)).eq.col) then + idiag = idiag + 1 + elseif(abs(matrix_type).eq.HSL_MATRIX_REAL_SYM_PSDEF) then + flag = MC69_ERROR_MISSING_DIAGONAL + call mc69_print_flag(context,nout,flag) + return + endif + do i = ptr_out(col)+1, i + if(row_out(i).eq.row_out(i-1)) then + ! duplicate, drop + idup = idup + 1 + cycle + endif + if(row_out(i).eq.col) idiag = idiag + 1 + row_out(k) = row_out(i) + k = k + 1 + end do + elseif(abs(matrix_type).eq.HSL_MATRIX_REAL_SYM_PSDEF) then + flag = MC69_ERROR_MISSING_DIAGONAL + call mc69_print_flag(context,nout,flag) + return + end if + end do + ptr_out(n+1) = k + endif + + if(present(map)) then + ! Append duplicates to map + do while(associated(duphead)) + idup = idup + 1 + map(lmap+1) = duphead%dest + map(lmap+2) = duphead%src + lmap = lmap + 2 + dup => duphead%next + deallocate(duphead) + duphead => dup + end do + if(present(val_out)) then + allocate(val_out(ptr_out(n+1)-1), stat=st) + if(st.ne.0) goto 100 + call mc69_set_values(matrix_type, lmap, map, val_in, ptr_out(n+1)-1, & + val_out) + endif + endif + + if(present(val_out)) then + select case(matrix_type) + case(HSL_MATRIX_REAL_SYM_PSDEF) + ! Check for positive diagonal entries + do j = 1,n + k = ptr_out(j) + ! ps def case - can't reach here unless all entries have diagonal + if(real(val_out(k))<=zero) then + flag = MC69_ERROR_MISSING_DIAGONAL + call mc69_print_flag(context,nout,flag) + return + end if + end do + end select + endif + + ! Check whether a warning needs to be raised + if(ioor > 0 .or. idup > 0 .or. idiag < n) then + if(ioor > 0) flag = MC69_WARNING_IDX_OOR + if(idup > 0) flag = MC69_WARNING_DUP_IDX + if(idup > 0 .and. ioor > 0) flag = MC69_WARNING_DUP_AND_OOR + if(abs(matrix_type) .ne. HSL_MATRIX_REAL_SKEW) then + if(idiag < n .and. ioor > 0) then + flag = MC69_WARNING_MISS_DIAG_OORDUP + else if(idiag < n .and. idup > 0) then + flag = MC69_WARNING_MISS_DIAG_OORDUP + else if(idiag < n) then + flag = MC69_WARNING_MISSING_DIAGONAL + end if + endif + call mc69_print_flag(context,nout,flag) + end if + + if(present(noor)) noor = ioor + if(present(ndup)) ndup = idup + + return + +100 if(st /= 0) then + flag = MC69_ERROR_ALLOCATION + call mc69_print_flag(context,nout,flag) + end if + +end subroutine mc69_cscl_convert_main + +!**************************************** + +! +! Converts CSC with only upper entries present to CSC with +! only lower entries present and entries +! within each column ordered by increasing row index (HSL standard format) +! +subroutine mc69_cscu_convert_double(matrix_type, n, ptr_in, row_in, ptr_out, & + row_out, flag, val_in, val_out, lmap, map, lp, noor, ndup) + integer, intent(in) :: matrix_type ! what sort of symmetry is there? + integer, intent(in) :: n ! matrix dimension + integer, dimension(*), intent(in) :: ptr_in ! row pointers on input + integer, dimension(*), intent(in) :: row_in ! col indices on input. + ! These may be unordered within each row and may contain + ! duplicates and/or out-of-range entries + integer, dimension(*), intent(out) :: ptr_out ! col ptr output + integer, allocatable, dimension(:), intent(out) :: row_out ! row indices out + ! Duplicates and out-of-range entries are dealt with and + ! the entries within each column are ordered by increasing row index. + integer, intent(out) :: flag ! return code + real(wp), optional, dimension(*), intent(in) :: val_in ! values input + real(wp), optional, allocatable, dimension(:) :: val_out + ! values on output + integer, optional, intent(out) :: lmap + integer, optional, allocatable, dimension(:) :: map + ! map(1:size(val_out)) gives src: map(i) = j means val_out(i)=val_in(j). + ! map(size(val_out)+1:) gives pairs: map(i:i+1) = (j,k) means + ! val_out(j) = val_out(j) + val_in(k) + integer, optional, intent(in) :: lp ! unit for printing output if wanted + integer, optional, intent(out) :: noor ! number of out-of-range entries + integer, optional, intent(out) :: ndup ! number of duplicates summed + + ! Local variables + character(50) :: context ! Procedure name (used when printing). + integer :: nout ! output unit (set to -1 if nout not present) + + context = 'mc69_cscu_convert' + + nout = -1 + if(present(lp)) nout = lp + + ! Note: have to change this test for complex code + if(matrix_type < 3 .or. matrix_type == 5 .or. matrix_type > 6) then + flag = MC69_ERROR_MATRIX_TYPE + call mc69_print_flag(context,nout,flag) + return + end if + + call mc69_csrl_convert_main(context, -1, matrix_type, n, n, & + ptr_in, row_in, ptr_out, row_out, flag, val_in, val_out, lmap, map, & + lp, noor, ndup) +end subroutine mc69_cscu_convert_double + +!**************************************** + +! +! Converts CSC with both lower and upper entries present to CSC with +! only lower entries present and entries +! within each column ordered by increasing row index (HSL standard format) +! +subroutine mc69_csclu_convert_double(matrix_type, n, ptr_in, row_in, ptr_out, & + row_out, flag, val_in, val_out, lmap, map, lp, noor, ndup) + integer, intent(in) :: matrix_type ! what sort of symmetry is there? + integer, intent(in) :: n ! matrix dimension + integer, dimension(*), intent(in) :: ptr_in ! column pointers on input + integer, dimension(*), intent(in) :: row_in ! row indices on input. + ! These may be unordered within each column and may contain + ! duplicates and/or out-of-range entries + integer, dimension(*), intent(out) :: ptr_out ! col ptr output + integer, allocatable, dimension(:), intent(out) :: row_out ! row indices out + ! Duplicates and out-of-range entries are dealt with and + ! the entries within each column are ordered by increasing row index. + integer, intent(out) :: flag ! return code + real(wp), optional, dimension(*), intent(in) :: val_in ! values input + real(wp), optional, allocatable, dimension(:) :: val_out + ! values on output + integer, optional, intent(out) :: lmap + integer, optional, allocatable, dimension(:) :: map + ! map(1:size(val_out)) gives src: map(i) = j means val_out(i)=val_in(j). + ! map(size(val_out)+1:) gives pairs: map(i:i+1) = (j,k) means + ! val_out(j) = val_out(j) + val_in(k) + integer, optional, intent(in) :: lp ! unit for printing output if wanted + integer, optional, intent(out) :: noor ! number of out-of-range entries + integer, optional, intent(out) :: ndup ! number of duplicates summed + + ! Local variables + character(50) :: context ! Procedure name (used when printing). + integer :: nout ! output unit (set to -1 if nout not present) + + context = 'mc69_csclu_convert' + + nout = -1 + if(present(lp)) nout = lp + + ! Note: have to change this test for complex code + if(matrix_type < 3 .or. matrix_type == 5 .or. matrix_type > 6) then + flag = MC69_ERROR_MATRIX_TYPE + call mc69_print_flag(context,nout,flag) + return + end if + + call mc69_csclu_convert_main(context, -1, matrix_type, n, & + ptr_in, row_in, ptr_out, row_out, flag, val_in, val_out, lmap, map, & + lp, noor, ndup) +end subroutine mc69_csclu_convert_double + +!**************************************** + +subroutine mc69_csclu_convert_main(context, multiplier, matrix_type, n, & + ptr_in, row_in, ptr_out, row_out, flag, val_in, val_out, lmap, map, & + lp, noor, ndup) + character(50), intent(in) :: context ! Procedure name (used when printing). + integer, intent(in) :: multiplier ! -1 for upr source, +1 for lwr + integer, intent(in) :: matrix_type ! what sort of symmetry is there? + integer, intent(in) :: n ! matrix dimension + integer, dimension(*), intent(in) :: ptr_in ! column pointers on input + integer, dimension(*), intent(in) :: row_in ! row indices on input. + ! These may be unordered within each column and may contain + ! duplicates and/or out-of-range entries + integer, dimension(*), intent(out) :: ptr_out ! col ptr output + integer, allocatable, dimension(:), intent(out) :: row_out ! row indices out + ! Duplicates and out-of-range entries are dealt with and + ! the entries within each column are ordered by increasing row index. + integer, intent(out) :: flag ! return code + real(wp), optional, dimension(*), intent(in) :: val_in ! values input + real(wp), optional, allocatable, dimension(:) :: val_out + ! values on output + integer, optional, intent(out) :: lmap + integer, optional, allocatable, dimension(:) :: map + ! map(1:size(val_out)) gives src: map(i) = j means val_out(i)=val_in(j). + ! map(size(val_out)+1:) gives pairs: map(i:i+1) = (j,k) means + ! val_out(j) = val_out(j) + val_in(k) + integer, optional, intent(in) :: lp ! unit for printing output if wanted + integer, optional, intent(out) :: noor ! number of out-of-range entries + integer, optional, intent(out) :: ndup ! number of duplicates summed + + + ! Local variables + integer :: col ! current column + integer :: i + integer :: idiag + integer :: idup + integer :: ioor + integer :: j + integer :: k + integer :: nlwr ! number of strictly lower triangular entries + integer :: npre + integer :: nupr ! number of strictly upper triangular entries + integer :: ne + integer :: nout ! output unit (set to -1 if nout not present) + integer :: st ! stat parameter + + type(dup_list), pointer :: dup + type(dup_list), pointer :: duphead + + nullify(dup, duphead) + + ! --------------------------------------------- + ! Check that restrictions are adhered to + ! --------------------------------------------- + + flag = MC69_SUCCESS + + nout = -1 + if(present(lp)) nout = lp + + if(n < 0) then + flag = MC69_ERROR_N_OOR + call mc69_print_flag(context,nout,flag) + return + end if + + if(ptr_in(1) < 1) then + flag = MC69_ERROR_PTR_1 + call mc69_print_flag(context,nout,flag) + return + end if + + if(present(val_in).neqv.present(val_out)) then + flag = MC69_ERROR_VAL_MISS + call mc69_print_flag(context,nout,flag) + return + end if + + if(present(map).neqv.present(lmap)) then + flag = MC69_ERROR_LMAP_MISS + call mc69_print_flag(context,nout,flag) + return + end if + + ! --------------------------------------------- + + ! allocate output and work arrays + + deallocate(row_out,stat=st) + if(present(val_out)) deallocate(val_out,stat=st) + if(present(map)) deallocate(map,stat=st) + + + ! --------------------------------------------- + ! check for duplicates and/or out-of-range. check diagonal present. + ! first do the case where values not present + + idup = 0; ioor = 0; idiag = 0 + nlwr = 0; nupr = 0 + + ! + ! First pass, count number of entries in each row of the matrix. + ! Count is at an offset of 1 to allow us to play tricks + ! (ie. ptr_out(i+1) set to hold number of entries in column i + ! of expanded matrix). + ! Excludes out of range entries. Includes duplicates. + ! + ptr_out(1:n+1) = 0 + k = 0 ! last diagonal found + do col = 1, n + if(ptr_in(col+1).lt.ptr_in(col)) then + flag = MC69_ERROR_PTR_MONO + call mc69_print_flag(context,nout,flag) + return + endif + npre = nlwr + nupr + idiag + if(ptr_in(col+1).eq.ptr_in(col)) cycle ! no entries in column + do i = ptr_in(col), ptr_in(col+1)-1 + j = row_in(i) + if(j.lt.1 .or. j.gt.n) then + ioor = ioor + 1 + cycle + endif + if(j.eq.col .and. abs(matrix_type).eq.HSL_MATRIX_REAL_SKEW) then + ioor = ioor + 1 + cycle + endif + if(j.gt.col) then + nlwr = nlwr + 1 + cycle + endif + if(j.lt.col) then + nupr = nupr + 1 + elseif(j.ne.k) then ! diagonal entry (not second in column) + idiag = idiag + 1 + k = col + endif + ptr_out(j+1) = ptr_out(j+1) + 1 + end do + if(nlwr+nupr+idiag.eq.npre) then + ! Column contains only out of range entries + flag = MC69_ERROR_ALL_OOR + call mc69_print_flag(context,nout,flag) + return + endif + end do + + ! Check for missing diagonals in pos def case + ! Note: change this test for complex case + if(abs(matrix_type) == HSL_MATRIX_REAL_SYM_PSDEF) then + if(idiag < n) then + flag = MC69_ERROR_MISSING_DIAGONAL + call mc69_print_flag(context,nout,flag) + return + end if + end if + + ! Check number in lower triangle = number in upper triangle + if(nlwr .ne. nupr) then + flag = MC69_ERROR_MISMATCH_LWRUPR + call mc69_print_flag(context,nout,flag) + return + endif + + ! Determine column starts for transposed matrix such + ! that column i starts at ptr_out(i+1) + ne = 0 + ptr_out(1) = 1 + do i = 1, n + ne = ne + ptr_out(i+1) + ptr_out(i+1) = ptr_out(i) + ptr_out(i+1) + end do + do i = n,1,-1 + ptr_out(i+1) = ptr_out(i) + end do + + ! + ! Second pass, drop entries into place for conjugate of transposed + ! matrix + ! + allocate(row_out(ne), stat=st) + if(st.ne.0) goto 100 + if(present(map)) then + ! Needs to be this big for worst case: all entries are repeat of same + allocate(map(2*(ptr_in(n+1)-1)), stat=st) + if(st.ne.0) goto 100 + do col = 1, n + do i = ptr_in(col), ptr_in(col+1)-1 + j = row_in(i) + if(j.lt.1 .or. j.gt.col) cycle ! ignore oor and lwr triangle entries + if(j.eq.col .and. abs(matrix_type).eq.HSL_MATRIX_REAL_SKEW) cycle + k = ptr_out(j+1) + ptr_out(j+1) = k + 1 + row_out(k) = col + map(k) = multiplier*i + end do + end do + elseif(present(val_out)) then + allocate(val_out(2*(ptr_in(n+1)-1)), stat=st) + if(st.ne.0) goto 100 + select case(matrix_type) + case(HSL_MATRIX_REAL_SKEW) + do col = 1, n + do i = ptr_in(col), ptr_in(col+1)-1 + j = row_in(i) + if(j.lt.1 .or. j.ge.col) cycle + k = ptr_out(j+1) + ptr_out(j+1) = k + 1 + row_out(k) = col + val_out(k) = multiplier*val_in(i) + end do + end do + case(HSL_MATRIX_REAL_SYM_PSDEF, HSL_MATRIX_REAL_SYM_INDEF) + do col = 1, n + do i = ptr_in(col), ptr_in(col+1)-1 + j = row_in(i) + if(j.lt.1 .or. j.gt.col) cycle + k = ptr_out(j+1) + ptr_out(j+1) = k + 1 + row_out(k) = col + val_out(k) = val_in(i) + end do + end do + end select + else ! neither val_out nor map present + do col = 1, n + do i = ptr_in(col), ptr_in(col+1)-1 + j = row_in(i) + if(j.lt.1 .or. j.gt.col) cycle + if(j.eq.col .and. abs(matrix_type).eq.HSL_MATRIX_REAL_SKEW) cycle + k = ptr_out(j+1) + ptr_out(j+1) = k + 1 + row_out(k) = col + end do + end do + endif + + ! + ! Third pass, removal of duplicates (no sort required by construction) + ! + if(present(map)) then + k = 1 ! insert position + do col = 1, n + i = ptr_out(col) + ptr_out(col) = k + if(ptr_out(col+1).eq.i) cycle ! no entries + ! Move first entry of column forward + row_out(k) = row_out(i) + map(k) = map(i) + k = k + 1 + ! Loop over remaining entries + do i = i+1, ptr_out(col+1)-1 + if(row_out(i).eq.row_out(k-1)) then + ! Duplicate + allocate(dup,stat=st) + if(st.ne.0) goto 100 + dup%next => duphead + duphead => dup + dup%src = map(i) + dup%dest = k-1 + cycle + endif + ! Pull entry forwards + row_out(k) = row_out(i) + map(k) = map(i) + k = k + 1 + end do + end do + ptr_out(n+1) = k + lmap = k-1 + elseif(present(val_out)) then + k = 1 ! insert position + do col = 1, n + i = ptr_out(col) + ptr_out(col) = k + if(ptr_out(col+1).eq.i) cycle ! no entries + ! Move first entry of column forward + row_out(k) = row_out(i) + val_out(k) = val_out(i) + k = k + 1 + ! Loop over remaining entries + do i = i+1, ptr_out(col+1)-1 + if(row_out(i).eq.row_out(k-1)) then + ! Duplicate + idup = idup + 1 + val_out(k-1) = val_out(k-1) + val_out(i) + cycle + endif + ! Pull entry forwards + row_out(k) = row_out(i) + val_out(k) = val_out(i) + k = k + 1 + end do + end do + ptr_out(n+1) = k + else ! neither val_out nor map are present + k = 1 ! insert position + do col = 1, n + i = ptr_out(col) + ptr_out(col) = k + if(ptr_out(col+1).eq.i) cycle ! no entries + ! Move first entry of column forward + row_out(k) = row_out(i) + k = k + 1 + ! Loop over remaining entries + do i = i+1, ptr_out(col+1)-1 + if(row_out(i).eq.row_out(k-1)) then + ! Duplicate + idup = idup + 1 + cycle + endif + ! Pull entry forwards + row_out(k) = row_out(i) + k = k + 1 + end do + end do + ptr_out(n+1) = k + endif + + if(present(map)) then + ! Append duplicates to map + do while(associated(duphead)) + idup = idup + 1 + map(lmap+1) = duphead%dest + map(lmap+2) = duphead%src + lmap = lmap + 2 + dup => duphead%next + deallocate(duphead) + duphead => dup + end do + if(present(val_out)) then + allocate(val_out(ptr_out(n+1)-1), stat=st) + if(st.ne.0) goto 100 + call mc69_set_values(matrix_type, lmap, map, val_in, ptr_out(n+1)-1, & + val_out) + endif + endif + + if(present(val_out)) then + select case(matrix_type) + case(HSL_MATRIX_REAL_SYM_PSDEF) + ! Check for positive diagonal entries + do j = 1,n + k = ptr_out(j) + ! ps def case - can't reach here unless all entries have diagonal + if(real(val_out(k))<=zero) then + flag = MC69_ERROR_MISSING_DIAGONAL + call mc69_print_flag(context,nout,flag) + return + end if + end do + end select + endif + + ! Check whether a warning needs to be raised + if(ioor > 0 .or. idup > 0 .or. idiag < n) then + if(ioor > 0) flag = MC69_WARNING_IDX_OOR + if(idup > 0) flag = MC69_WARNING_DUP_IDX + if(idup > 0 .and. ioor > 0) flag = MC69_WARNING_DUP_AND_OOR + if(abs(matrix_type) .ne. HSL_MATRIX_REAL_SKEW) then + if(idiag < n .and. ioor > 0) then + flag = MC69_WARNING_MISS_DIAG_OORDUP + else if(idiag < n .and. idup > 0) then + flag = MC69_WARNING_MISS_DIAG_OORDUP + else if(idiag < n) then + flag = MC69_WARNING_MISSING_DIAGONAL + end if + endif + call mc69_print_flag(context,nout,flag) + end if + + if(present(noor)) noor = ioor + if(present(ndup)) ndup = idup + + return + +100 if(st /= 0) then + flag = MC69_ERROR_ALLOCATION + call mc69_print_flag(context,nout,flag) + end if + +end subroutine mc69_csclu_convert_main + +!**************************************** + +! +! Converts CSR with only lower entries present to CSC with +! only lower entries present and entries +! within each column ordered by increasing row index (HSL standard format) +! +subroutine mc69_csrl_convert_double(matrix_type, m, n, ptr_in, col_in, ptr_out,& + row_out, flag, val_in, val_out, lmap, map, lp, noor, ndup) + integer, intent(in) :: matrix_type ! what sort of symmetry is there? + integer, intent(in) :: m ! matrix dimension + integer, intent(in) :: n ! matrix dimension + integer, dimension(*), intent(in) :: ptr_in ! row pointers on input + integer, dimension(*), intent(in) :: col_in ! col indices on input. + ! These may be unordered within each row and may contain + ! duplicates and/or out-of-range entries + integer, dimension(*), intent(out) :: ptr_out ! col ptr output + integer, allocatable, dimension(:), intent(out) :: row_out ! row indices out + ! Duplicates and out-of-range entries are dealt with and + ! the entries within each column are ordered by increasing row index. + integer, intent(out) :: flag ! return code + real(wp), optional, dimension(*), intent(in) :: val_in ! values input + real(wp), optional, allocatable, dimension(:) :: val_out + ! values on output + integer, optional, intent(out) :: lmap + integer, optional, allocatable, dimension(:) :: map + ! map(1:size(val_out)) gives src: map(i) = j means val_out(i)=val_in(j). + ! map(size(val_out)+1:) gives pairs: map(i:i+1) = (j,k) means + ! val_out(j) = val_out(j) + val_in(k) + integer, optional, intent(in) :: lp ! unit for printing output if wanted + integer, optional, intent(out) :: noor ! number of out-of-range entries + integer, optional, intent(out) :: ndup ! number of duplicates summed + + ! Local variables + character(50) :: context ! Procedure name (used when printing). + integer :: nout ! output unit (set to -1 if nout not present) + + context = 'mc69_csrl_convert' + + nout = -1 + if(present(lp)) nout = lp + + ! Note: have to change this test for complex code + if(matrix_type < 1 .or. matrix_type == 5 .or. matrix_type > 6) then + flag = MC69_ERROR_MATRIX_TYPE + call mc69_print_flag(context,nout,flag) + return + end if + + call mc69_csrl_convert_main(context, 1, matrix_type, m, n, & + ptr_in, col_in, ptr_out, row_out, flag, val_in, val_out, lmap, map, & + lp, noor, ndup) +end subroutine mc69_csrl_convert_double + +!**************************************** + +subroutine mc69_csrl_convert_main(context, multiplier, matrix_type, m, n, & + ptr_in, col_in, ptr_out, row_out, flag, val_in, val_out, lmap, map, & + lp, noor, ndup) + character(50), intent(in) :: context ! Procedure name (used when printing). + integer, intent(in) :: multiplier ! 1 for lwr triangle source, -1 for upr + integer, intent(in) :: matrix_type ! what sort of symmetry is there? + integer, intent(in) :: m ! matrix dimension + integer, intent(in) :: n ! matrix dimension + integer, dimension(*), intent(in) :: ptr_in ! row pointers on input + integer, dimension(*), intent(in) :: col_in ! col indices on input. + ! These may be unordered within each row and may contain + ! duplicates and/or out-of-range entries + integer, dimension(*), intent(out) :: ptr_out ! col ptr output + integer, allocatable, dimension(:), intent(out) :: row_out ! row indices out + ! Duplicates and out-of-range entries are dealt with and + ! the entries within each column are ordered by increasing row index. + integer, intent(out) :: flag ! return code + real(wp), optional, dimension(*), intent(in) :: val_in ! values input + real(wp), optional, allocatable, dimension(:) :: val_out + ! values on output + integer, optional, intent(out) :: lmap + integer, optional, allocatable, dimension(:) :: map + ! map(1:size(val_out)) gives src: map(i) = j means val_out(i)=val_in(j). + ! map(size(val_out)+1:) gives pairs: map(i:i+1) = (j,k) means + ! val_out(j) = val_out(j) + val_in(k) + integer, optional, intent(in) :: lp ! unit for printing output if wanted + integer, optional, intent(out) :: noor ! number of out-of-range entries + integer, optional, intent(out) :: ndup ! number of duplicates summed + + + ! Local variables + integer :: row ! current row + integer :: col ! current col + integer :: i + integer :: idiag + integer :: idup + integer :: ioor + integer :: j + integer :: k + integer :: ne + integer :: nout ! output unit (set to -1 if nout not present) + integer :: npre ! number of out-of-range entries prior to this column + integer :: st ! stat parameter + integer :: maxv ! maximum value before out of range + + type(dup_list), pointer :: dup + type(dup_list), pointer :: duphead + + nullify(dup, duphead) + + ! --------------------------------------------- + ! Check that restrictions are adhered to + ! --------------------------------------------- + + flag = MC69_SUCCESS + + nout = -1 + if(present(lp)) nout = lp + + if(n < 0 .or. m < 0) then + flag = MC69_ERROR_N_OOR + call mc69_print_flag(context,nout,flag) + return + end if + + if(ptr_in(1) < 1) then + flag = MC69_ERROR_PTR_1 + call mc69_print_flag(context,nout,flag) + return + end if + + if(present(val_in).neqv.present(val_out)) then + flag = MC69_ERROR_VAL_MISS + call mc69_print_flag(context,nout,flag) + return + end if + + if(present(map).neqv.present(lmap)) then + flag = MC69_ERROR_LMAP_MISS + call mc69_print_flag(context,nout,flag) + return + end if + + ! --------------------------------------------- + + ! allocate output and work arrays + + deallocate(row_out,stat=st) + if(present(val_out)) deallocate(val_out,stat=st) + if(present(map)) deallocate(map,stat=st) + + + ! --------------------------------------------- + ! check for duplicates and/or out-of-range. check diagonal present. + ! first do the case where values not present + + idup = 0; ioor = 0; idiag = 0 + + ! + ! First pass, count number of entries in each col of the matrix. + ! Count is at an offset of 1 to allow us to play tricks + ! (ie. ptr_out(i+1) set to hold number of entries in column i + ! of expanded matrix). + ! Excludes out of range entries. Includes duplicates. + ! + ptr_out(1:n+1) = 0 + k = 0 ! last diagonal found + maxv = n + do row = 1, m + if(ptr_in(row+1).lt.ptr_in(row)) then + flag = MC69_ERROR_PTR_MONO + call mc69_print_flag(context,nout,flag) + return + endif + npre = ioor + if(abs(matrix_type).ge.HSL_MATRIX_REAL_SYM_PSDEF) maxv = row + if(abs(matrix_type).eq.HSL_MATRIX_REAL_SKEW) maxv = row-1 + do i = ptr_in(row), ptr_in(row+1)-1 + j = col_in(i) + if(j.lt.1 .or. j.gt.maxv) then + ioor = ioor + 1 + cycle + endif + if(j.eq.row .and. j.ne.k) then ! diagonal entry (not second in column) + idiag = idiag + 1 + k = row + endif + ptr_out(j+1) = ptr_out(j+1) + 1 + end do + if(ioor-npre.ne.0 .and. ptr_in(row+1)-ptr_in(row).eq.ioor-npre) then + ! Column contains only out of range entries + flag = MC69_ERROR_ALL_OOR + call mc69_print_flag(context,nout,flag) + return + endif + end do + + ! Check for missing diagonals in pos def case + ! Note: change this test for complex case + if(abs(matrix_type) == HSL_MATRIX_REAL_SYM_PSDEF) then + if(idiag < n) then + flag = MC69_ERROR_MISSING_DIAGONAL + call mc69_print_flag(context,nout,flag) + return + end if + end if + + ! Determine column starts for matrix such + ! that column i starts at ptr_out(i+1) + ne = 0 + ptr_out(1) = 1 + do i = 1, n + ne = ne + ptr_out(i+1) + ptr_out(i+1) = ptr_out(i) + ptr_out(i+1) + end do + do i = n,1,-1 + ptr_out(i+1) = ptr_out(i) + end do + + ! + ! Second pass, drop entries into place for matrix + ! + allocate(row_out(ne), stat=st) + if(st.ne.0) goto 100 + if(present(map)) then + ! Needs to be this big for worst case: all entries are repeat of same + allocate(map(2*(ptr_in(m+1)-1)), stat=st) + if(st.ne.0) goto 100 + maxv = n + do row = 1, m + if(abs(matrix_type).ge.HSL_MATRIX_REAL_SYM_PSDEF) maxv = row + if(abs(matrix_type).eq.HSL_MATRIX_REAL_SKEW) maxv = row-1 + do i = ptr_in(row), ptr_in(row+1)-1 + j = col_in(i) + if(j.lt.1 .or. j.gt.maxv) cycle ! ignore oor and upr triangle + k = ptr_out(j+1) + ptr_out(j+1) = k + 1 + row_out(k) = row + map(k) = multiplier*i + end do + end do + elseif(present(val_out)) then + allocate(val_out(2*(ptr_in(m+1)-1)), stat=st) + if(st.ne.0) goto 100 + select case(matrix_type) + case(HSL_MATRIX_REAL_SKEW) + do row = 1, m + do i = ptr_in(row), ptr_in(row+1)-1 + j = col_in(i) + if(j.lt.1 .or. j.ge.row) cycle + k = ptr_out(j+1) + ptr_out(j+1) = k + 1 + row_out(k) = row + val_out(k) = multiplier*val_in(i) + end do + end do + case default + maxv= n + do row = 1, m + if(abs(matrix_type).ge.HSL_MATRIX_REAL_SYM_PSDEF) maxv = row + if(abs(matrix_type).eq.HSL_MATRIX_REAL_SKEW) maxv = row-1 + do i = ptr_in(row), ptr_in(row+1)-1 + j = col_in(i) + if(j.lt.1 .or. j.gt.maxv) cycle + k = ptr_out(j+1) + ptr_out(j+1) = k + 1 + row_out(k) = row + val_out(k) = val_in(i) + end do + end do + end select + else ! neither val_out nor map present + maxv = n + do row = 1, m + if(abs(matrix_type).ge.HSL_MATRIX_REAL_SYM_PSDEF) maxv = row + if(abs(matrix_type).eq.HSL_MATRIX_REAL_SKEW) maxv = row-1 + do i = ptr_in(row), ptr_in(row+1)-1 + j = col_in(i) + if(j.lt.1 .or. j.gt.maxv) cycle + k = ptr_out(j+1) + ptr_out(j+1) = k + 1 + row_out(k) = row + end do + end do + endif + + ! + ! Third pass, removal of duplicates (no sort required by construction) + ! + if(present(map)) then + k = 1 ! insert position + do col = 1, n + i = ptr_out(col) + ptr_out(col) = k + if(ptr_out(col+1).eq.i) cycle ! no entries + ! Move first entry of column forward + row_out(k) = row_out(i) + map(k) = map(i) + k = k + 1 + ! Loop over remaining entries + do i = i+1, ptr_out(col+1)-1 + if(row_out(i).eq.row_out(k-1)) then + ! Duplicate + allocate(dup,stat=st) + if(st.ne.0) goto 100 + dup%next => duphead + duphead => dup + dup%src = map(i) + dup%dest = k-1 + cycle + endif + ! Pull entry forwards + row_out(k) = row_out(i) + map(k) = map(i) + k = k + 1 + end do + end do + ptr_out(n+1) = k + lmap = k-1 + elseif(present(val_out)) then + k = 1 ! insert position + do col = 1, n + i = ptr_out(col) + ptr_out(col) = k + if(ptr_out(col+1).eq.i) cycle ! no entries + ! Move first entry of column forward + row_out(k) = row_out(i) + val_out(k) = val_out(i) + k = k + 1 + ! Loop over remaining entries + do i = i+1, ptr_out(col+1)-1 + if(row_out(i).eq.row_out(k-1)) then + ! Duplicate + idup = idup + 1 + val_out(k-1) = val_out(k-1) + val_out(i) + cycle + endif + ! Pull entry forwards + row_out(k) = row_out(i) + val_out(k) = val_out(i) + k = k + 1 + end do + end do + ptr_out(n+1) = k + else ! neither val_out nor map are present + k = 1 ! insert position + do col = 1, n + i = ptr_out(col) + ptr_out(col) = k + if(ptr_out(col+1).eq.i) cycle ! no entries + ! Move first entry of column forward + row_out(k) = row_out(i) + k = k + 1 + ! Loop over remaining entries + do i = i+1, ptr_out(col+1)-1 + if(row_out(i).eq.row_out(k-1)) then + ! Duplicate + idup = idup + 1 + cycle + endif + ! Pull entry forwards + row_out(k) = row_out(i) + k = k + 1 + end do + end do + ptr_out(n+1) = k + endif + + if(present(map)) then + ! Append duplicates to map + do while(associated(duphead)) + idup = idup + 1 + map(lmap+1) = duphead%dest + map(lmap+2) = duphead%src + lmap = lmap + 2 + dup => duphead%next + deallocate(duphead) + duphead => dup + end do + if(present(val_out)) then + allocate(val_out(ptr_out(n+1)-1), stat=st) + if(st.ne.0) goto 100 + call mc69_set_values(matrix_type, lmap, map, val_in, ptr_out(n+1)-1, & + val_out) + endif + endif + + if(present(val_out)) then + select case(matrix_type) + case(HSL_MATRIX_REAL_SYM_PSDEF) + ! Check for positive diagonal entries + do j = 1,n + k = ptr_out(j) + ! ps def case - can't reach here unless all entries have diagonal + if(real(val_out(k))<=zero) then + flag = MC69_ERROR_MISSING_DIAGONAL + call mc69_print_flag(context,nout,flag) + return + end if + end do + end select + endif + + ! Check whether a warning needs to be raised + if(ioor > 0 .or. idup > 0 .or. idiag < n) then + if(ioor > 0) flag = MC69_WARNING_IDX_OOR + if(idup > 0) flag = MC69_WARNING_DUP_IDX + if(idup > 0 .and. ioor > 0) flag = MC69_WARNING_DUP_AND_OOR + if(abs(matrix_type) .ne. HSL_MATRIX_REAL_SKEW) then + if(idiag < n .and. ioor > 0) then + flag = MC69_WARNING_MISS_DIAG_OORDUP + else if(idiag < n .and. idup > 0) then + flag = MC69_WARNING_MISS_DIAG_OORDUP + else if(idiag < n) then + flag = MC69_WARNING_MISSING_DIAGONAL + end if + endif + call mc69_print_flag(context,nout,flag) + end if + + if(present(noor)) noor = ioor + if(present(ndup)) ndup = idup + + return + +100 if(st /= 0) then + flag = MC69_ERROR_ALLOCATION + call mc69_print_flag(context,nout,flag) + end if + +end subroutine mc69_csrl_convert_main + +!**************************************** + +! +! Converts CSR with upper entries only for symmetric, skew-symmetric and +! Hermitian matrices to HSL standard format +! +subroutine mc69_csru_convert_double(matrix_type, n, ptr_in, col_in, ptr_out, & + row_out, flag, val_in, val_out, lmap, map, lp, noor, ndup) + integer, intent(in) :: matrix_type ! what sort of symmetry is there? + integer, intent(in) :: n ! number of columns + integer, dimension(*), intent(in) :: ptr_in ! column pointers on input + integer, dimension(*), intent(in) :: col_in ! row indices on input. + ! These may be unordered within each column and may contain + ! duplicates and/or out-of-range entries + integer, dimension(*), intent(out) :: ptr_out ! col ptr output + integer, allocatable, dimension(:), intent(out) :: row_out ! row indices out + ! Duplicates and out-of-range entries are dealt with and + ! the entries within each column are ordered by increasing row index. + integer, intent(out) :: flag ! return code + real(wp), optional, dimension(*), intent(in) :: val_in ! values input + real(wp), optional, allocatable, dimension(:) :: val_out + ! values on output + integer, optional, intent(out) :: lmap + integer, optional, allocatable, dimension(:) :: map + ! map(1:size(val_out)) gives src: map(i) = j means val_out(i)=val_in(j). + ! map(size(val_out)+1:) gives pairs: map(i:i+1) = (j,k) means + ! val_out(j) = val_out(j) + val_in(k) + integer, optional, intent(in) :: lp ! unit for printing output if wanted + integer, optional, intent(out) :: noor ! number of out-of-range entries + integer, optional, intent(out) :: ndup ! number of duplicates summed + + ! Local variables + character(50) :: context ! Procedure name (used when printing). + integer :: nout ! output unit (set to -1 if lp not present) + + context = 'mc69_csru_convert' + + nout = -1 + if(present(lp)) nout = lp + + ! Note: have to change this test for complex code + if(matrix_type < 3 .or. matrix_type == 5 .or. matrix_type > 6) then + flag = MC69_ERROR_MATRIX_TYPE + call mc69_print_flag(context,nout,flag) + return + end if + + call mc69_cscl_convert_main(context, -1, matrix_type, n, n, & + ptr_in, col_in, ptr_out, row_out, flag, val_in, val_out, lmap, map, & + lp, noor, ndup) +end subroutine mc69_csru_convert_double + +!**************************************** + +! +! Converts CSR with both lower and upper entries present to CSC with +! only lower entries present and entries +! within each column ordered by increasing row index (HSL standard format) +! +subroutine mc69_csrlu_convert_double(matrix_type, n, ptr_in, col_in, ptr_out, & + row_out, flag, val_in, val_out, lmap, map, lp, noor, ndup) + integer, intent(in) :: matrix_type ! what sort of symmetry is there? + integer, intent(in) :: n ! matrix dimension + integer, dimension(*), intent(in) :: ptr_in ! row pointers on input + integer, dimension(*), intent(in) :: col_in ! col indices on input. + ! These may be unordered within each row and may contain + ! duplicates and/or out-of-range entries + integer, dimension(*), intent(out) :: ptr_out ! col ptr output + integer, allocatable, dimension(:), intent(out) :: row_out ! row indices out + ! Duplicates and out-of-range entries are dealt with and + ! the entries within each column are ordered by increasing row index. + integer, intent(out) :: flag ! return code + real(wp), optional, dimension(*), intent(in) :: val_in ! values input + real(wp), optional, allocatable, dimension(:) :: val_out + ! values on output + integer, optional, intent(out) :: lmap + integer, optional, allocatable, dimension(:) :: map + ! map(1:size(val_out)) gives src: map(i) = j means val_out(i)=val_in(j). + ! map(size(val_out)+1:) gives pairs: map(i:i+1) = (j,k) means + ! val_out(j) = val_out(j) + val_in(k) + integer, optional, intent(in) :: lp ! unit for printing output if wanted + integer, optional, intent(out) :: noor ! number of out-of-range entries + integer, optional, intent(out) :: ndup ! number of duplicates summed + + ! Local variables + character(50) :: context ! Procedure name (used when printing). + integer :: nout ! output unit (set to -1 if nout not present) + + context = 'mc69_csrlu_convert' + + nout = -1 + if(present(lp)) nout = lp + + ! Note: have to change this test for complex code + if(matrix_type < 3 .or. matrix_type == 5 .or. matrix_type > 6) then + flag = MC69_ERROR_MATRIX_TYPE + call mc69_print_flag(context,nout,flag) + return + end if + + call mc69_csclu_convert_main(context, 1, matrix_type, n, & + ptr_in, col_in, ptr_out, row_out, flag, val_in, val_out, lmap, map, & + lp, noor, ndup) +end subroutine mc69_csrlu_convert_double + +!**************************************** + +! +! Converts COOR format to CSC with only lower entries present for +! (skew-)symmetric problems. Entries within each column ordered by increasing +! row index (HSL standard format) +! +subroutine mc69_coord_convert_double(matrix_type, m, n, ne, row, col, ptr_out, & + row_out, flag, val_in, val_out, lmap, map, lp, noor, ndup) + integer, intent(in) :: matrix_type ! what sort of symmetry is there? + integer, intent(in) :: m ! number of rows in matrix + integer, intent(in) :: n ! number of columns in matrix + integer, intent(in) :: ne ! number of input nonzero entries + integer, dimension(:), intent(in) :: row(ne) ! row indices on input. + ! These may be unordered within each column and may contain + ! duplicates and/or out-of-range entries + integer, dimension(:), intent(in) :: col(ne) ! column indices on input. + ! These may be unordered within each column and may contain + ! duplicates and/or out-of-range entries + integer, dimension(:), intent(out) :: ptr_out(n+1) ! col ptr output + integer, allocatable, dimension(:), intent(out) :: row_out ! row indices out + ! Duplicates and out-of-range entries are dealt with and + ! the entries within each column are ordered by increasing row index. + integer, intent(out) :: flag ! return code + real(wp), optional, dimension(*), intent(in) :: val_in ! values input + real(wp), optional, allocatable, dimension(:) :: val_out + ! values on output + integer, optional, intent(out) :: lmap + integer, optional, allocatable, dimension(:) :: map + ! map(1:size(val_out)) gives source: map(i) = j means + ! val_out(i)=val_in(j). + ! map(size(val_out)+1:) gives pairs: map(i:i+1) = (j,k) means + ! val_out(j) = val_out(j) + val_in(k) + integer, optional, intent(in) :: lp ! unit for printing output if wanted + integer, optional, intent(out) :: noor ! number of out-of-range entries + integer, optional, intent(out) :: ndup ! number of duplicates summed + + + ! Local variables + character(50) :: context ! Procedure name (used when printing). + integer :: i + integer :: idiag + integer :: idup + integer :: ioor + integer :: j + integer :: k, l1, l2 + integer :: l + integer :: ne_new + integer :: nout ! output unit (set to -1 if lp not present) + integer :: st ! stat parameter + + type(dup_list), pointer :: dup + type(dup_list), pointer :: duphead + + nullify(dup, duphead) + + context = 'mc69_coord_convert' + + flag = MC69_SUCCESS + + nout = -1 + if(present(lp)) nout = lp + + ! --------------------------------------------- + ! Check that restrictions are adhered to + ! --------------------------------------------- + + ! Note: have to change this test for complex code + if(matrix_type < 0 .or. matrix_type == 5 .or. matrix_type > 6) then + flag = MC69_ERROR_MATRIX_TYPE + call mc69_print_flag(context,nout,flag) + return + end if + + if(m < 0 .or. n < 0) then + flag = MC69_ERROR_N_OOR + call mc69_print_flag(context,nout,flag) + return + end if + + if(abs(matrix_type).ge.HSL_MATRIX_REAL_UNSYM .and. m.ne.n) then + flag = MC69_ERROR_M_NE_N + call mc69_print_flag(context,nout,flag) + return + end if + + if(present(val_in).neqv.present(val_out)) then + flag = MC69_ERROR_VAL_MISS + call mc69_print_flag(context,nout,flag) + return + end if + + if(present(map).neqv.present(lmap)) then + flag = MC69_ERROR_LMAP_MISS + call mc69_print_flag(context,nout,flag) + return + end if + + ! --------------------------------------------- + + ! allocate output and work arrays + + deallocate(row_out,stat=st) + if(present(val_out)) deallocate(val_out,stat=st) + if(present(map)) deallocate(map,stat=st) + + + ! --------------------------------------------- + ! check for duplicates and/or out-of-range. check diagonal present. + ! first do the case where values not present + + idup = 0; ioor = 0; idiag = 0 + + ! + ! First pass, count number of entries in each col of the matrix + ! matrix. Count is at an offset of 1 to allow us to play tricks + ! (ie. ptr_out(i+1) set to hold number of entries in column i + ! of expanded matrix). + ! Excludes out of range entries. Includes duplicates. + ! + ptr_out(1:n+1) = 0 + do l = 1, ne + i = row(l) + j = col(l) + if(j.lt.1 .or. j.gt.n .or. i.lt.1 .or. i.gt.m) then + ioor = ioor + 1 + cycle + endif + + if(abs(matrix_type).eq.HSL_MATRIX_REAL_SKEW .and. i.eq.j) then + ioor = ioor + 1 + cycle + endif + + select case (abs(matrix_type)) + case (HSL_MATRIX_REAL_SYM_PSDEF:) + if(i.ge.j) then + ptr_out(j+1) = ptr_out(j+1) + 1 + else + ptr_out(i+1) = ptr_out(i+1) + 1 + end if + case default + ptr_out(j+1) = ptr_out(j+1) + 1 + end select + end do + + + ! Determine column starts for transposed expanded matrix such + ! that column i starts at ptr_out(i) + ne_new = 0 + ptr_out(1) = 1 + do i = 2, n+1 + ne_new = ne_new + ptr_out(i) + ptr_out(i) = ptr_out(i) + ptr_out(i-1) + end do + + ! Check whether all entries out of range + if(ne.gt.0 .and. ne_new.eq.0) then + flag = MC69_ERROR_ALL_OOR + call mc69_print_flag(context,nout,flag) + return + end if + + ! + ! Second pass, drop entries into place for conjugate of transposed + ! expanded matrix + ! + allocate(row_out(ne_new), stat=st) + if(st.ne.0) goto 100 + if(present(map)) then + if(allocated(map)) deallocate(map,stat=st) + allocate(map(2*ne), stat=st) + if(st.ne.0) goto 100 + map(:) = 0 + select case(matrix_type) + case(HSL_MATRIX_REAL_SKEW) + do l = 1, ne + i = row(l) + j = col(l) + if(j.lt.1 .or. j.gt.n .or. i.lt.1 .or. i.gt.m .or. i.eq.j) cycle + if(i.ge.j) then + k=ptr_out(j) + ptr_out(j) = k+1 + row_out(k) = i + map(k) = l + else + k=ptr_out(i) + ptr_out(i) = k+1 + row_out(k) = j + map(k) = -l + end if + end do + + case(HSL_MATRIX_REAL_SYM_PSDEF, HSL_MATRIX_REAL_SYM_INDEF) + do l = 1, ne + i = row(l) + j = col(l) + if(j.lt.1 .or. j.gt.n .or. i.lt.1 .or. i.gt.m) cycle + if(i.ge.j) then + k=ptr_out(j) + ptr_out(j) = k+1 + row_out(k) = i + map(k) = l + else + k=ptr_out(i) + ptr_out(i) = k+1 + row_out(k) = j + map(k) = l + end if + end do + case default + do l = 1, ne + i = row(l) + j = col(l) + if(j.lt.1 .or. j.gt.n .or. i.lt.1 .or. i.gt.m) cycle + k=ptr_out(j) + ptr_out(j) = k+1 + row_out(k) = i + map(k) = l + end do + end select + elseif(present(val_out)) then + allocate(val_out(ne_new), stat=st) + if(st.ne.0) goto 100 + select case(matrix_type) + case(HSL_MATRIX_REAL_SKEW) + do l = 1, ne + i = row(l) + j = col(l) + if(j.lt.1 .or. j.gt.n .or. i.lt.1 .or. i.gt.m .or. i.eq.j) cycle + if(i.ge.j) then + k=ptr_out(j) + ptr_out(j) = k+1 + row_out(k) = i + val_out(k) = val_in(l) + else + k=ptr_out(i) + ptr_out(i) = k+1 + row_out(k) = j + val_out(k) = -val_in(l) + end if + end do + + case(HSL_MATRIX_REAL_SYM_PSDEF, HSL_MATRIX_REAL_SYM_INDEF) + do l = 1, ne + i = row(l) + j = col(l) + if(j.lt.1 .or. j.gt.n .or. i.lt.1 .or. i.gt.m) cycle + if(i.ge.j) then + k=ptr_out(j) + ptr_out(j) = k+1 + row_out(k) = i + val_out(k) = val_in(l) + else + k=ptr_out(i) + ptr_out(i) = k+1 + row_out(k) = j + val_out(k) = val_in(l) + end if + end do + case default + do l = 1, ne + i = row(l) + j = col(l) + if(j.lt.1 .or. j.gt.n .or. i.lt.1 .or. i.gt.m) cycle + k=ptr_out(j) + ptr_out(j) = k+1 + row_out(k) = i + val_out(k) = val_in(l) + end do + end select + + + else + ! neither val_out or map present + select case(matrix_type) + case(HSL_MATRIX_REAL_SKEW) + do l = 1, ne + i = row(l) + j = col(l) + if(j.lt.1 .or. j.gt.n .or. i.lt.1 .or. i.gt.m .or. i.eq.j) cycle + if(i.ge.j) then + k=ptr_out(j) + ptr_out(j) = k+1 + row_out(k) = i + else + k=ptr_out(i) + ptr_out(i) = k+1 + row_out(k) = j + end if + end do + + case(HSL_MATRIX_REAL_SYM_PSDEF, HSL_MATRIX_REAL_SYM_INDEF) + do l = 1, ne + i = row(l) + j = col(l) + if(j.lt.1 .or. j.gt.n .or. i.lt.1 .or. i.gt.m) cycle + if(i.ge.j) then + k=ptr_out(j) + ptr_out(j) = k+1 + row_out(k) = i + else + k=ptr_out(i) + ptr_out(i) = k+1 + row_out(k) = j + end if + end do + case default + do l = 1, ne + i = row(l) + j = col(l) + if(j.lt.1 .or. j.gt.n .or. i.lt.1 .or. i.gt.m) cycle + k=ptr_out(j) + ptr_out(j) = k+1 + row_out(k) = i + end do + end select + endif + + do j=n,2,-1 + ptr_out(j) = ptr_out(j-1) + end do + ptr_out(1) = 1 + + ! + ! Third pass, in place sort and removal of duplicates + ! Also checks for diagonal entries in pos. def. case. + ! Uses a modified insertion sort for best speed on already ordered data + ! + idup=0 + if(present(map)) then + do j = 1, n + l1 = ptr_out(j) + l2 = ptr_out(j+1)-1 + ! sort(row_out(l1:l2)) and permute map(l1:l2) accordingly + l = l2-l1+1 + if(l.gt.1) call sort ( row_out(l1:l2),l, map=map(l1:l2) ) + end do + + ! work through removing duplicates + k = 1 ! insert position + do j = 1, n + l1 = ptr_out(j) + l2 = ptr_out(j+1)-1 + ptr_out(j) = k + ! sort(row_out(l1:l2)) and permute map(l1:l2) accordingly + l = l2-l1+1 + if(l.eq.0) cycle ! no entries + + ! Move first entry of column forward + if(row_out(l1).eq.j) idiag = idiag + 1 + row_out(k) = row_out(l1) + map(k) = map(l1) + k = k + 1 + ! Loop over remaining entries + do i = l1+1, l2 + if(row_out(i).eq.row_out(k-1)) then + ! Duplicate + idup = idup + 1 + allocate(dup,stat=st) + if(st.ne.0) goto 100 + dup%next => duphead + duphead => dup + dup%src = map(i) + dup%dest = k-1 + cycle + endif + ! Pull entry forwards + if(row_out(i).eq.j) idiag = idiag + 1 + row_out(k) = row_out(i) + map(k) = map(i) + k = k + 1 + end do + end do + ptr_out(n+1) = k + lmap = k-1 + else if(present(val_out)) then + ! ADD + do j = 1, n + l1 = ptr_out(j) + l2 = ptr_out(j+1)-1 + l = l2-l1+1 + if(l.gt.1) call sort( row_out(l1:l2),l,val=val_out(l1:l2) ) + ! ADD + end do + + ! work through removing duplicates + k = 1 ! insert position + do j = 1, n + l1 = ptr_out(j) + l2 = ptr_out(j+1)-1 + ptr_out(j) = k + ! sort(row_out(l1:l2)) and permute map(l1:l2) accordingly + l = l2-l1+1 + if(l.eq.0) cycle ! no entries + + ! Move first entry of column forward + if(row_out(l1).eq.j) idiag = idiag + 1 + row_out(k) = row_out(l1) + val_out(k) = val_out(l1) + k = k + 1 + ! Loop over remaining entries + do i = l1+1, l2 + if(row_out(i).eq.row_out(k-1)) then + idup = idup + 1 + val_out(k-1) = val_out(k-1)+val_out(i) + cycle + end if + ! Pull entry forwards + if(row_out(i).eq.j) idiag = idiag + 1 + row_out(k) = row_out(i) + val_out(k) = val_out(i) + k = k + 1 + end do + end do + ptr_out(n+1) = k + else + do j = 1, n + l1 = ptr_out(j) + l2 = ptr_out(j+1)-1 + l = l2-l1+1 + if(l.gt.1)call sort ( row_out(l1:l2),l) + ! ADD + end do + + ! work through removing duplicates + k = 1 ! insert position + do j = 1, n + l1 = ptr_out(j) + l2 = ptr_out(j+1)-1 + ptr_out(j) = k + ! sort(row_out(l1:l2)) and permute map(l1:l2) accordingly + l = l2-l1+1 + if(l.eq.0) cycle ! no entries + + ! Move first entry of column forward + if(row_out(l1).eq.j) idiag = idiag + 1 + row_out(k) = row_out(l1) + k = k + 1 + ! Loop over remaining entries + do i = l1+1, l2 + if(row_out(i).eq.row_out(k-1)) then + idup = idup + 1 + cycle + end if + ! Pull entry forwards + if(row_out(i).eq.j) idiag = idiag + 1 + row_out(k) = row_out(i) + k = k + 1 + end do + end do + ptr_out(n+1) = k + + endif + + + ! Check for missing diagonals in pos def and indef cases + ! Note: change this test for complex case + if(abs(matrix_type) == HSL_MATRIX_REAL_SYM_PSDEF) then + do j = 1,n + if(ptr_out(j).lt.ptr_out(n+1)) then + if(row_out(ptr_out(j)) .ne. j) then + flag = MC69_ERROR_MISSING_DIAGONAL + call mc69_print_flag(context,nout,flag) + return + end if + end if + end do + end if + + if(present(map)) then + ! Append duplicates to map + do while(associated(duphead)) + map(lmap+1) = duphead%dest + map(lmap+2) = duphead%src + lmap = lmap + 2 + dup => duphead%next + deallocate(duphead) + duphead => dup + end do + if(present(val_out)) then + allocate(val_out(ptr_out(n+1)-1), stat=st) + if(st.ne.0) goto 100 + call mc69_set_values(matrix_type, lmap, map, val_in, ptr_out(n+1)-1, & + val_out) + endif + endif + + if(present(val_out)) then + select case(matrix_type) + case(HSL_MATRIX_REAL_SYM_PSDEF) + ! Check for positive diagonal entries + do j = 1,n + k = ptr_out(j) + ! ps def case - can't reach here unless all entries have diagonal + if(real(val_out(k))<=zero) then + flag = MC69_ERROR_MISSING_DIAGONAL + call mc69_print_flag(context,nout,flag) + return + end if + end do + end select + endif + + ! Check whether a warning needs to be raised + if(ioor > 0 .or. idup > 0 .or. idiag < n) then + if(ioor > 0) flag = MC69_WARNING_IDX_OOR + if(idup > 0) flag = MC69_WARNING_DUP_IDX + if(idup > 0 .and. ioor > 0) flag = MC69_WARNING_DUP_AND_OOR + if(abs(matrix_type) .ne. HSL_MATRIX_REAL_SKEW) then + if(idiag < n .and. ioor > 0) then + flag = MC69_WARNING_MISS_DIAG_OORDUP + else if(idiag < n .and. idup > 0) then + flag = MC69_WARNING_MISS_DIAG_OORDUP + else if(idiag < n) then + flag = MC69_WARNING_MISSING_DIAGONAL + end if + endif + call mc69_print_flag(context,nout,flag) + end if + + ! Check whether a warning needs to be raised + if(ioor > 0 .or. idup > 0 .or. idiag < n) then + if(ioor > 0) flag = MC69_WARNING_IDX_OOR + if(idup > 0) flag = MC69_WARNING_DUP_IDX + if(idup > 0 .and. ioor > 0) flag = MC69_WARNING_DUP_AND_OOR + if(abs(matrix_type).eq.HSL_MATRIX_REAL_SYM_INDEF .and. & + idiag0) then + flag = MC69_WARNING_MISS_DIAG_OORDUP + else if(abs(matrix_type).eq.HSL_MATRIX_REAL_SYM_INDEF .and. idiag0) then + flag = MC69_WARNING_MISS_DIAG_OORDUP + else if(abs(matrix_type).eq.HSL_MATRIX_REAL_SYM_INDEF .and. idiag=array(parent). + ! If we label as + ! 1 + ! / \ + ! 2 3 + ! / \ / \ + ! 4 5 6 7 + ! Then node i has nodes 2*i and 2*i+1 as its children + + if(present(val) .and. present(map)) then ! both val and map + root_idx = array(root) + root_val = val(root) + root_map = map(root) + insert = root + test = 2*insert + do while(test.le.last) + ! First check for largest child branch to descend + if(test.ne.last) then + if(array(test+1).gt.array(test)) test = test + 1 + endif + if(array(test).le.root_idx) exit ! root gets tested here + ! Otherwise, move on to next level down, percolating value up + array(insert) = array(test); + val(insert) = val(test); + map(insert) = map(test) + insert = test + test = 2*insert + end do + ! Finally drop root value into location found + array(insert) = root_idx + val(insert) = root_val + map(insert) = root_map + elseif(present(val)) then ! val only, not map + root_idx = array(root) + root_val = val(root) + insert = root + test = 2*insert + do while(test.le.last) + ! First check for largest child branch to descend + if(test.ne.last) then + if(array(test+1).gt.array(test)) test = test + 1 + endif + if(array(test).le.root_idx) exit ! root gets tested here + ! Otherwise, move on to next level down, percolating value up + array(insert) = array(test) + val(insert) = val(test) + insert = test + test = 2*insert + end do + ! Finally drop root value into location found + array(insert) = root_idx + val(insert) = root_val + elseif(present(map)) then ! map only, not val + root_idx = array(root) + root_map = map(root) + insert = root + test = 2*insert + do while(test.le.last) + ! First check for largest child branch to descend + if(test.ne.last) then + if(array(test+1).gt.array(test)) test = test + 1 + endif + if(array(test).le.root_idx) exit ! root gets tested here + ! Otherwise, move on to next level down, percolating mapue up + array(insert) = array(test) + map(insert) = map(test) + insert = test + test = 2*insert + end do + ! Finally drop root mapue into location found + array(insert) = root_idx + map(insert) = root_map + else ! neither map nor val + root_idx = array(root) + insert = root + test = 2*insert + do while(test.le.last) + ! First check for largest child branch to descend + if(test.ne.last) then + if(array(test+1).gt.array(test)) test = test + 1 + endif + if(array(test).le.root_idx) exit ! root gets tested here + ! Otherwise, move on to next level down, percolating value up + array(insert) = array(test) + insert = test + test = 2*insert + end do + ! Finally drop root value into location found + array(insert) = root_idx + endif + +end subroutine pushdown + +!**************************************** + +subroutine cleanup_dup(duphead) + type(dup_list), pointer :: duphead ! NB: can't have both intent() and pointer + + type(dup_list), pointer :: dup + + do while(associated(duphead)) + dup => duphead%next + deallocate(duphead) + duphead => dup + end do +end subroutine cleanup_dup + +end module hsl_mc69_double +! COPYRIGHT (c) 2006 Council for the Central Laboratory +! of the Research Councils +! This package may be copied and used in any application, provided no +! changes are made to these or any other lines. +! Original date 21 February 2006. Version 1.0.0. +! 6 March 2007 Version 1.1.0. Argument stat made non-optional + +MODULE HSL_ZD11_double + +! ========================== +! Sparse matrix derived type +! ========================== + + TYPE, PUBLIC :: ZD11_type + INTEGER :: m, n, ne + CHARACTER, ALLOCATABLE, DIMENSION(:) :: id, type + INTEGER, ALLOCATABLE, DIMENSION(:) :: row, col, ptr + REAL ( KIND( 1.0D+0 ) ), ALLOCATABLE, DIMENSION(:) :: val + END TYPE + +CONTAINS + + SUBROUTINE ZD11_put(array,string,stat) + CHARACTER, allocatable :: array(:) + CHARACTER(*), intent(in) :: string + INTEGER, intent(OUT) :: stat + + INTEGER :: i,l + + l = len_trim(string) + if (allocated(array)) then + deallocate(array,stat=stat) + if (stat/=0) return + end if + allocate(array(l),stat=stat) + if (stat/=0) return + do i = 1, l + array(i) = string(i:i) + end do + + END SUBROUTINE ZD11_put + + FUNCTION ZD11_get(array) + CHARACTER, intent(in):: array(:) + CHARACTER(size(array)) :: ZD11_get +! Give the value of array to string. + + integer :: i + do i = 1, size(array) + ZD11_get(i:i) = array(i) + end do + + END FUNCTION ZD11_get + +END MODULE HSL_ZD11_double + + +! COPYRIGHT (c) 2007-12 Science and Technology Facilities Council +! and Jacko Koster (Trondheim, Norway) +! +! Version 2.3.0 +! History: See ChangeLog +! + +! To convert from double to single: +! * s/_double/_single/g +! * Change wp +! * Change: MC64AD, MC64DD, MC64ED, MC64FD, MC64RD, MC64QD, mc64ad, mc64wd +! + +module hsl_mc64_double + use hsl_mc34_double + use hsl_mc69_double + use hsl_zd11_double + implicit none + + private + public :: mc64_control, mc64_info + public :: mc64_initialize, mc64_matching + + integer, parameter :: wp = kind(0.0d0) + + type mc64_control +! real(wp) :: relax = 0d0 ! Relaxes matching + integer :: lp = 6 ! Unit for error messages + integer :: wp = 6 ! Unit for warning messages + integer :: sp = -1 ! Unit for statistical output + integer :: ldiag = 2 ! Controls level of diagnostic output + integer :: checking = 0 ! Control for checking input + end type mc64_control + + type mc64_info + integer :: flag ! Flags success or failure case + integer :: more ! More information on failure + integer :: strucrank ! Structural rank + integer :: stat ! STAT value after allocate failure + end type mc64_info + + interface mc64_matching + module procedure mc64_matching_zd11_double + module procedure mc64_matching_hslstd_double + end interface mc64_matching + +contains + + subroutine mc64_initialize(control) + type(mc64_control), intent(out) :: control + + type(mc64_control) :: default + +! control%relax = default%relax + control%lp = default%lp + control%wp = default%wp + control%sp = default%sp + control%ldiag = default%ldiag + control%checking = default%checking + end subroutine mc64_initialize + + subroutine mc64_matching_zd11_double(job,matrix,control,info,perm, & + scale) + integer, intent(in) :: job ! Control parameter for algorithm choice + type(zd11_type), intent(in) :: matrix + type(mc64_control), intent(in) :: control + type(mc64_info), intent(out) :: info + integer, intent(out) :: perm(matrix%m + matrix%n) + real(wp), optional, intent(out) :: scale(matrix%m + matrix%n) + + integer :: matrix_type + + matrix_type = HSL_MATRIX_UNDEFINED + + if (allocated(matrix%id)) then + if (matrix%id(1) == 'S' .or. matrix%id(1) == 's') then + matrix_type = HSL_MATRIX_REAL_SYM_INDEF + endif + endif + + if (control%checking == 0) then + if (matrix%n .lt. 1) then + info%flag = -2 + info%more = matrix%n + if (control%ldiag>0 .and. control%lp>0 ) & + write (control%lp,'(/a,i5/a,i5)') & + 'Error return from MC64 with info%flag =', & + info%flag, & + 'Value of matrix%n out-of-range', info%more + return + endif + + if(matrix%ne .ne. matrix%ptr(matrix%n+1)-1) then + info%flag = -3 + info%more = matrix%ptr(matrix%n+1)-1 + if (control%ldiag>0 .and. control%lp>0 ) & + write (control%lp,'(/a,i5/a,i5)') & + 'Error return from MC64 with info%flag =', & + info%flag, & + 'Value of ptr(n+1)-1!=ne', info%more + return + endif + endif + + call mc64_matching_hslstd_double(job,matrix_type,matrix%m, & + matrix%n,matrix%ptr,matrix%row,matrix%val,control,info,perm,scale) + end subroutine mc64_matching_zd11_double + + subroutine mc64_matching_hslstd_double(job,matrix_type,m,n,ptr,row, & + val,control,info,perm,scale) + integer, intent(in) :: job ! Control parameter for algorithm choice + integer, intent(in) :: matrix_type + integer, intent(in) :: m + integer, intent(in) :: n + integer, dimension(n+1), intent(in) :: ptr + integer, dimension(*), intent(in) :: row + real(wp), dimension(*), intent(in) :: val + type(mc64_control), intent(in) :: control + type(mc64_info), intent(out) :: info + integer, intent(out) :: perm(m + n) + real(wp), optional, intent(out) :: scale(m + n) + + integer, allocatable :: iw(:) + real(wp), allocatable :: dw(:) + real(wp) :: cntl(10) + integer :: i,j,k,ne,lliw,liw,lldw,ldw,ndiag,num,stat & + ,icntl(10),info64(10) + real(wp), parameter :: zero = 0.0 + logical sym + + stat = 0 + +! Check input data if checking is requested + if (control%checking == 0) then + if (job .lt. 1 .or. job .gt. 5) then + info%flag = -1 + info%more = job + if (control%ldiag>0 .and. control%lp>0 ) & + write (control%lp,'(/a,i5/a,i5)') & + 'Error return from MC64 with info%flag =', & + info%flag, & + 'Value of job out-of-range', info%more + return + endif + + if (n .lt. 1) then + info%flag = -2 + info%more = n + if (control%ldiag>0 .and. control%lp>0 ) & + write (control%lp,'(/a,i5/a,i5)') & + 'Error return from MC64 with info%flag =', & + info%flag, & + 'Value of matrix%n out-of-range', info%more + return + endif + + if (ptr(n+1)-1 .lt. 1) then + info%flag = -3 + info%more = ptr(n+1)-1 + if (control%ldiag>0 .and. control%lp>0 ) & + write (control%lp,'(/a,i5/a,i5)') & + 'Error return from MC64 with info%flag =', & + info%flag, & + 'Value of ptr(n+1)-1 out-of-range', info%more + return + endif + + if (m .lt. n) then + info%flag = -4 + info%more = m + if (control%ldiag>0 .and. control%lp>0 ) & + write (control%lp,'(/a,i5/a,i5)') & + 'Error return from MC64 with info%flag =', & + info%flag, & + 'Value of matrix%m less than matrix%n', info%more + return + endif + +! end of checking + endif + + ne = ptr(n+1)-1 + + icntl(1) = control%lp + icntl(2) = control%wp + icntl(3) = control%sp + +! Action if matrix is symmetric + sym = (matrix_type.ge.HSL_MATRIX_REAL_SYM_PSDEF) + if(sym .and. job.eq.5) then + call sym_maxprod_match(n,ptr,row,val,control,info,perm,scale) + return + endif + if (sym) then + ndiag = 0 +! Matrix is symmetric ... check only lower triangle supplied + if (control%checking == 0) then + do j = 1,n + do k = ptr(j),ptr(j+1)-1 + if (row(k) .lt. j) then + info%flag = -8 + info%more = j + if (control%ldiag>0 .and. control%lp>0 ) & + write (control%lp,'(/a,i5/a,i5)') & + 'Error return from MC64 with info%flag =', & + info%flag, & + 'Input symmetric matrix has entries in upper triangle in column', & + info%more + return + endif + if (row(k) == j) ndiag = ndiag + 1 + enddo + enddo + else + do j = 1,n + do k = ptr(j),ptr(j+1)-1 + if (row(k) == j) ndiag = ndiag + 1 + enddo + enddo + endif +! Reset ne for the expanded symmetric matrix + ne = 2*ne - ndiag + endif + + + if (job == 1) liw = 4*n + m + if (job == 2) liw = 2*n + 2*m + if (job == 3) liw = 8*n+2*m+ne + if (job == 4) liw = 3*n+2*m + if (job == 5) liw = 3*n+2*m +! if (job == 6) liw = 3*n+2*m+ne + + if (job == 1) ldw = 1 + if (job == 2) ldw = m + if (job == 3) ldw = ne + if (job == 4) ldw = 2*m+ne + if (job == 5) ldw = 2*m+n+ne +! if (job == 6) ldw = 3*m+n+ne + +! Expand matrix if symmetric + if (sym) then + lliw = liw+n+1+2*ne + lldw = ldw+2*ne + allocate (iw(lliw),stat=stat) + if (stat/=0) go to 100 + allocate (dw(lldw),stat=stat) + if (stat/=0) go to 100 + + iw(n+2:n+1+ptr(n+1)-1) = row(1:ptr(n+1)-1) + dw(1:ptr(n+1)-1) = val(1:ptr(n+1)-1) + iw(1:n+1) = ptr(1:n+1) + !call mc34ad(n,iw(n+2),iw,.true.,dw,iw(n+2+2*ne)) + call mc34_expand(n,iw(n+2:),iw,iw(n+2+2*ne:),a=dw) + else + allocate (iw(liw),stat=stat) + if (stat/=0) go to 100 + allocate (dw(ldw),stat=stat) + if (stat/=0) go to 100 + endif + + icntl(4) = control%checking + icntl(5:10) = 0 + +! if (m==n .and. control%relax == zero .and. job .le. 5) then + if (m==n) then +! Needed because no ldiag in mc64 + if (control%ldiag .lt. 1) then + icntl(1) = -1 + icntl(2) = -1 + icntl(3) = -1 + endif + if (control%ldiag .eq. 1) then + icntl(2) = -1 + icntl(3) = -1 + endif + if (control%ldiag .eq. 2) then + icntl(3) = -1 + endif + if (sym) then +! Call HSL F77 code + call mc64ad(job,n,ne,iw,iw(n+2),dw,num,perm, & + liw,iw(n+2+2*ne),ldw,dw(2*ne+1),icntl,info64) + info%flag = info64(1) + info%more = info64(2) + if (info64(1) == 2) info%flag = -9 + if (info%flag .lt. 0) go to 80 +! Note that in this case m=n +! Set column permutation and row permutation to be the same + perm(m+1:m+n) = perm(1:m) + else + call mc64ad(job,n,ne,ptr,row,val,num, & + perm(m+1),liw,iw,ldw,dw,icntl,info64) + info%flag = info64(1) + info%more = info64(2) + if (info%flag .lt. 0) go to 80 +! Set row permutation to identity + do i = 1,m + perm(i) = i + enddo +! Invert column permutation + do i = 1,n + iw(abs(perm(m+i))) = sign(i,perm(m+i)) + enddo + do i = 1,n + perm(m+i) = iw(i) + enddo + endif + else + icntl(5) = control%ldiag + icntl(6:10) = 0 +! cntl(1) = control%relax + cntl(1) = zero + call mc64_hsl_a(job,m,n,ne,ptr,row,val, & + num,perm,liw,iw,ldw,dw,icntl,cntl,info64) + info%flag = info64(1) + info%more = info64(2) + if (info%flag .lt. 0) go to 80 +! Set column permutation to identity + do i = 1,n + perm(m+i) = i + enddo + endif + + info%strucrank = num + + if (present(scale) .and. job == 5) then + !!! Commented as handled by seperate subroutine now + !!! if (sym) then + !!! scale(1:m) = (dw(2*ne+1:2*ne+n)+dw(2*ne+n+1:2*ne+2*n))/2 + !!! scale(m+1:m+n) = scale(1:m) + !!! else + scale(1:m) = dw(1:m) + scale(m+1:m+n) = dw(m+1:m+n) + !!! endif + endif + + 80 deallocate (iw, stat=stat) + if (stat/=0) go to 100 + deallocate (dw, stat=stat) + if (stat/=0) go to 100 + + return + + 100 info%flag = -5 + info%stat = stat + if (control%ldiag>0 .and. control%lp>0 ) & + write (control%lp,'(/a,i5/a,i5)') & + 'Error return from MC64 with info%flag =', info%flag, & + 'Allocate or deallocate failed with STAT=',stat + + end subroutine mc64_matching_hslstd_double + + subroutine sym_maxprod_match(n,ptr,row,val,control,info,perm,scale) + integer, intent(in) :: n + integer, dimension(n+1), intent(in) :: ptr + integer, dimension(*), intent(in) :: row + real(wp), dimension(*), intent(in) :: val + type(mc64_control), intent(in) :: control + type(mc64_info), intent(out) :: info + integer, intent(out) :: perm(2*n) + real(wp), optional, intent(out) :: scale(2*n) + + integer, allocatable :: ptr2(:), row2(:), iw(:), new_to_old(:), & + old_to_new(:), cperm(:) + real(wp), allocatable :: val2(:), dw(:), cmax(:), cscale(:) + real(wp) :: colmax + integer :: i,j,k,ne,num,stat,nn,j1,j2,jj + real(wp), parameter :: zero = 0.0 + + stat = 0 + ne = ptr(n+1)-1 + +! Matrix is symmetric ... check only lower triangle supplied + if (control%checking == 0) then + do j = 1,n + do k = ptr(j),ptr(j+1)-1 + if (row(k) .lt. 1 .or. row(k).gt.n) then + info%flag = -6 + info%more = j + if (control%ldiag>0 .and. control%lp>0 ) & + write (control%lp,'(/a,i5/a,i5)') & + 'Error return from MC64 with info%flag =', & + info%flag, & + 'Input symmetric matrix has entries with invald row index & + &in position', & + info%more + return + endif + if (row(k) .lt. j) then + info%flag = -8 + info%more = j + if (control%ldiag>0 .and. control%lp>0 ) & + write (control%lp,'(/a,i5/a,i5)') & + 'Error return from MC64 with info%flag =', & + info%flag, & + 'Input symmetric matrix has entries in upper triangle in & + &position', & + info%more + return + endif + enddo + enddo + endif +! Reset ne for the expanded symmetric matrix + ne = 2*ne + +! Expand matrix, drop explicit zeroes and take log absolute values + allocate (ptr2(n+1), row2(ne), val2(ne), & + iw(5*n), dw(2*n), cmax(n), stat=stat) + if (stat/=0) then + info%flag = -5 + info%stat = stat + if (control%ldiag>0 .and. control%lp>0 ) & + write (control%lp,'(/a,i5/a,i5)') & + 'Error return from MC64 with info%flag =', info%flag, & + 'Allocate or deallocate failed with STAT=',stat + return + endif + + if(control%checking==0) then + ! checking enabled, look for duplicates + iw(1:n) = 0 + do i = 1, n + do j = ptr(i), ptr(i+1)-1 + if(iw(row(j)).ge.i) then + ! duplicate detected + info%flag = -7 + info%more = j + if (control%ldiag>0 .and. control%lp>0 ) & + write (control%lp,'(/a,i5/a,i5)') & + 'Error return from MC64 with info%flag =', & + info%flag, & + 'Input symmetric matrix has duplicate entries in & + &position', & + info%more + return + endif + iw(row(j)) = i + end do + end do + endif + + k = 1 + do i = 1, n + ptr2(i) = k + do j = ptr(i), ptr(i+1)-1 + if(val(j).eq.zero) cycle + row2(k) = row(j) + val2(k) = abs(val(j)) + k = k + 1 + end do + ! Following log is seperated from above loop to expose expensive + ! log operation to vectorization. + val2(ptr2(i):k-1) = log(val2(ptr2(i):k-1)) + end do + ptr2(n+1) = k + call mc34_expand(n, row2, ptr2, iw, a=val2) + +! Compute column maximums + do i = 1, n + colmax = maxval(val2(ptr2(i):ptr2(i+1)-1)) + cmax(i) = colmax + val2(ptr2(i):ptr2(i+1)-1) = colmax - val2(ptr2(i):ptr2(i+1)-1) + end do + + call mc64wd(n,ne,ptr2,row2,val2,perm,num,iw(1),iw(n+1), & + iw(2*n+1),iw(3*n+1),iw(4*n+1),dw(1),dw(n+1)) + + info%flag = 0 + info%strucrank = num + + if(num.eq.n) then ! Full rank +! Note that in this case m=n +! Set column permutation and row permutation to be the same + perm(n+1:n+n) = perm(1:n) + + + if (present(scale)) then + scale(1:n) = (dw(1:n)+dw(n+1:2*n)-cmax(1:n))/2 + !scale(n+1:n+n) = scale(1:n) + ! above line causes segfault in ifort, workaround: + do i = 1, n + scale(n+i) = scale(i) + end do + endif + return + endif + + ! If we reach this point then structually rank deficient: + ! Build a full rank submatrix and call mc64wd on it. + info%flag = 1 ! structually singular warning + + allocate(old_to_new(n),new_to_old(n),cperm(n),stat=info%stat) + if (info%stat.ne.0) then + info%flag = -5 + info%stat = stat + if (control%ldiag>0 .and. control%lp>0 ) & + write (control%lp,'(/a,i5/a,i5)') & + 'Error return from MC64 with info%flag =', info%flag, & + 'Allocate or deallocate failed with STAT=',stat + return + end if + + j = num + 1 + k = 0 + do i = 1,n + if (perm(i) < 0) then + ! row i is not part of the matching + old_to_new(i) = -j + j = j + 1 + else + k = k + 1 + ! old_to_new(i) holds the new index for variable i after + ! removal of singular part and new_to_old(k) is the + ! original index for k + old_to_new(i) = k + new_to_old(k) = i + end if + end do + + ! Overwrite ptr2, row2 and val2 + ne = 0 + k = 0 + ptr2(1) = 1 + j2 = 1 + do i = 1,n + j1 = j2 + j2 = ptr2(i+1) + ! skip over unmatched entries + if (perm(i) < 0) cycle + k = k + 1 + do j = j1,j2-1 + jj = row2(j) + if (perm(jj) < 0) cycle + ne = ne + 1 + row2(ne) = old_to_new(jj) + val2(ne) = val2(j) + end do + ptr2(k+1) = ne + 1 + end do + ! nn is order of non-singular part. + nn = k + call mc64wd(nn,ne,ptr2,row2,val2,cperm,num, & + iw(1),iw(nn+1),iw(2*nn+1),iw(3*nn+1),iw(4*nn+1), & + dw(1),dw(nn+1)) + + if(present(scale)) then + do i = 1,n + j = old_to_new(i) + if (j < 0) then + scale(i) = -huge(scale) + else + ! Note: we need to subtract col max using old matrix numbering + scale(i) = (dw(j)+dw(nn+j)-cmax(i))/2 + end if + end do + endif + + perm(1:n) = -1 + do i = 1,nn + j = cperm(i) + perm(new_to_old(i)) = j + end do + + do i = 1, n + if(perm(i).eq.-1) then + perm(i) = old_to_new(i) + endif + end do + + perm(n+1:n+n) = perm(1:n) + + ! Apply Duff and Pralet correction to unmatched row scalings + if(present(scale)) then + allocate(cscale(n), stat=stat) + if(stat/=0) then + info%flag = -5 + info%stat = stat + if (control%ldiag>0 .and. control%lp>0 ) & + write (control%lp,'(/a,i5/a,i5)') & + 'Error return from MC64 with info%flag =', info%flag, & + 'Allocate or deallocate failed with STAT=',stat + return + endif + ! For columns i not in the matched set I, set + ! s_i = 1 / (max_{k in I} | a_ik s_k |) + ! with convention that 1/0 = 1 + cscale(1:n) = scale(1:n) + do i = 1,n + do j = ptr(i), ptr(i+1)-1 + k = row(j) + if(cscale(i).eq.-huge(scale).and.cscale(k).ne.-huge(scale)) then + ! i not in I, k in I + scale(i) = max(scale(i), log(abs(val(j)))+scale(k)) + endif + if(cscale(k).eq.-huge(scale).and.cscale(i).ne.-huge(scale)) then + ! k not in I, i in I + scale(k) = max(scale(k), log(abs(val(j)))+scale(i)) + endif + end do + end do + do i = 1,n + if(cscale(i).ne.-huge(scale)) cycle ! matched part + if(scale(i).eq.-huge(scale)) then + scale(i) = zero + else + scale(i) = -scale(i) + endif + end do + endif + + end subroutine sym_maxprod_match + +!********************************************************************** +!CCCC LAST UPDATE Tue Nov 26 03:20:26 MET 2002 +SUBROUTINE MC64_HSL_A (JOB, M, N, NE, IP, IRN, A, NUM, PERM, LIW,& + IW, LDW, DW, ICNTL, CNTL, INFO) + IMPLICIT NONE +! +! *** Copyright (c) 2002 I.S. Duff and J. Koster *** +! *** Although every effort has been made to ensure robustness and *** +! *** reliability of the subroutines in this MC64 suite, we *** +! *** disclaim any liability arising through the use or misuse of *** +! *** any of the subroutines. *** +! +! Purpose +! ======= +! +! This subroutine attempts to find a permutation for an MxN, M>=N, +! sparse matrix A = {a_ij} that makes the permuted matrix have N +! entries on its diagonal. +! If the matrix is structurally nonsingular, the subroutine optionally +! returns a permutation that maximizes the smallest element on the +! diagonal, maximizes the sum of the diagonal entries, or maximizes +! the product of the diagonal entries of the permuted matrix. +! For the latter option, the subroutine also finds scaling factors that +! may be used to scale the matrix so that the nonzero diagonal entries +! of the permuted matrix are one in absolute value and all the +! off-diagonal entries are less than or equal to one in absolute value. +! The natural logarithms of the scaling factors u(i), i=1..M, for the +! rows and v(j), j=1..N, for the columns are returned so that the +! scaled matrix B = {b_ij} has entries b_ij = a_ij * EXP(u_i + v_j). +! The scaling factors are returned by this subroutine, but the actual +! scaling of the matrix has to be performed by the calling program. +! +! Parameters +! ========== +! + INTEGER NICNTL, NCNTL, NINFO + PARAMETER (NICNTL = 10, NCNTL = 10, NINFO = 10) + + INTEGER JOB, M, N, NE, NUM, LIW, LDW + INTEGER IP (N + 1), IRN (NE), PERM (M), IW (LIW) + INTEGER ICNTL(NICNTL), INFO (NINFO) + REAL(WP) A (NE) +! +! JOB is an INTEGER variable which must be set by the user to control +! the action. It is not altered by the subroutine. +! Possible values for JOB are: +! 1 Compute a column permutation of the matrix so that the +! permuted matrix has as many entries on its diagonal as possible. +! The values on the diagonal are of arbitrary size. HSL subroutine +! MC21A/MC64Z is used for this. See [1]. +! 2 Compute a column permutation of the matrix so that the smallest +! value on the diagonal of the permuted matrix is maximized. +! See [3]. +! 3 Compute a column permutation of the matrix so that the smallest +! value on the diagonal of the permuted matrix is maximized. +! The algorithm differs from the one used for JOB = 2 and may +! have quite a different performance. See [2]. +! 4 Compute a column permutation of the matrix so that the sum +! of the diagonal entries of the permuted matrix is maximized. +! See [3]. +! 5 Compute a column permutation of the matrix so that the product +! of the diagonal entries of the permuted matrix is maximized +! and vectors to scale the matrix so that the nonzero diagonal +! entries of the permuted matrix are one in absolute value and +! all the off-diagonal entries are less than or equal to one in +! absolute value. See [3]. +! Restriction: 1 <= JOB <= 5. +! +! M is an INTEGER variable which must be set by the user to the +! number of rows of the matrix A. It is not altered by the +! subroutine. Restriction: M >= N. +! +! N is an INTEGER variable which must be set by the user to the +! number of columns of the matrix A. It is not altered by the +! subroutine. Restriction: N >= 1. +! +! NE is an INTEGER variable which must be set by the user to the +! number of entries in the matrix. It is not altered by the +! subroutine. Restriction: NE >= 1. +! +! IP is an INTEGER array of length N+1. +! IP(J), J=1..N, must be set by the user to the position in array IRN +! of the first row index of an entry in column J. IP(N+1) must be set +! to NE+1. It is not altered by the subroutine. +! +! IRN is an INTEGER array of length NE. +! IRN(K), K=1..NE, must be set by the user to hold the row indices of +! the entries of the matrix. Those belonging to column J must be +! stored contiguously in the positions IP(J)..IP(J+1)-1. The ordering +! of the row indices within each column is unimportant. Repeated +! entries are not allowed. The array IRN is not altered by the +! subroutine. +! +! A is a REAL array of length NE. +! The user must set A(K), K=1..NE, to the numerical value of the +! entry that corresponds to IRN(K). +! It is not used by the subroutine when JOB = 1. +! It is not altered by the subroutine. +! +! NUM is an INTEGER variable that need not be set by the user. +! On successful exit, NUM will be the number of entries on the +! diagonal of the permuted matrix. +! If NUM < N, the matrix is structurally singular. +! +! PERM is an INTEGER array of length M that need not be set by the +! user. On successful exit, PERM can be interpreted in any of the +! following ways: +! +! 1. If M=N, PERM contains the column permutation. +! Column PERM(I) of the original matrix is column I in the +! permuted matrix, I=1..N. +! (This was the definition of parameter CPERM in versions of +! MC64AD before version 1.2b) +! +! 2. If M>=N, PERM contains the row permutation. +! Row I of the original matrix is row ABS(PERM(I)) in the +! permuted matrix, I=1..M. +! The rows where PERM(I) is positive constitute an N by N matrix +! the scaled version of which has ones on the diagonal. +! +! LIW is an INTEGER variable that must be set by the user to +! the dimension of array IW. It is not altered by the subroutine. +! Restriction: +! JOB = 1 : LIW >= 4N + M +! JOB = 2 : LIW >= 2N + 2M +! JOB = 3 : LIW >= 8N + 2M + NE +! JOB = 4 : LIW >= 3N + 2M +! JOB = 5 : LIW >= 3N + 2M +! +! IW is an INTEGER array of length LIW that is used for workspace. +! +! LDW is an INTEGER variable that must be set by the user to the +! dimension of array DW. It is not altered by the subroutine. +! Restriction: +! JOB = 1 : LDW not used +! JOB = 2 : LDW >= M +! JOB = 3 : LDW >= NE +! JOB = 4 : LDW >= 2M + NE +! JOB = 5 : LDW >= N + 2M + NE +! +! DW is a REAL array of length LDW used for workspace. +! If JOB = 5, on return, DW(i) contains u_i, i=1..M, and +! DW(M+j) contains v_j, j=1..N. +! +! ICNTL is an INTEGER array of length NICNTL. +! Its components control the output of MC64AD and must be set by the +! user before calling MC64AD. They are not altered by the subroutine. +! +! ICNTL(1) must be set to specify the output stream for +! error messages. If ICNTL(1) < 0, messages are suppressed. +! +! ICNTL(2) must be set by the user to specify the output stream for +! warning messages. If ICNTL(2) < 0, messages are suppressed. +! +! ICNTL(3) must be set by the user to specify the output stream for +! diagnostic messages. If ICNTL(3) < 0, messages are suppressed. +! +! ICNTL(4) must be set by the user to a value other than 0 to avoid +! checking of the input data. Setting ICNTL(4) to any +! other will avoid the checks but is likely to cause problems +! later if out-of-range indices or duplicates are present. +! The user should set ICNTL(4) nonzero, if the data is known not +! to contain such problems. The code will exhibit undefined +! behaviour in case data checking is not done and the +! input data does not satisfy the restrictions as listed +! elsewhere. +! +! ICNTL(5) must be set by the user to control the printing of +! diagnostic messages. +! If ICNTL(5) <= 0, no messages are output. +! If ICNTL(5) = 1, only error messages are output. +! If ICNTL(5) = 2, error and warning messages output. +! If ICNTL(5) = 3, as for 2 plus scalar parameters, the first +! ten entries of array parameters, and the control parameters on +! the first entry. +! If ICNTL(5) > 3, full data will be printed on entry and exit. +! +! CNTL is a REAL array of length NCNTL. +! Its components control the output of MC64AD and must be set by the +! user before calling MC64AD. They are not altered by the subroutine. +! +! CNTL(1) must be set to specify the relaxation parameter. +! It is used by MC64 only if JOB = 3,4,5. +! It must be set to a non-negative value (usually close to zero). +! If CNTL(1) < 0.0, it is treated as 0.0. +! +! CNTL(1) is a relaxation parameter. A positive value will lead to +! matchings computed by MC64AD that are not optimal/maximal in some +! sense but only nearly so. However, these non-optimal matchings are +! often computed more quickly. Appropriate values for CNTL(1) are +! problem dependent but usually slightly larger than 0.0. +! +! +! INFO is an INTEGER array of length NINFO which need not be set by the +! user. INFO(1) is set non-negative to indicate success. A negative +! value is returned if an error occurred, a positive value if a +! warning occurred. INFO(2) holds further information on the error. +! On exit from the subroutine, INFO(1) will take one of the +! following values: +! 0 : successful entry (for structurally nonsingular matrix). +! +1 : successful entry (for structurally singular matrix). +! +2 : the returned scaling factors are large and may cause +! overflow when used to scale the matrix. +! (For JOB = 4,5 entries only.) +! +4 : CNTL(1) is negative and treated as zero. +! -1 : JOB < 1 or JOB > 5. Value of JOB held in INFO(2). +! -2 : N < 1. Value of invalid N held in INFO(2). +! -3 : NE < 1. Value of NE held in INFO(2). +! -4 : M < N. Value of M held in INFO(2). +! -6 : entries are found whose row indices are out of range. INFO(2) +! contains the position in arrays A/IRN in which first entry is found. +! (This value can be returned only if ICNTL(4) was set to zero.) +! -7 : repeated entries are found. INFO(2) contains the position in arrays +! A/IRN in which first entry is found. +! (This value can be returned only if ICNTL(4) was set to zero.) +! +! A return with one of the values INFO(1)=+3,+5,+6,+7 is also possible +! These values are combinations of the above warnings (+1,+2,+4) and +! correspond to the sum of the constituent warnings. +! +! INFO(3) to INFO(NINFO) are not currently used and are set to zero +! by the routine. +! + REAL(WP) DW (LDW), CNTL (NCNTL) +! References: +! [1] I. S. Duff, (1981), +! "Algorithm 575. Permutations for a zero-free diagonal", +! ACM Trans. Math. Software 7(3), 387-390. +! [2] I. S. Duff and J. Koster, (1998), +! "The design and use of algorithms for permuting large +! entries to the diagonal of sparse matrices", +! SIAM J. Matrix Anal. Appl., vol. 20, no. 4, pp. 889-901. +! [3] I. S. Duff and J. Koster, (2001), +! "On algorithms for permuting large entries to the diagonal +! of sparse matrices", +! SIAM J. Matrix Anal. Appl., vol. 22, no. 4, pp. 973-996. + +! Local variables and parameters + INTEGER I, J, K, WARN1, WARN2, WARN4 + REAL(WP) FACT, RINF + REAL(WP), PARAMETER :: ZERO = 0.0_WP + REAL(WP), PARAMETER :: ONE = 1.0_WP +! Intrinsic functions + INTRINSIC ABS, LOG + +! Set RINF to largest positive real number (infinity) + RINF = HUGE (RINF) + RINF = RINF / N + WARN1 = 0 + WARN2 = 0 + WARN4 = 0 +! Check value of JOB + IF (ICNTL(4).EQ.0) THEN +! Check input data + IF (JOB.LT.1.OR.JOB.GT.5) THEN + INFO (1) = - 1 + INFO (2) = JOB + IF (ICNTL(1).GE.0 .AND. ICNTL(5).GT.0) & + WRITE (ICNTL(1) , 9001) INFO (1) , 'JOB', JOB + GOTO 99 + ENDIF +! Check value of N + IF (N.LT.1) THEN + INFO (1) = - 2 + INFO (2) = N + IF (ICNTL(1).GE.0 .AND. ICNTL(5).GT.0) & + WRITE (ICNTL(1) , 9001) INFO (1) , 'N', N + GOTO 99 + ENDIF +! Check value of NE + IF (NE.LT.1) THEN + INFO (1) = - 3 + INFO (2) = NE + IF (ICNTL(1) .GE.0 .AND. ICNTL(5).GT.0) & + WRITE (ICNTL(1) , 9001) INFO (1) , 'NE', NE + GOTO 99 + ENDIF +! Check value of M + IF (M.LT.N) THEN + INFO (1) = - 4 + INFO (2) = M + IF (ICNTL(1) .GE.0 .AND. ICNTL(5).GT.0) & + WRITE (ICNTL(1) , 9001) INFO (1) , 'M', M + GOTO 99 + ENDIF +! Check LIW +! IF (JOB.EQ.1) K = 4*N + M +! IF (JOB.EQ.2) K = 2*N + 2*M +! IF (JOB.EQ.3) K = 8*N + 2*M + NE +! IF (JOB.EQ.4) K = 3*N + 2*M +! IF (JOB.EQ.5) K = 3*N + 2*M +! IF (JOB.EQ.6) K = 3*N + 2*M + NE +! IF (LIW.LT.K) THEN +! INFO(1) = -5 +! INFO(2) = K +! IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9004) INFO(1),K +! GO TO 99 +! ENDIF +! Check LDW; If JOB = 1, do not check +! IF (JOB.GT.1) THEN +! IF (JOB.EQ.2) K = M +! IF (JOB.EQ.3) K = NE +! IF (JOB.EQ.4) K = 2*M + NE +! IF (JOB.EQ.5) K = N + 2*M + NE +! IF (JOB.EQ.6) K = N + 3*M + NE +! IF (LDW.LT.K) THEN +! INFO(1) = -5 +! INFO(2) = K +! IF (ICNTL(1).GE.0) WRITE(ICNTL(1),9005) INFO(1),K +! GO TO 99 +! ENDIF +! ENDIF + ENDIF + IF (ICNTL(4) .EQ.0) THEN +! Check row indices. Use IW(1:M) as workspace + DO 3 I = 1, M + IW (I) = 0 + 3 END DO + DO 6 J = 1, N + DO 4 K = IP (J), IP (J + 1) - 1 + I = IRN (K) +! Check for row indices that are out of range + IF (I.LT.1.OR.I.GT.M) THEN + INFO (1) = - 6 + INFO (2) = K + IF (ICNTL(1).GE.0 .AND. ICNTL(5).GT.0) & + WRITE (ICNTL(1), 9006) INFO (1), J, I + GOTO 99 + ENDIF +! Check for repeated row indices within a column + IF (IW (I) .EQ.J) THEN + INFO (1) = - 7 + INFO (2) = K + IF (ICNTL(1).GE.0 .AND. ICNTL(5).GT.0) & + WRITE (ICNTL(1), 9007) INFO (1), J, I + GOTO 99 + ELSE + IW (I) = J + ENDIF + 4 END DO + 6 END DO + ENDIF + +! Print diagnostics on input + IF (ICNTL(5).GT.2) THEN + IF (ICNTL(3) .GE.0) THEN + WRITE (ICNTL(3), 9020) JOB, M, N, NE + IF (ICNTL(5).EQ.3) THEN + WRITE (ICNTL(3), 9021) (IP (J), J = 1, MIN (10, N + 1) ) + WRITE (ICNTL(3), 9022) (IRN (J), J = 1, MIN (10, NE) ) + IF (JOB.GT.1) WRITE (ICNTL(3), 9023) (A (J), J = 1, MIN & + (10, NE) ) + ELSE + WRITE (ICNTL(3), 9021) (IP (J), J = 1, N + 1) + WRITE (ICNTL(3), 9022) (IRN (J), J = 1, NE) + IF (JOB.GT.1) WRITE (ICNTL(3), 9023) (A (J), J = 1, NE) + ENDIF + WRITE (ICNTL(3), 9024) (ICNTL(J), J = 1, NICNTL) + WRITE (ICNTL(3), 9025) CNTL(1) + ENDIF + ENDIF + +! Set components of INFO to zero + DO I = 1, NINFO + INFO (I) = 0 + END DO + +! Compute maximum matching + IF (JOB.EQ.1) THEN +! Put length of column J in IW(J) + DO J = 1, N + IW (J) = IP (J + 1) - IP (J) + END DO +! IW(N+1:3N+M+N) is workspace + CALL MC64_HSL_Z (M, N, IRN, NE, IP, IW (1), PERM, NUM, IW (N +& + 1), IW (2 * N + 1), IW (3 * N + 1), IW (3 * N + M + 1) ) + GOTO 90 + ENDIF + +! Compute bottleneck matching + IF (JOB.EQ.2) THEN +! Pass CNTL(1) to MC64B through DW(1) + DW (1) = MAX (ZERO, CNTL (1) ) +! IW(1:2N+2M), DW(1:M) are workspaces + CALL MC64_HSL_B (M, N, NE, IP, IRN, A, PERM, NUM, IW (1), & + IW (N + 1), IW (2 * N + 1), IW (2 * N + M + 1), DW, RINF) + GOTO 90 + ENDIF + +! Compute bottleneck matching + IF (JOB.EQ.3) THEN +! Copy IRN(K) into IW(K), ABS(A(K)) into DW(K), K=1..NE + DO K = 1, NE + IW (K) = IRN (K) + DW (K) = ABS (A (K) ) + END DO +! Sort entries in each column by decreasing value. + CALL MC64RD (N, NE, IP, IW, DW) +! Pass CNTL(1) to MC64S through FACT + FACT = MAX (ZERO, CNTL (1) ) +! IW(NE+1:NE+5N+M+(3N+M)) is workspace + CALL MC64_HSL_S (M, N, NE, IP, IW (1), DW, PERM, NUM, IW ( & + NE+1), IW (NE+N + 1), IW (NE+2 * N + 1), IW (NE+3 * N + 1), & + IW (NE+4 * N + 1), IW (NE+5 * N + 1), IW (NE+5 * N + M + 1), & + FACT, RINF) + GOTO 90 + ENDIF + + IF (JOB.EQ.4) THEN + DO J = 1, N + FACT = ZERO + DO K = IP (J), IP (J + 1) - 1 + IF (ABS (A (K) ) .GT.FACT) FACT = ABS (A (K) ) + END DO + DO K = IP (J), IP (J + 1) - 1 + DW (2 * M + K) = FACT - ABS (A (K) ) + END DO + END DO +! B = DW(2M+1:2M+NE); IW(1:3N+2M) and DW(1:2M) are workspaces +! Pass CNTL(1) to MC64W through DW(1) +! Pass JOB to MC64W through IW(1) + DW (1) = MAX (ZERO, CNTL (1) ) + IW (1) = JOB +! Call MC64W + CALL MC64_HSL_W (M, N, NE, IP, IRN, DW (2 * M + 1), PERM, NUM,& + IW (1), IW (N + 1), IW (2 * N + 1), IW (3 * N + 1), IW (3 * N +& + M + 1), DW (1), DW (M + 1), RINF) + GOTO 90 + ENDIF + + IF (JOB.EQ.5.or.JOB.EQ.6) THEN + IF (JOB.EQ.5) THEN + DO 75 J = 1, N + FACT = ZERO + DO K = IP (J), IP (J + 1) - 1 + DW (2 * M + N + K) = ABS (A (K) ) + IF (DW (2 * M + N + K) .GT.FACT) FACT = DW (2 * M + N & + + K) + END DO + DW (2 * M + J) = FACT +!CC Significant change made here so that column with single +! zero gets set to RINF and not 1.0 + IF (FACT.NE.ZERO) THEN + FACT = LOG (FACT) + ELSE + FACT = RINF + ENDIF + DO K = IP (J), IP (J + 1) - 1 + IF (DW (2 * M + N + K) .NE.ZERO) THEN + DW (2 * M + N + K) = FACT - LOG (DW (2 * M + N + K)& + ) + ELSE +! write(*,*) 'set diag to ',RINF + DW (2 * M + N + K) = RINF +!5.0D+14 +!*RINF/(N+1) + ENDIF + END DO +! ELSE +! DO 71 K = IP(J),IP(J+1)-1 +! DW(2*M+N+K) = ONE +! 71 CONTINUE +! ENDIF + 75 END DO + ENDIF + +! IF (JOB.EQ.6) THEN +! DO 175 K = 1,NE +! IW(3*N+2*M+K) = IRN(K) +! DW(2*M+N+K) = ABS(A(K)) +! 175 CONTINUE +! DO 61 I = 1,M +! DW(2*M+N+NE+I) = ZERO +! 61 CONTINUE +! DO 63 J = 1,N +! DO 62 K = IP(J),IP(J+1)-1 +! I = IRN(K) +! IF (DW(2*M+N+K).GT.DW(2*M+N+NE+I)) THEN +! DW(2*M+N+NE+I) = DW(2*M+N+K) +! ENDIF +! 62 CONTINUE +! 63 CONTINUE +! DO 64 I = 1,M +! IF (DW(2*M+N+NE+I).NE.ZERO) THEN +! DW(2*M+N+NE+I) = 1/DW(2*M+N+NE+I) +! ENDIF +! 64 CONTINUE +! DO 66 J = 1,N +! DO 65 K = IP(J),IP(J+1)-1 +! I = IRN(K) +! DW(2*M+N+K) = DW(2*M+N+NE+I) * DW(2*M+N+K) +! 65 CONTINUE +! 66 CONTINUE +! CALL MC64R(N,NE,IP,IW(3*N+2*M+1),DW(2*M+N+1)) +! DO 176 J = 1,N +! IF (IP(J).NE.IP(J+1)) THEN +! FACT = DW(2*M+N+IP(J)) +! ELSE +! FACT = ZERO +! ENDIF +! DW(2*M+J) = FACT +! IF (FACT.NE.ZERO) THEN +! FACT = LOG(FACT) +! DO 170 K = IP(J),IP(J+1)-1 +! IF (DW(2*M+N+K).NE.ZERO) THEN +! DW(2*M+N+K) = FACT - LOG(DW(2*M+N+K)) +! ELSE +! write(*,*) 'set diag to ',RINF +! DW(2*M+N+K) = RINF +!5.0D+14 +!0.5* RINF/(N+1) +! ENDIF +! 170 CONTINUE +! ELSE +! DO 171 K = IP(J),IP(J+1)-1 +! DW(2*M+N+K) = ONE +! 171 CONTINUE +! ENDIF +! 176 CONTINUE +! ENDIF +! Pass CNTL(1) to MC64W through DW(1) +! Pass JOB to MC64W through IW(1) + DW (1) = MAX (ZERO, CNTL (1) ) + IW (1) = JOB +! Call MC64W + IF (JOB.EQ.5) THEN + CALL MC64_HSL_W (M, N, NE, IP, IRN, DW (2 * M + N + 1), & + PERM, NUM, IW (1), IW (N + 1), IW (2 * N + 1), IW (3 * N + & + 1), IW (3 * N + M + 1), DW (1), DW (M + 1), RINF) + ENDIF + +! IF (JOB.EQ.6) THEN +! CALL MC64_HSL_W(M,N,NE,IP,IW(3*N+2*M+1),DW(2*M+N+1),PERM,NUM, +! & IW(1),IW(N+1),IW(2*N+1),IW(3*N+1),IW(3*N+M+1), +! & DW(1),DW(M+1),RINF) +! ENDIF +! IF (JOB.EQ.6) THEN +! DO 79 I = 1,M +! IF (DW(2*M+N+NE+I).NE.0) THEN +! DW(I) = DW(I) + LOG(DW(2*M+N+NE+I)) +! ENDIF +! 79 CONTINUE +! ENDIF + IF (NUM.EQ.N) THEN + DO J = 1, N + IF (DW (2 * M + J) .NE.ZERO) THEN + DW (M + J) = DW (M + J) - LOG (DW (2 * M + J) ) + ELSE + DW (M + J) = ZERO + ENDIF + END DO + ENDIF +! Check size of row and column scaling factors + FACT = 0.5 * LOG (RINF) + DO J = 1, N + IF (DW (M + J) .LT.FACT) CYCLE + WARN2 = 2 +! Scaling factor is large, return with warning + GOTO 90 + END DO + DO I = 1, M + IF (DW (I) .LT.FACT) CYCLE + WARN2 = 2 +! Scaling factor is large, return with warning + GOTO 90 + END DO +! GO TO 90 + ENDIF + +! If matrix is structurally singular, return with warning + 90 IF (NUM.LT.N) WARN1 = 1 + +! If CNTL(1) is negative and treated as zero, return with warning + IF (JOB.EQ.4.OR.JOB.EQ.5.OR.JOB.EQ.6) THEN + IF (CNTL (1) .LT.ZERO) WARN4 = 4 + ENDIF + +! Set warning flag and print warnings (only if no errors were found) + IF (INFO (1) .EQ.0) THEN + INFO (1) = WARN1 + WARN2 + WARN4 + IF (INFO (1).GT.0 .AND. ICNTL(2).GE.0 .AND. ICNTL(5).GT.1) THEN + WRITE (ICNTL(2), 9010) INFO (1) + IF (WARN1.EQ.1) WRITE (ICNTL(2), 9011) + IF (WARN2.EQ.2) WRITE (ICNTL(2), 9012) + IF (WARN4.EQ.4) WRITE (ICNTL(2), 9014) + ENDIF + ENDIF +! Print diagnostics on output + IF (ICNTL(5).GT.2) THEN + IF (ICNTL(3).GE.0) THEN + WRITE (ICNTL(3), 9030) (INFO (J), J = 1, 2) + WRITE (ICNTL(3), 9031) NUM + IF (ICNTL(5) .EQ.3) THEN + WRITE (ICNTL(3), 9032) (PERM (J), J = 1, MIN (10, M) ) + IF (JOB.EQ.5.OR.JOB.EQ.6) THEN + WRITE (ICNTL(3), 9033) (DW (J), J = 1, MIN (10, M) ) + WRITE (ICNTL(3), 9034) (DW (M + J), J = 1, MIN (10, N)) + ENDIF + ELSE + WRITE (ICNTL(3), 9032) (PERM (J), J = 1, M) + IF (JOB.EQ.5.OR.JOB.EQ.6) THEN + WRITE (ICNTL(3), 9033) (DW (J), J = 1, M) + WRITE (ICNTL(3), 9034) (DW (M + J), J = 1, N) + ENDIF + ENDIF + ENDIF + ENDIF + +! Return from subroutine. + 99 RETURN + + 9001 FORMAT (' ****** Error in MC64A/AD. INFO(1) = ',I2, & + & ' because ',(A),' = ',I10) +!9004 FORMAT (' ****** Error in MC64A/AD. INFO(1) = ',I2/ & +! & ' LIW too small, must be at least ',I8) +!9005 FORMAT (' ****** Error in MC64A/AD. INFO(1) = ',I2/ & +! & ' LDW too small, must be at least ',I8) + 9006 FORMAT (' ****** Error in MC64A/AD. INFO(1) = ',I2/ & + & ' Column ',I8, & + & ' contains an entry with invalid row index ',I8) + 9007 FORMAT (' ****** Error in MC64A/AD. INFO(1) = ',I2/ & + & ' Column ',I8, & + & ' contains two or more entries with row index ',I8) + + 9010 FORMAT (' ****** Warning from MC64A/AD. INFO(1) = ',I2) + 9011 FORMAT (' - The matrix is structurally singular.') + 9012 FORMAT (' - Some scaling factors may be too large.') + 9014 FORMAT (' - CNTL(1) is negative and was treated as zero.') + + 9020 FORMAT (' ****** Input parameters for MC64AD:'/ & + & ' JOB =',I10/' M =',I10/' N =',I10/' NE =',I10) + 9021 FORMAT (' IP(1:N+1) = ',8I8/(14X,8I8)) + 9022 FORMAT (' IRN(1:NE) = ',8I8/(14X,8I8)) + 9023 FORMAT (' A(1:NE) = ',4(1PD14.4)/(14X,4(1PD14.4))) + 9024 FORMAT (' ICNTL(1:10)= ',8I8/(14X,2I8)) + 9025 FORMAT (' CNTL(1) = ',1PD14.4) + 9030 FORMAT (' ****** Output parameters for MC64AD:'/ & + & ' INFO(1:2) = ',2I8) + 9031 FORMAT (' NUM = ',I8) + 9032 FORMAT (' PERM(1:M) = ',8I8/(14X,8I8)) + 9033 FORMAT (' DW(1:M) = ',5(F11.3)/(14X,5(F11.3))) + 9034 FORMAT (' DW(M+1:M+N)= ',5(F11.3)/(14X,5(F11.3))) +END SUBROUTINE MC64_HSL_A + +!********************************************************************** +!CCCC LAST UPDATE Tue Nov 26 03:20:26 MET 2002 +SUBROUTINE MC64_HSL_B (M, N, NE, IP, IRN, A, IPERM, NUM, JPERM, & + PR, Q, L, D, RINF) + IMPLICIT NONE +! +! *** Copyright (c) 2002 I.S. Duff and J. Koster *** +! *** Although every effort has been made to ensure robustness and *** +! *** reliability of the subroutines in this MC64 suite, we *** +! *** disclaim any liability arising through the use or misuse of *** +! *** any of the subroutines. *** +! + INTEGER M, N, NE, NUM + INTEGER IP (N + 1), IRN (NE), IPERM (M), JPERM (N), PR (N), & + Q (M), L (M) + REAL(WP) A (NE) + REAL(WP) D (M), RINF + +! N, NE, IP, IRN are described in MC64AD. +! A is a REAL array of length NE. +! A(K), K=1..NE, must be set to the value of the entry +! that corresponds to IRN(K). It is not altered. +! IPERM is an INTEGER array of length M. On exit, it contains the +! matching: IPERM(I) = 0 or row I is matched to column IPERM(I). +! NUM is INTEGER variable. On exit, it contains the cardinality of the +! matching stored in IPERM. +! D is a REAL work array of length M. +! On entry, D(1) contains the relaxation parameter RLX. +! RINF is the largest positive real number + +! Local variables + INTEGER I, II, J, JJ, JORD, Q0, QLEN, IDUM, JDUM, ISP, JSP, K, KK,& + KK1, KK2, I0, UP, LOW, LPOS + REAL(WP) CSP, DI, DNEW, DQ0, AI, A0, BV, TBV, RLX +! Local parameters + REAL(WP), PARAMETER :: ZERO=0.0_WP + REAL(WP), PARAMETER :: MINONE=-1.0_WP + INTRINSIC ABS, MIN +! External subroutines and/or functions + EXTERNAL MC64DD, MC64ED, MC64FD + +! Initialize variables to eliminate copmiler warnings + I0 = -HUGE(I0); ISP = -HUGE(ISP); JSP = -HUGE(JSP) + + RLX = D (1) +! Initialization + NUM = 0 + BV = RINF + DO K = 1, N + JPERM (K) = 0 + PR (K) = IP (K) + END DO + DO K = 1, M + IPERM (K) = 0 + D (K) = ZERO + END DO + + DO J = 1, N + A0 = MINONE + DO K = IP (J), IP (J + 1) - 1 + I = IRN (K) + AI = ABS (A (K) ) + IF (AI.GT.D (I) ) D (I) = AI + IF (JPERM (J) .NE.0) CYCLE + IF (AI.GE.BV) THEN + A0 = BV + IF (IPERM (I) .NE.0) CYCLE + JPERM (J) = I + IPERM (I) = J + NUM = NUM + 1 + ELSE + IF (AI.LE.A0) CYCLE + A0 = AI + I0 = I + ENDIF + END DO + IF (A0.NE.MINONE.AND.A0.LT.BV) THEN + BV = A0 + IF (IPERM (I0) .NE.0) CYCLE + IPERM (I0) = J + JPERM (J) = I0 + NUM = NUM + 1 + ENDIF + END DO + + IF (M.EQ.N) THEN +! Update BV with smallest of all the largest maximum absolute values +! of the rows. D(I) contains the largest absolute value in row I. + DO I = 1, M + BV = MIN (BV, D (I) ) + END DO + ENDIF + +! Shortcut if all columns are matched at this stage. + IF (NUM.EQ.N) GOTO 1000 + +! Rescan unassigned columns; improve initial assignment + DO J = 1, N + IF (JPERM (J) .NE.0) CYCLE + DO K = IP (J), IP (J + 1) - 1 + I = IRN (K) + AI = ABS (A (K) ) + IF (AI.LT.BV) CYCLE + IF (IPERM (I) .EQ.0) GOTO 90 + JJ = IPERM (I) + KK1 = PR (JJ) + KK2 = IP (JJ + 1) - 1 + IF (KK1.GT.KK2) CYCLE + DO KK = KK1, KK2 + II = IRN (KK) + IF (IPERM (II) .NE.0) CYCLE + IF (ABS (A (KK) ) .GE.BV) GOTO 80 + END DO + PR (JJ) = KK2 + 1 + END DO + CYCLE + 80 JPERM (JJ) = II + IPERM (II) = JJ + PR (JJ) = KK + 1 + 90 NUM = NUM + 1 + JPERM (J) = I + IPERM (I) = J + PR (J) = K + 1 + END DO + +! Shortcut if all columns are matched at this stage. + IF (NUM.EQ.N) GOTO 1000 + +! Prepare for main loop + DO I = 1, M + D (I) = MINONE + L (I) = 0 + END DO +! TBV is a relaxed value of BV (ie TBV is slightly smaller than BV). + TBV = BV * (1 - RLX) + +! Main loop ... each pass round this loop is similar to Dijkstra's +! algorithm for solving the single source shortest path problem + + DO JORD = 1, N + + IF (JPERM (JORD) .NE.0) CYCLE + QLEN = 0 + LOW = M + 1 + UP = M + 1 +! CSP is cost of shortest path to any unassigned row +! ISP is matrix position of unassigned row element in shortest path +! JSP is column index of unassigned row element in shortest path + CSP = MINONE +! Build shortest path tree starting from unassigned column JORD + J = JORD + PR (J) = - 1 + +! Scan column J + DO K = IP (J), IP (J + 1) - 1 + I = IRN (K) + DNEW = ABS (A (K) ) + IF (CSP.GE.DNEW) CYCLE + IF (IPERM (I) .EQ.0) THEN +! Row I is unassigned; update shortest path info + CSP = DNEW + ISP = I + JSP = J + IF (CSP.GE.TBV) GOTO 160 + ELSE + D (I) = DNEW + IF (DNEW.GE.TBV) THEN +! Add row I to Q2 + LOW = LOW - 1 + Q (LOW) = I + ELSE +! Add row I to Q, and push it + QLEN = QLEN + 1 + L (I) = QLEN + CALL MC64DD (I, M, Q, D, L, 1) + ENDIF + JJ = IPERM (I) + PR (JJ) = J + ENDIF + END DO + + DO JDUM = 1, NUM +! If Q2 is empty, extract new rows from Q + IF (LOW.EQ.UP) THEN + IF (QLEN.EQ.0) EXIT + I = Q (1) + IF (CSP.GE.D (I) ) EXIT + BV = D (I) + TBV = BV * (1 - RLX) + DO IDUM = 1, M + CALL MC64ED (QLEN, M, Q, D, L, 1) + L (I) = 0 + LOW = LOW - 1 + Q (LOW) = I + IF (QLEN.EQ.0) EXIT + I = Q (1) + IF (D (I) .LT.TBV) EXIT + END DO +! End of dummy loop; this point is never reached + ENDIF +! Move row Q0 + UP = UP - 1 + Q0 = Q (UP) + DQ0 = D (Q0) + L (Q0) = UP +! Scan column that matches with row Q0 + J = IPERM (Q0) + DO K = IP (J), IP (J + 1) - 1 + I = IRN (K) +! Update D(I); only if row I is not marked + IF (L (I) .GE.UP) CYCLE + DNEW = MIN (DQ0, ABS (A (K) ) ) + IF (CSP.GE.DNEW) CYCLE + IF (IPERM (I) .EQ.0) THEN +! Row I is unassigned; update shortest path info + CSP = DNEW + ISP = I + JSP = J + IF (CSP.GE.TBV) GOTO 160 + ELSE + DI = D (I) + IF (DI.GE.TBV.OR.DI.GE.DNEW) CYCLE + D (I) = DNEW + IF (DNEW.GE.TBV) THEN +! Delete row I from Q (if necessary); add row I to Q2 + IF (DI.NE.MINONE) THEN + LPOS = L (I) + CALL MC64FD (LPOS, QLEN, M, Q, D, L, 1) + ENDIF + L (I) = 0 + LOW = LOW - 1 + Q (LOW) = I + ELSE +! Add row I to Q (if necessary); push row I up Q + IF (DI.EQ.MINONE) THEN + QLEN = QLEN + 1 + L (I) = QLEN + ENDIF + CALL MC64DD (I, M, Q, D, L, 1) + ENDIF +! Update tree + JJ = IPERM (I) + PR (JJ) = J + ENDIF + END DO + END DO + +! If CSP = MINONE, no augmenting path is found + 160 IF (CSP.EQ.MINONE) GOTO 190 +! Update bottleneck value + BV = MIN (BV, CSP) + TBV = BV * (1 - RLX) +! Find augmenting path by tracing backward in PR; update IPERM,JPERM + NUM = NUM + 1 + I = ISP + J = JSP + DO JDUM = 1, NUM + 1 + I0 = JPERM (J) + JPERM (J) = I + IPERM (I) = J + J = PR (J) + IF (J.EQ. - 1) EXIT + I = I0 + END DO +! End of dummy loop; this point is never reached + 190 DO 191 KK = UP, M + I = Q (KK) + D (I) = MINONE + L (I) = 0 + 191 END DO + DO 192 KK = LOW, UP - 1 + I = Q (KK) + D (I) = MINONE + 192 END DO + DO 193 KK = 1, QLEN + I = Q (KK) + D (I) = MINONE + L (I) = 0 + 193 END DO + + END DO +! End of main loop + +! BV is now bottleneck value of final matching + +! IPERM is complete if M = N and NUM = N + 1000 IF (M.EQ.N.and.NUM.EQ.N) GOTO 2000 + +! Complete IPERM; L, JPERM are work arrays + CALL MC64_HSL_X (M, N, IPERM, L, JPERM) + + 2000 RETURN +END SUBROUTINE MC64_HSL_B + +!********************************************************************** +!CCCC LAST UPDATE Tue Nov 26 03:20:26 MET 2002 +SUBROUTINE MC64_HSL_S (M, N, NE, IP, IRN, A, IPERM, NUMX, W, LEN,& + LENL, LENH, FC, IW, IW4, RLX, RINF) + IMPLICIT NONE +! +! *** Copyright (c) 2002 I.S. Duff and J. Koster *** +! *** Although every effort has been made to ensure robustness and *** +! *** reliability of the subroutines in this MC64 suite, we *** +! *** disclaim any liability arising through the use or misuse of *** +! *** any of the subroutines. *** +! + INTEGER M, N, NE, NUMX + INTEGER IP (N + 1), IRN (NE), IPERM (M), W (N), LEN (N), LENL (N),& + LENH (N), FC (N), IW (M), IW4 (3 * N + M) + REAL(WP) A (NE), RLX, RINF + +! M, N, NE, IP, IRN, are described in MC64AD. +! A is a REAL array of length NE. +! A(K), K=1..NE, must be set to the value of the entry that +! corresponds to IRN(k). The entries in each column must be +! non-negative and ordered by decreasing value. +! IPERM is an INTEGER array of length M. On exit, it contains the +! bottleneck matching: IPERM(I) - 0 or row I is matched to column +! IPERM(I). +! NUMX is an INTEGER variable. On exit, it contains the cardinality +! of the matching stored in IPERM. + +! FC is an integer array of length N that contains the list of +! unmatched columns. +! LEN(J), LENL(J), LENH(J) are integer arrays of length N that point +! to entries in matrix column J. +! In the matrix defined by the column parts IP(J)+LENL(J) we know +! a matching does not exist; in the matrix defined by the column +! parts IP(J)+LENH(J) we know one exists. +! LEN(J) lies between LENL(J) and LENH(J) and determines the matrix +! that is tested for a maximum matching. +! W is an integer array of length N and contains the indices of the +! columns for which LENL /= LENH. +! WLEN is number of indices stored in array W. +! IW is integer work array of length M. +! IW4 is integer work array of length 3N+M used by MC64U. +! +! RLX is a REAL variable. It is a relaxation +! parameter for finding the optimal matching. +! +! RINF is the largest positive real number + + INTEGER NUM, NVAL, WLEN, II, I, J, K, L, CNT, MOD, IDUM1, IDUM2, & + IDUM3 + REAL(WP) BVAL, BMIN, BMAX +! External subroutines and/or functions + EXTERNAL MC64QD +! Intrinsic functions + +! BMIN and BMAX are such that a maximum matching exists for the input +! matrix in which all entries smaller than BMIN are dropped. +! For BMAX, a maximum matching does not exist. +! BVAL is a value between BMIN and BMAX. +! CNT is the number of calls made to MC64U so far. +! NUM is the cardinality of last matching found. + +! Compute a first maximum matching from scratch on whole matrix. + DO J = 1, N + FC (J) = J + LEN (J) = IP (J + 1) - IP (J) + END DO + DO I = 1, M + IW (I) = 0 + END DO +! The first call to MC64U + CNT = 1 + MOD = 1 + NUMX = 0 + CALL MC64_HSL_U (CNT, MOD, M, N, IRN, NE, IP, LEN, FC, IW, NUMX, & + N, IW4 (1), IW4 (N + 1), IW4 (2 * N + 1), IW4 (2 * N + M + 1) ) + +! IW contains a maximum matching of length NUMX. + NUM = NUMX + + IF (NUM.NE.N) THEN +! Matrix is structurally singular + BMAX = RINF + ELSE +! Matrix is structurally nonsingular, NUM=NUMX=N; +! Set BMAX just above the smallest of all the maximum absolute +! values of the columns + BMAX = RINF + DO J = 1, N + BVAL = 0.0 + DO K = IP (J), IP (J + 1) - 1 + IF (A (K) .GT.BVAL) BVAL = A (K) + END DO + IF (BVAL.LT.BMAX) BMAX = BVAL + END DO +! ... should print warning if BMAX == RINF + BMAX = 1.001 * BMAX + ENDIF + +! Initialize BVAL,BMIN + BVAL = 0.0 + BMIN = 0.0 +! Initialize LENL,LEN,LENH,W,WLEN according to BMAX. +! Set LEN(J), LENH(J) just after last entry in column J. +! Set LENL(J) just after last entry in column J with value >= BMAX. + WLEN = 0 + DO J = 1, N + L = IP (J + 1) - IP (J) + LENH (J) = L + LEN (J) = L + DO K = IP (J), IP (J + 1) - 1 + IF (A (K) .LT.BMAX) GOTO 46 + END DO +! Column J is empty or all entries are >= BMAX + K = IP (J + 1) + 46 LENL (J) = K - IP (J) +! Add J to W if LENL(J) /= LENH(J) + IF (LENL (J) .EQ.L) CYCLE + WLEN = WLEN + 1 + W (WLEN) = J + END DO + +! Main loop + DO IDUM1 = 1, NE + IF (NUM.EQ.NUMX) THEN +! We have a maximum matching in IW; store IW in IPERM + DO I = 1, M + IPERM (I) = IW (I) + END DO +! Keep going round this loop until matching IW is no longer maximum. + DO 80 IDUM2 = 1, NE + BMIN = BVAL + IF (BMAX - BMIN.LE.RLX) GOTO 1000 +! Find splitting value BVAL + CALL MC64QD (IP, LENL, LEN, W, WLEN, A, NVAL, BVAL) + IF (NVAL.LE.1) GOTO 1000 +! Set LEN such that all matrix entries with value < BVAL are +! discarded. Store old LEN in LENH. Do this for all columns W(K). +! Each step, either K is incremented or WLEN is decremented. + K = 1 + DO IDUM3 = 1, N + IF (K.GT.WLEN) EXIT + J = W (K) + DO II = IP (J) + LEN (J) - 1, IP (J) + LENL (J), & + - 1 + IF (A (II) .GE.BVAL) EXIT + I = IRN (II) + IF (IW (I) .NE.J) CYCLE +! Remove entry from matching + IW (I) = 0 + NUM = NUM - 1 + FC (N - NUM) = J + END DO + LENH (J) = LEN (J) +! IP(J)+LEN(J)-1 is last entry in column >= BVAL + LEN (J) = II - IP (J) + 1 +! If LENH(J) = LENL(J), remove J from W + IF (LENL (J) .EQ.LENH (J) ) THEN + W (K) = W (WLEN) + WLEN = WLEN - 1 + ELSE + K = K + 1 + ENDIF + END DO + IF (NUM.LT.NUMX) EXIT + 80 END DO +! End of dummy loop; this point is never reached +! Set mode for next call to MC64U + MOD = 1 + ELSE +! We do not have a maximum matching in IW. + BMAX = BVAL +! BMIN is the bottleneck value of a maximum matching; +! for BMAX the matching is not maximum, so BMAX>BMIN +! and following condition is always false if RLX = 0.0 + IF (BMAX - BMIN.LE.RLX) GOTO 1000 +! Find splitting value BVAL + CALL MC64QD (IP, LEN, LENH, W, WLEN, A, NVAL, BVAL) + IF (NVAL.EQ.0.OR.BVAL.EQ.BMIN) GOTO 1000 +! Set LEN such that all matrix entries with value >= BVAL are +! inside matrix. Store old LEN in LENL. Do this for all columns W(K). +! Each step, either K is incremented or WLEN is decremented. + K = 1 + DO 87 IDUM3 = 1, N + IF (K.GT.WLEN) GOTO 88 + J = W (K) + DO 85 II = IP (J) + LEN (J), IP (J) + LENH (J) - 1 + IF (A (II) .LT.BVAL) GOTO 86 + 85 END DO + 86 LENL (J) = LEN (J) + LEN (J) = II - IP (J) + IF (LENL (J) .EQ.LENH (J) ) THEN + W (K) = W (WLEN) + WLEN = WLEN - 1 + ELSE + K = K + 1 + ENDIF + 87 END DO +! End of dummy loop; this point is never reached +! Set mode for next call to MC64U + 88 MOD = 0 + ENDIF + CNT = CNT + 1 + CALL MC64_HSL_U (CNT, MOD, M, N, IRN, NE, IP, LEN, FC, IW, & + NUM, NUMX, IW4 (1), IW4 (N + 1), IW4 (2 * N + 1), IW4 (2 * N + & + M + 1) ) + +! IW contains maximum matching of length NUM + END DO +! End of dummy loop; this point is never reached + +! BMIN is now bottleneck value of final matching + +! IPERM is complete if M = N and NUMX = N + 1000 IF (M.EQ.N.and.NUMX.EQ.N) GOTO 2000 + +! Complete IPERM; IW, W are work arrays + CALL MC64_HSL_X (M, N, IPERM, IW, W) + + 2000 RETURN +END SUBROUTINE MC64_HSL_S + +!********************************************************************** +!CCCC LAST UPDATE Tue Nov 26 03:20:26 MET 2002 +SUBROUTINE MC64_HSL_U (ID, MOD, M, N, IRN, LIRN, IP, LENC, FC, & + IPERM, NUM, NUMX, PR, ARP, CV, OUT) + IMPLICIT NONE +! +! *** Copyright (c) 2002 I.S. Duff and J. Koster *** +! *** Although every effort has been made to ensure robustness and *** +! *** reliability of the subroutines in this MC64 suite, we *** +! *** disclaim any liability arising through the use or misuse of *** +! *** any of the subroutines. *** +! + INTEGER ID, MOD, M, N, LIRN, NUM, NUMX + INTEGER ARP (N), CV (M), IRN (LIRN), IP (N), FC (N), IPERM (M), & + LENC (N), OUT (N), PR (N) + +! PR(J) is the previous column to J in the depth first search. +! Array PR is used as workspace in the sorting algorithm. +! Elements (I,IPERM(I)) I=1,..,M are entries at the end of the +! algorithm unless N assignments have not been made in which case +! N-NUM pairs (I,IPERM(I)) will not be entries in the matrix. +! CV(I) is the most recent loop number (ID+JORD) at which row I +! was visited. +! ARP(J) is the number of entries in column J which have been scanned +! when looking for a cheap assignment. +! OUT(J) is one less than the number of entries in column J which have +! not been scanned during one pass through the main loop. +! NUMX is maximum possible size of matching. + + INTEGER I, II, IN1, IN2, J, J1, JORD, K, KK, LAST, NFC, NUM0, & + NUM1, NUM2, ID0, ID1 + +! Initialize variables to eliminate copmiler warnings + I = -1; II = -1 + + IF (ID.EQ.1) THEN +! The first call to MC64U. +! Initialize CV and ARP; parameters MOD, NUMX are not accessed + DO I = 1, M + CV (I) = 0 + END DO + DO J = 1, N + ARP (J) = 0 + END DO + NUM1 = N + NUM2 = N + ELSE +! Not the first call to MC64U. +! Re-initialize ARP if entries were deleted since last call to MC64U + IF (MOD.EQ.1) THEN + DO J = 1, N + ARP (J) = 0 + END DO + ENDIF + NUM1 = NUMX + NUM2 = N - NUMX + ENDIF + NUM0 = NUM + +! NUM0 is size of input matching +! NUM1 is maximum possible size of matching +! NUM2 is maximum allowed number of unassigned rows/columns +! NUM is size of current matching + +! Quick return if possible +! IF (NUM.EQ.N) GO TO 199 +! NFC is number of rows/columns that could not be assigned + NFC = 0 +! Integers ID0+1 to ID0+N are unique numbers for call ID to MC64U, +! so 1st call uses 1..N, 2nd call uses N+1..2N, etc + ID0 = (ID-1) * N + +! Main loop. Each pass round this loop either results in a new +! assignment or gives a column with no assignment + + OUTER: DO JORD = NUM0 + 1, N + +! Each pass uses unique number ID1 + ID1 = ID0 + JORD +! J is unmatched column + J = FC (JORD-NUM0) + PR (J) = - 1 + SCAN: DO K = 1, JORD +! Look for a cheap assignment + IF (ARP (J) .GE.LENC (J) ) GOTO 30 + IN1 = IP (J) + ARP (J) + IN2 = IP (J) + LENC (J) - 1 + DO II = IN1, IN2 + I = IRN (II) + IF (IPERM (I) .EQ.0) GOTO 80 + END DO +! No cheap assignment in row + ARP (J) = LENC (J) +! Begin looking for assignment chain starting with row J + 30 OUT (J) = LENC (J) - 1 +! Inner loop. Extends chain by one or backtracks + DO KK = 1, JORD + IN1 = OUT (J) + IF (IN1.LT.0) GOTO 50 + IN2 = IP (J) + LENC (J) - 1 + IN1 = IN2 - IN1 +! Forward scan + DO II = IN1, IN2 + I = IRN (II) + IF (CV (I) .EQ.ID1) CYCLE +! Column J has not yet been accessed during this pass + J1 = J + J = IPERM (I) + CV (I) = ID1 + PR (J) = J1 + OUT (J1) = IN2 - II - 1 + CYCLE SCAN + END DO +! Backtracking step. + 50 J1 = PR (J) + IF (J1.EQ. - 1) THEN +! No augmenting path exists for column J. + NFC = NFC + 1 + FC (NFC) = J + IF (NFC.GT.NUM2) THEN +! A matching of maximum size NUM1 is not possible + LAST = JORD + GOTO 101 + ENDIF + CYCLE OUTER + ENDIF + J = J1 + END DO +! End of dummy loop; this point is never reached + END DO SCAN +! End of dummy loop; this point is never reached + +! New assignment is made. + 80 IPERM (I) = J + ARP (J) = II - IP (J) + 1 + NUM = NUM + 1 + DO 90 K = 1, JORD + J = PR (J) + IF (J.EQ. - 1) GOTO 95 + II = IP (J) + LENC (J) - OUT (J) - 2 + I = IRN (II) + IPERM (I) = J + 90 END DO +! End of dummy loop; this point is never reached + + 95 IF (NUM.EQ.NUM1) THEN +! A matching of maximum size NUM1 is found + LAST = JORD + GOTO 101 + ENDIF +! + END DO OUTER + +! All unassigned columns have been considered + LAST = N + +! Now, a transversal is computed or is not possible. +! Complete FC before returning. + 101 DO 110 JORD = LAST + 1, N + NFC = NFC + 1 + FC (NFC) = FC (JORD-NUM0) + 110 END DO + +! 199 RETURN + RETURN +END SUBROUTINE MC64_HSL_U + +!********************************************************************** +!CCCC LAST UPDATE Tue Nov 26 03:20:26 MET 2002 +SUBROUTINE MC64_HSL_W (M, N, NE, IP, IRN, A, IPERM, NUM, JPERM, & + OUT, PR, Q, L, U, D, RINF) + IMPLICIT NONE +! +! *** Copyright (c) 2002 I.S. Duff and J. Koster *** +! *** Although every effort has been made to ensure robustness and *** +! *** reliability of the subroutines in this MC64 suite, we *** +! *** disclaim any liability arising through the use or misuse of *** +! *** any of the subroutines. *** +! + INTEGER M, N, NE, NUM + INTEGER IP (N + 1), IRN (NE), IPERM (M), JPERM (N), OUT (N), & + PR (N), Q (M), L (M) + REAL(WP) A (NE), U (M), D (M), RINF + +! M, N, NE, IP, IRN are described in MC64AD. +! A is a REAL array of length NE. +! A(K), K=1..NE, must be set to the value of the entry that +! corresponds to IRN(K). It is not altered. +! All values A(K) must be non-negative. +! IPERM is an INTEGER array of length M. On exit, it contains the +! weighted matching: IPERM(I) = 0 or row I is matched to column +! IPERM(I). +! NUM is an INTEGER variable. On exit, it contains the cardinality of +! the matching stored in IPERM. +! D is a REAL array of length M. +! On exit, V = D(1:N) contains the dual column variable. +! If U(1:M) denotes the dual row variable and if the matrix +! is structurally nonsingular (NUM = N), the following holds: +! U(I)+V(J) <= A(I,J) if IPERM(I) /= J +! U(I)+V(J) = A(I,J) if IPERM(I) = J +! U(I) = 0 if IPERM(I) = 0 +! V(J) = 0 if there is no I for which IPERM(I) = J +! On entry, U(1) contains the relaxation parameter RLX. +! RINF is the largest positive real number + +! Local variables + INTEGER I, I0, II, J, JJ, JORD, Q0, QLEN, JDUM, ISP, JSP, K, K0, & + K1, K2, KK, KK1, KK2, UP, LOW, LPOS + REAL(WP) CSP, DI, DMIN, DNEW, DQ0, VJ +! Local parameters + REAL(WP),PARAMETER :: ZERO=0.0_WP +! External subroutines and/or functions + EXTERNAL MC64DD, MC64ED, MC64FD + +! Initialize variables to eliminate copmiler warnings + ISP = -HUGE(ISP); JSP = -HUGE(JSP) + +! Set RINF to largest positive real number + RINF = HUGE(RINF) + +! Initialization + NUM = 0 + DO K = 1, N + D (K) = ZERO + JPERM (K) = 0 + PR (K) = IP (K) + END DO + DO K = 1, M + U (K) = RINF + IPERM (K) = 0 + L (K) = 0 + END DO +! Initialize U(I) + DO J = 1, N + DO K = IP (J), IP (J + 1) - 1 + I = IRN (K) + IF (A (K) .GT.U (I) ) CYCLE + U (I) = A (K) + IPERM (I) = J + L (I) = K + END DO + END DO + DO I = 1, M + J = IPERM (I) + IF (J.EQ.0) CYCLE +! Row I is not empty + IPERM (I) = 0 + IF (JPERM (J) .NE.0) CYCLE +! Don't choose cheap assignment from dense columns + IF (IP (J + 1) - IP (J) .GT.N / 10.AND.N.GT.50) CYCLE +! Assignment of column J to row I + NUM = NUM + 1 + IPERM (I) = J + JPERM (J) = L (I) + END DO + +! write(14,*) 'Number of cheap assignments ',NUM + + IF (NUM.EQ.N) GOTO 1000 +! Scan unassigned columns; improve assignment + DO J = 1, N +! JPERM(J) ne 0 iff column J is already assigned + IF (JPERM (J) .NE.0) CYCLE + K1 = IP (J) + K2 = IP (J + 1) - 1 +! Continue only if column J is not empty + IF (K1.GT.K2) CYCLE +! VJ = RINF +! Changes made to allow for NaNs + I0 = IRN (K1) + VJ = A (K1) - U (I0) + K0 = K1 + DO K = K1 + 1, K2 + I = IRN (K) + DI = A (K) - U (I) + IF (DI.GT.VJ) CYCLE + IF (.NOT.(DI.LT.VJ.OR.DI.EQ.RINF)) THEN + IF (IPERM (I) .NE.0.OR.IPERM (I0) .EQ.0) CYCLE + ENDIF + VJ = DI + I0 = I + K0 = K + END DO + D (J) = VJ + K = K0 + I = I0 + IF (IPERM (I) .EQ.0) GOTO 90 + DO K = K0, K2 + I = IRN (K) + IF (A (K) - U (I) .GT.VJ) CYCLE + JJ = IPERM (I) +! Scan remaining part of assigned column JJ + KK1 = PR (JJ) + KK2 = IP (JJ + 1) - 1 + IF (KK1.GT.KK2) CYCLE + DO KK = KK1, KK2 + II = IRN (KK) + IF (IPERM (II) .GT.0) CYCLE + IF (A (KK) - U (II) .LE.D (JJ) ) GOTO 80 + END DO + PR (JJ) = KK2 + 1 + END DO + CYCLE + 80 JPERM (JJ) = KK + IPERM (II) = JJ + PR (JJ) = KK + 1 + 90 NUM = NUM + 1 + JPERM (J) = K + IPERM (I) = J + PR (J) = K + 1 + END DO + +! write(14,*) 'Number of improved assignments ',NUM + + IF (NUM.EQ.N) GOTO 1000 + +! Prepare for main loop + DO I = 1, M + D (I) = RINF + L (I) = 0 + END DO + +! Main loop ... each pass round this loop is similar to Dijkstra's +! algorithm for solving the single source shortest path problem + + DO JORD = 1, N + + IF (JPERM (JORD) .NE.0) CYCLE +! JORD is next unmatched column +! DMIN is the length of shortest path in the tree + DMIN = RINF + QLEN = 0 + LOW = N + 1 + UP = N + 1 +! CSP is the cost of the shortest augmenting path to unassigned row +! IRN(ISP). The corresponding column index is JSP. + CSP = RINF +! Build shortest path tree starting from unassigned column (root) JORD + J = JORD + PR (J) = - 1 + +! Scan column J + DO K = IP (J), IP (J + 1) - 1 +! IF (N.EQ.3) THEN +! write(14,*) 'Scanning column ',J +! write(14,*) 'IP ',IP(1:4) +! write(14,*) 'IRN ',IRN(1:6) +! write(14,*) 'A ',A(1:6) +! write(14,*) 'U ',U(1:3) +! write(14,*) 'IPERM ',IPERM(1:3) +! ENDIF + I = IRN (K) + DNEW = A (K) - U (I) + IF (DNEW.GE.CSP) CYCLE + IF (IPERM (I) .EQ.0) THEN + CSP = DNEW + ISP = K + JSP = J + ELSE + IF (DNEW.LT.DMIN) DMIN = DNEW + D (I) = DNEW + QLEN = QLEN + 1 + Q (QLEN) = K + ENDIF + END DO +! Initialize heap Q and Q2 with rows held in Q(1:QLEN) + Q0 = QLEN + QLEN = 0 + DO KK = 1, Q0 + K = Q (KK) + I = IRN (K) + IF (CSP.LE.D (I) ) THEN + D (I) = RINF + CYCLE + ENDIF + IF (D (I) .LE.DMIN) THEN + LOW = LOW - 1 + Q (LOW) = I + L (I) = LOW + ELSE + QLEN = QLEN + 1 + L (I) = QLEN + CALL MC64DD (I, M, Q, D, L, 2) + ENDIF +! Update tree + JJ = IPERM (I) + OUT (JJ) = K + PR (JJ) = J + END DO + + DO JDUM = 1, NUM + +! If Q2 is empty, extract rows from Q + IF (LOW.EQ.UP) THEN + IF (QLEN.EQ.0) GOTO 160 + I = Q (1) + IF (D (I) .GE.CSP) GOTO 160 + DMIN = D (I) + 152 CALL MC64ED (QLEN, M, Q, D, L, 2) + LOW = LOW - 1 + Q (LOW) = I + L (I) = LOW + IF (QLEN.EQ.0) GOTO 153 + I = Q (1) + IF (D (I) .GT.DMIN) GOTO 153 + GOTO 152 + ENDIF +! Q0 is row whose distance D(Q0) to the root is smallest + 153 Q0 = Q (UP - 1) + DQ0 = D (Q0) +! Exit loop if path to Q0 is longer than the shortest augmenting path + IF (DQ0.GE.CSP) GOTO 160 + UP = UP - 1 + +! Scan column that matches with row Q0 + J = IPERM (Q0) + VJ = DQ0 - A (JPERM (J) ) + U (Q0) + DO K = IP (J), IP (J + 1) - 1 + I = IRN (K) + IF (L (I) .GE.UP) CYCLE +! DNEW is new cost + DNEW = VJ + A (K) - U (I) +! Do not update D(I) if DNEW ge cost of shortest path + IF (DNEW.GE.CSP) CYCLE + IF (IPERM (I) .EQ.0) THEN +! Row I is unmatched; update shortest path info + CSP = DNEW + ISP = K + JSP = J + ELSE +! Row I is matched; do not update D(I) if DNEW is larger + DI = D (I) + IF (DI.LE.DNEW) CYCLE + IF (L (I) .GE.LOW) CYCLE + D (I) = DNEW + IF (DNEW.LE.DMIN) THEN + LPOS = L (I) + IF (LPOS.NE.0) CALL MC64FD (LPOS, QLEN, M, Q, D, L,& + 2) + LOW = LOW - 1 + Q (LOW) = I + L (I) = LOW + ELSE + IF (L (I) .EQ.0) THEN + QLEN = QLEN + 1 + L (I) = QLEN + ENDIF + CALL MC64DD (I, M, Q, D, L, 2) + ENDIF +! Update tree + JJ = IPERM (I) + OUT (JJ) = K + PR (JJ) = J + ENDIF + END DO + END DO + +! If CSP = RINF, no augmenting path is found + 160 IF (CSP.EQ.RINF) GOTO 190 +! Find augmenting path by tracing backward in PR; update IPERM,JPERM + NUM = NUM + 1 + +! write(14,*) 'NUM = ',NUM +! write(14,*) 'Augmenting path found from unmatched col ',JORD + + I = IRN (ISP) + IPERM (I) = JSP + JPERM (JSP) = ISP + J = JSP + DO 170 JDUM = 1, NUM + JJ = PR (J) + IF (JJ.EQ. - 1) GOTO 180 + K = OUT (J) + I = IRN (K) + IPERM (I) = JJ + JPERM (JJ) = K + J = JJ + 170 END DO +! End of dummy loop; this point is never reached + +! Update U for rows in Q(UP:N) + 180 DO 185 KK = UP, N + I = Q (KK) + U (I) = U (I) + D (I) - CSP + 185 END DO + 190 DO 191 KK = LOW, N + I = Q (KK) + D (I) = RINF + L (I) = 0 + 191 END DO + DO 193 KK = 1, QLEN + I = Q (KK) + D (I) = RINF + L (I) = 0 + 193 END DO + + END DO +! End of main loop + + +! Set dual column variable in D(1:N) + 1000 DO 200 J = 1, N + K = JPERM (J) + IF (K.NE.0) THEN + D (J) = A (K) - U (IRN (K) ) + ELSE + D (J) = ZERO + ENDIF + 200 END DO + DO 1201 I = 1, M + IF (IPERM (I) .EQ.0) U (I) = ZERO + 1201 END DO + + IF (NUM.EQ.N.AND.M.EQ.N) GOTO 1100 +! Complete IPERM; L, JPERM are work arrays + CALL MC64_HSL_X (M, N, IPERM, L, JPERM) + +! The matrix is structurally singular, complete IPERM. +! JPERM, OUT are work arrays +! DO 300 J = 1,N +! JPERM(J) = 0 +! 300 CONTINUE +! K = 0 +! DO 310 I = 1,N +! IF (IPERM(I).EQ.0) THEN +! K = K + 1 +! OUT(K) = I +! ELSE +! J = IPERM(I) +! JPERM(J) = I +! ENDIF +! 310 CONTINUE +! K = 0 +! DO 320 J = 1,N +! IF (JPERM(J).NE.0) GO TO 320 +! K = K + 1 +! JDUM = OUT(K) +! IPERM(JDUM) = - J +! 320 CONTINUE + 1100 RETURN +END SUBROUTINE MC64_HSL_W + + +!********************************************************************** +!CCCC LAST UPDATE Tue Nov 26 03:20:26 MET 2002 +SUBROUTINE MC64_HSL_Z (M, N, IRN, LIRN, IP, LENC, IPERM, NUM, PR,& + ARP, CV, OUT) + IMPLICIT NONE +! +! *** Copyright (c) 2002 I.S. Duff and J. Koster *** +! *** Although every effort has been made to ensure robustness and *** +! *** reliability of the subroutines in this MC64 suite, we *** +! *** disclaim any liability arising through the use or misuse of *** +! *** any of the subroutines. *** +! +! PR(I) is the previous row to I in the depth first search. +! It is used as a work array in the sorting algorithm. +! Elements (IPERM(I),I) I=1,...M are non-zero at the end of the +! algorithm unless N assignments have not been made. In which case +! (IPERM(I),I) will be zero for N-NUM entries. +! CV(I) is the most recent row extension at which column I was visited. +! ARP(I) is one less than the number of non-zeros in row I +! which have not been scanned when looking for a cheap assignment. +! OUT(I) is one less than the number of non-zeros in row I +! which have not been scanned during one pass through the main loop. +! + INTEGER LIRN, M, N, NUM + INTEGER ARP (N), CV (M), IRN (LIRN), IP (N), IPERM (M), LENC (N), & + OUT (N), PR (N) + + INTEGER I, II, IN1, IN2, J, J1, JORD, K, KK + +! Initialize variables to eliminate copmiler warnings + II = -HUGE(II); IN2 = -HUGE(IN2) + + DO I = 1, M + CV (I) = 0 + IPERM (I) = 0 + END DO + DO J = 1, N + ARP (J) = LENC (J) - 1 + END DO + NUM = 0 +! +! Main loop. Each pass round this loop either results in a new +! assignment or gives a row with no assignment. +! + OUTER: DO JORD = 1, N +! + J = JORD + PR (J) = - 1 + SCAN: DO K = 1, JORD +! Look for a cheap assignment + IN1 = ARP (J) + IF (IN1.GE.0) THEN + IN2 = IP (J) + LENC (J) - 1 + IN1 = IN2 - IN1 + DO II = IN1, IN2 + I = IRN (II) + IF (IPERM (I) .EQ.0) EXIT scan + END DO +! No cheap assignment in row. + ARP (J) = - 1 + END IF +! Begin looking for assignment chain starting with row J. + OUT (J) = LENC (J) - 1 +! Inner loop. Extends chain by one or backtracks. + DO KK = 1, JORD + IN1 = OUT (J) + IF (IN1.GE.0) THEN + IN2 = IP (J) + LENC (J) - 1 + IN1 = IN2 - IN1 +! Forward scan. + DO II = IN1, IN2 + I = IRN (II) + IF (CV (I) .EQ.JORD) CYCLE +! Column I has not yet been accessed during this pass. + J1 = J + J = IPERM (I) + CV (I) = JORD + PR (J) = J1 + OUT (J1) = IN2 - II - 1 + CYCLE SCAN + END DO + ENDIF +! Backtracking step. + J = PR (J) + IF (J.EQ. - 1) CYCLE OUTER + END DO + END DO SCAN +! +! New assignment is made. + IPERM (I) = J + ARP (J) = IN2 - II - 1 + NUM = NUM + 1 + DO K = 1, JORD + J = PR (J) + IF (J.EQ. - 1) EXIT + II = IP (J) + LENC (J) - OUT (J) - 2 + I = IRN (II) + IPERM (I) = J + END DO +! + END DO OUTER + + +! IPERM is complete if M = N and NUM = N + IF (M.EQ.N.and.NUM.EQ.N) RETURN + +! Complete IPERM; CV, ARP are work arrays + CALL MC64_HSL_X (M, N, IPERM, CV, ARP) + +END SUBROUTINE MC64_HSL_Z + +!********************************************************************** +!CCCC LAST UPDATE Tue Nov 26 03:20:26 MET 2002 +SUBROUTINE MC64_HSL_X (M, N, IPERM, RW, CW) + IMPLICIT NONE +! +! *** Copyright (c) 2002 I.S. Duff and J. Koster *** +! *** Although every effort has been made to ensure robustness and *** +! *** reliability of the subroutines in this MC64 suite, we *** +! *** disclaim any liability arising through the use or misuse of *** +! *** any of the subroutines. *** +! +! Complete the (incomplete) row permutation in IPERM. +! + INTEGER M, N + INTEGER RW (M), CW (N), IPERM (M) + + INTEGER I, J, K + +! If M=N, the matrix is structurally singular, complete IPERM +! If M>N, the matrix is rectangular, complete IPERM + +! RW, CW are work arrays; +! Store indices of unmatched rows in RW +! Mark matched columns in CW + + DO J = 1, N + CW (J) = 0 + END DO + K = 0 + DO I = 1, M + IF (IPERM (I) .EQ.0) THEN + K = K + 1 + RW (K) = I + ELSE + J = IPERM (I) + CW (J) = I + ENDIF + END DO + K = 0 + DO J = 1, N + IF (CW (J) .NE.0) CYCLE + K = K + 1 + I = RW (K) + IPERM (I) = - J + END DO + DO J = N + 1, M + K = K + 1 + I = RW (K) + IPERM (I) = - J + END DO +END SUBROUTINE MC64_HSL_X + +end module hsl_mc64_double +! COPYRIGHT (c) 2007 Science & Technology Facilities Council +! +! Version: 3.3.0 +! For version history see ChangeLog +! +MODULE hsl_mc68_integer + USE hsl_zb01_integer + IMPLICIT NONE + PRIVATE + +! --------------------------------------------------- +! Precision +! --------------------------------------------------- + INTEGER, PARAMETER :: myreal_mc68 = kind(1.0D0) + INTEGER, PARAMETER :: myint = kind(1) + INTEGER, PARAMETER :: long = selected_int_kind(18) + +! --------------------------------------------------- +! Error flags +! --------------------------------------------------- + INTEGER (myint), PARAMETER :: & + mc68_err_memory_alloc = -1, & ! memory alloc error + mc68_err_memory_dealloc = -2, & ! memory dealloc error + mc68_err_n = -3, & ! n<1 + mc68_err_ord = -4, & ! ord not associated with an ordering + mc68_err_metis = -5, & ! MeTiS ordering requested but not linked + mc68_err_zb01 = -6 ! None (de)allocation error from call to zb01_expand1 + +! --------------------------------------------------- +! Warning flags +! --------------------------------------------------- + INTEGER (myint), PARAMETER :: mc68_warn_diag = 1, & ! No diags and ord=4 + mc68_warn_rank = 2, & ! Matrix rank deficient when using ord=4 + mc68_warn_rank_diag = 3 ! Matrix rank deficient, no diags and ord=4 + +! --------------------------------------------------- +! Derived type definitions +! --------------------------------------------------- + TYPE, PUBLIC :: mc68_control + INTEGER :: lp = 6 ! stream number for error messages + INTEGER :: wp = 6 ! stream number for warning messages + INTEGER :: mp = 6 ! stream number for diagnostic messages + INTEGER :: nemin = 1 ! stream number for diagnostic messages + INTEGER :: print_level = 0 ! amount of informational output required + INTEGER :: row_full_thresh = 100 ! percentage threshold for full row + INTEGER :: row_search = 10 ! Num of rows searched for pivot with ord=6 + END TYPE mc68_control + + TYPE, PUBLIC :: mc68_info + INTEGER :: flag = 0 ! error/warning flag + INTEGER :: iostat = 0 ! holds Fortran iostat parameter + INTEGER :: stat = 0 ! holds Fortran stat parameter + INTEGER :: out_range = 0 ! holds number of out of range entries ignored + INTEGER :: duplicate = 0 ! holds number of duplicate entries + INTEGER :: n_compressions = 0 ! holds number of compressions in order + INTEGER :: n_zero_eigs = -1 ! holds the number of zero eigs from ma47 + INTEGER(long) :: l_workspace = 0 ! holds length of workspace iw used in + ! order + INTEGER :: zb01_info = 0 ! holds flag from zb01_expand1 call + INTEGER :: n_dense_rows = 0 ! holds number of dense rows from amdd + END TYPE mc68_info + + INTERFACE mc68_order + MODULE PROCEDURE mc68_order_integer + END INTERFACE + + PUBLIC mc68_order + +CONTAINS + +! --------------------------------------------------------------- + +! subroutine mc68_order_integer(ord,A,perm,control,info) constructs +! an elimination order PERM for a symmetric matrix A using a chosen +! ordering ORD +SUBROUTINE mc68_order_integer(ord,n,ptr,row,perm,control,info, min_l_workspace) + INTEGER, INTENT (IN) :: ord ! Specifies which ordering is to be used. + ! The choice is as follows: + ! ord = 1 : Approximate minimum degree with provision for dense rows + ! 2 : Minimum degree + ! 3 : MeTiS + ! 4 : MA47 ordering for indefinite matrices + INTEGER, INTENT (IN) :: n ! Must hold the number of rows in A + INTEGER, INTENT (IN) :: ptr(n+1) ! ptr(j) holds position in row of start of + ! row indices for column j. ptr(n)+1 must equal the number of entries + ! stored + 1. Only the lower triangular entries are stored with no + ! duplicates or out-of-range entries + INTEGER, INTENT (IN) :: row(:) ! size at least ptr(n+1)-1 + INTEGER (myint), INTENT (OUT) :: perm(n) ! Holds elimination order on output + TYPE (mc68_control), INTENT (IN) :: control + TYPE (mc68_info), INTENT (OUT) :: info ! information type: + ! info%flag values: + ! = 0 if successful + ! = MC68_ERR_MEMORY_ALLOC if memory allocation failed + ! = MC68_ERR_MEMORY_DEALLOC if memory deallocation failed + ! = MC68_ERR_N if n<1 + ! = MC68_ERR_METIS if MeTiS ordering is requested but not linked + INTEGER, INTENT (IN), OPTIONAL :: min_l_workspace ! If present, specifies + ! the minimum amount of workspace to be use + + ! --------------------------------------------- + ! Local variables + ! --------------------------------------------- + INTEGER, ALLOCATABLE :: ipe(:) ! copy of pointers which is later modified + INTEGER, ALLOCATABLE :: iw(:) ! copy of row indices + INTEGER, ALLOCATABLE :: work1(:) ! work array + INTEGER, ALLOCATABLE :: work2(:) ! work array + INTEGER, ALLOCATABLE :: work3(:) ! work array + INTEGER, ALLOCATABLE :: work4(:) ! work array + INTEGER, ALLOCATABLE :: work6(:) ! work array + INTEGER, ALLOCATABLE :: work7(:) ! work array + INTEGER, ALLOCATABLE :: work8(:) ! work array + INTEGER, ALLOCATABLE :: work9(:) ! work array + INTEGER :: lp ! stream number for error messages + INTEGER :: wp ! stream number for warning messages + INTEGER :: mp ! stream number for diagnostic messages + INTEGER (long) :: iwlen ! length of iw + INTEGER :: i, k1, iwfr, j, diag + REAL (myreal_mc68) :: thresh + LOGICAL :: printe ! errors to be printed? + LOGICAL :: printw ! warnings to be printed? + LOGICAL :: printi ! basic diagnostic to be printed? + LOGICAL :: printd ! additional diagnostic to be printed? + + ! --------------------------------------------- + ! Set stream numbers + ! --------------------------------------------- + lp = control%lp + wp = control%wp + mp = control%mp + + ! --------------------------------------------- + ! Printing levels + ! --------------------------------------------- + printe = (control%print_level>=0 .AND. lp>=0) + printw = (control%print_level>=0 .AND. wp>=0) + printi = (control%print_level>=1 .AND. mp>=0) + printd = (control%print_level>=2 .AND. mp>=0) + IF (printi) THEN + WRITE (mp,'(a)') ' ' + WRITE (mp,'(a)') 'MC68_order:' + END IF + + ! Initialise info + info%flag = 0 + info%stat = 0 + + ! --------------------------------------------- + ! Check that restrictions are adhered to + ! --------------------------------------------- + IF (n<1) THEN + info%flag = mc68_err_n + IF (printe) & + CALL mc68_print_message(info%flag,lp,context='mc68_order') + RETURN + END IF + + SELECT CASE (ord) + CASE (1) + IF (printi) WRITE (mp,'(a60)') 'Approximate minimum degree ordering' + CASE (2) + IF (printi) & + WRITE (mp,'(a60)') 'Minimum degree ordering using methodology of MA27' + CASE (3) + IF (printi) WRITE (mp,'(a60)') 'Nested bisection ordering using MeTiS' + CASE (4) + IF (printi) & + WRITE (mp,'(a60)') & + 'Ordering for indefinite matrices using methodology of MA47' + CASE DEFAULT + info%flag = mc68_err_ord + IF (printe) & + CALL mc68_print_message(info%flag,lp,context='mc68_order') + RETURN + END SELECT + + IF (printi) WRITE (mp,'(a,i15)') 'n = ', n + + IF (n==1) THEN + ! --------------------------------------------- + ! Matrix is of order 1 so no need to call ordering subroutines + ! --------------------------------------------- + perm(1) = 1 + IF (printi) THEN + WRITE (mp,'(a)') ' ' + WRITE (mp,'(a)') 'Matrix of order 1' + END IF + GO TO 20 + END IF + + IF (ord==3) THEN + IF (.not.check_for_metis()) THEN + info%flag = mc68_err_metis + IF (printe) & + CALL mc68_print_message(info%flag,lp,context='mc68_order') + RETURN + END IF + END IF + + SELECT CASE (ord) + CASE (1) + ! ---------------------------------- + ! Approximate minimum degree ordering with provision for + ! dense rows + ! ---------------------------------- + iwlen = 2*ptr(n+1) + n + IF (present(min_l_workspace)) iwlen = max(iwlen,min_l_workspace+0_long) + info%l_workspace = iwlen + + ALLOCATE (work1(n),work8(10),ipe(n+1),iw(iwlen),STAT=info%stat) + IF (info%stat/=0) THEN + info%flag = mc68_err_memory_alloc + IF (printe) & + CALL mc68_print_message(info%flag,lp,context='mc68_order') + RETURN + END IF + + call half_to_full(n, ptr, row, ipe, iw) + iwfr = ipe(n+1) ! Index of next entry to be filled in iw + + ! Form ordering + work1(1:n) = ipe(2:n+1) - ipe(1:n) + work8(1) = 6 + work8(2) = 6 + work8(3) = -1 + work8(4) = 1 ! enable dense row detection + work8(5) = huge(0) + work8(6:10) = 0 + CALL amdd(n,iwlen,ipe,iwfr,work1,iw,perm,work8,info) + + ! Deallocate arrays + DEALLOCATE (ipe,iw,work1,work8,STAT=info%stat) + IF (info%stat/=0) THEN + info%flag = mc68_err_memory_dealloc + IF (printe) & + CALL mc68_print_message(info%flag,lp,context='mc68_order') + RETURN + END IF + + CASE (2) + ! ---------------------------------- + ! Minimum degree ordering using methodology of MA27 + ! ---------------------------------- + + ! Set length of iw + iwlen = 2*ptr(n+1) - 1 + n + IF (present(min_l_workspace)) iwlen = max(iwlen,min_l_workspace+0_long) + + ! Allocate required arrays + ALLOCATE (work2(n),ipe(n+1),iw(iwlen),STAT=info%stat) + IF (info%stat/=0) THEN + info%flag = mc68_err_memory_alloc + IF (printe) & + CALL mc68_print_message(info%flag,lp,context='mc68_order') + RETURN + END IF + + ! IPE and IW hold matrix in VARIANT of CSC format + ! iw(ipe(i)) must be length of column i. + call half_to_full_variant(n, ptr, row, ipe, iw, .true.) + ! Additionally: + ! ipe(i) must be 0 if col i has no off-diagonal non-zeros. + DO j = 1, n + IF (iw(ipe(j))==0) ipe(j) = 0 + END DO + + thresh = float(control%row_full_thresh)/100.0 + iwfr = ipe(n+1) + + CALL mc68_min_deg_anal(n,ipe,iw,iwlen,iwfr,work2,huge(0), & + info%n_compressions,thresh,info) + + ! set ipe correctly + DO i = 1, n + IF (work2(i).ne.0) CYCLE + k1 = i + DO WHILE(work2(k1).eq.0) + k1 = -ipe(k1) + END DO + ipe(i) = -k1 + END DO + info%n_zero_eigs = -1 + + CALL mc68_min_deg_tree_search(n,ipe,work2,perm,control%nemin,info) + + IF (info%flag<0 .AND. printe) THEN + CALL mc68_print_message(info%flag,lp,context='mc68_order') + RETURN + END IF + + ! Deallocate required arrays + DEALLOCATE (work2,ipe,iw,STAT=info%stat) + IF (info%stat/=0) THEN + info%flag = mc68_err_memory_dealloc + IF (printe) & + CALL mc68_print_message(info%flag,lp,context='mc68_order') + RETURN + END IF + + CASE (3) + ! ---------------------------------- + ! MeTiS ordering + ! ---------------------------------- + + ! Set length of iw + iwlen = 2*ptr(n+1) - 2 + IF (present(min_l_workspace)) iwlen = max(iwlen,min_l_workspace+0_long) + info%l_workspace = iwlen + + ! Allocate arrays + ALLOCATE (work1(8),ipe(n+1),iw(iwlen),work3(n),STAT=info%stat) + IF (info%stat/=0) THEN + info%flag = mc68_err_memory_alloc + IF (printe) & + CALL mc68_print_message(info%flag,lp,context='mc68_order') + RETURN + END IF + + ! Fill iw and ipe removing any diagonal entries + call half_to_full(n, ptr, row, ipe, iw) + + ! Carry out ordering + work1(1) = 0 ! MeTiS defaults + CALL metis_nodend(n,ipe,iw,1,work1,work3,perm) + + ! Compression information not returned from meTiS + info%n_compressions = 0 + info%n_zero_eigs = -1 + info%n_dense_rows = -1 + + ! Deallocate arrays + DEALLOCATE (ipe,iw,work1,work3,STAT=info%stat) + IF (info%stat/=0) THEN + info%flag = mc68_err_memory_dealloc + IF (printe) & + CALL mc68_print_message(info%flag,lp,context='mc68_order') + RETURN + END IF + + CASE (4) + ! ---------------------------------- + ! Ordering for indefinite matrices using methodology of MA47 + ! ---------------------------------- + ! Set length of iw + iwlen = 4*( ptr(n+1) - 1 ) + n + IF (present(min_l_workspace)) iwlen = max(iwlen,min_l_workspace+0_long) + + ! Allocate required arrays + ALLOCATE (work2(n),ipe(n+1),iw(iwlen),work3(n),work4(n),work6(n), & + work7(n),work8(n),work9(n),STAT=info%stat) + IF (info%stat/=0) THEN + info%flag = mc68_err_memory_alloc + IF (printe) CALL mc68_print_message(info%flag,lp, & + context='mc68_order') + RETURN + END IF + + ! IPE and IW hold matrix in VARIANT of CSC format + ! iw(ipe(i)) must be length of column i. + call half_to_full_variant(n, ptr, row, ipe, iw, .false., ndiag=diag, & + dflag=work2) + + iwfr = ipe(n+1) ! Index of next entry to be filled in iw + ! Warn if no diagonal entries present + IF (diag==0) info%flag = mc68_warn_diag + + ! Carryout ordering + CALL mc68_ma47_analyse(n,ipe,iw,iwlen,iwfr,control%row_search,work3, & + work2,work4,info) + info%l_workspace = iwlen + info%n_dense_rows = -1 + IF (info%flag<0) THEN + IF (printe) CALL mc68_print_message(info%flag,lp, & + context='mc68_order') + RETURN + END IF + + CALL mc68_ma47_treesearch(n,work4,work3,work2,perm,control%nemin,info) + + IF (info%flag>0 .and. printw) & + CALL mc68_print_message(info%flag,lp,context='mc68_order') + + IF (info%flag<0) THEN + IF (printe) & + CALL mc68_print_message(info%flag,lp,context='mc68_order') + RETURN + END IF + + ! Deallocate required arrays + DEALLOCATE (work3,work4,work6,work7,work8,work9,work2,ipe,iw, & + STAT=info%stat) + IF (info%stat<0) THEN + info%flag = mc68_err_memory_dealloc + IF (printe) & + CALL mc68_print_message(info%flag,lp,context='mc68_order') + RETURN + END IF + END SELECT + + 20 continue + IF (printd) THEN + ! --------------------------------------------- + ! Print out perm + ! --------------------------------------------- + WRITE (mp,'(a7)') 'perm = ' + WRITE (mp,'(5i15)') (perm(i),i=1,n) + ELSE IF (printi) THEN + ! --------------------------------------------- + ! Print out first few entries of perm + ! --------------------------------------------- + WRITE (mp,'(a21)') 'perm(1:min(5,n)) = ' + WRITE (mp,'(5i15)') (perm(i),i=1,min(5,n)) + END IF + + IF (printi) THEN + CALL mc68_print_message(info%flag,mp,context='mc68_order') + ELSE IF (printw .AND. (info%stat>0)) THEN + CALL mc68_print_message(info%flag,wp,context='mc68_order') + END IF +END SUBROUTINE mc68_order_integer + +! Convert a matrix in half storage to one in full storage using +! VARIANT CSC format. +! Optionally drop any diagonal entries if drop=.true. +subroutine half_to_full_variant(n, ptr, row, ptr2, row2, drop, ndiag, dflag) + integer, intent(in) :: n + integer, dimension(n+1), intent(in) :: ptr + integer, dimension(ptr(n+1)-1), intent(in) :: row + integer, dimension(*), intent(out) :: ptr2 + integer, dimension(*), intent(out) :: row2 + logical, intent(in) :: drop + integer, optional, intent(out) :: ndiag ! number of diagonal entries + ! (only if drop=true) + integer, optional, dimension(n), intent(out) :: dflag ! flag array for + ! diagonal entries (only if drop=true) + ! dflag(i) = 1 if present in col i, -1 if not + + integer :: i, j, k + + if(present(dflag)) dflag(:) = -1 + if(present(ndiag)) ndiag = 0 + + ! Set ptr2(j) to hold no. nonzeros in column j + ptr2(1:n+1) = 0 + DO j = 1, n + DO k = ptr(j), ptr(j+1) - 1 + i = row(k) + IF (j/=i) THEN + ptr2(i) = ptr2(i) + 1 + ptr2(j) = ptr2(j) + 1 + ELSEIF(.not.drop) THEN + ptr2(i) = ptr2(i) + 1 + if(present(ndiag)) ndiag = ndiag + 1 + if(present(dflag)) dflag(i) = 1 + END IF + END DO + END DO + + ! Set ptr2(j) to point to where row indices will end in row2 + row2(1) = ptr2(1) + ptr2(1) = ptr2(1) + 1 + DO j = 2, n + row2(ptr2(j-1)+1) = ptr2(j) + ptr2(j) = ptr2(j-1) + ptr2(j) + 1 + END DO + ptr2(n+1) = ptr2(n) + 1 + + ! Fill ptr2 and row2 + DO j = 1, n + DO k = ptr(j), ptr(j+1) - 1 + i = row(k) + IF (j/=i) THEN + row2(ptr2(i)) = j + row2(ptr2(j)) = i + ptr2(i) = ptr2(i) - 1 + ptr2(j) = ptr2(j) - 1 + ELSEIF(.not.drop) THEN + row2(ptr2(i)) = j + ptr2(i) = ptr2(i) - 1 + END IF + END DO + END DO + +end subroutine half_to_full_variant + +! Convert a matrix in half storage to one in full storage. +! Drops any diagonal entries. +subroutine half_to_full(n, ptr, row, ptr2, row2) + integer, intent(in) :: n + integer, dimension(n+1), intent(in) :: ptr + integer, dimension(ptr(n+1)-1), intent(in) :: row + integer, dimension(*), intent(out) :: ptr2 + integer, dimension(*), intent(out) :: row2 + + integer :: i, j, k + + ! Set ptr2(j) to hold no. nonzeros in column j + ptr2(1:n+1) = 0 + DO j = 1, n + DO k = ptr(j), ptr(j+1) - 1 + i = row(k) + IF (j/=i) THEN + ptr2(i) = ptr2(i) + 1 + ptr2(j) = ptr2(j) + 1 + END IF + END DO + END DO + + ! Set ptr2(j) to point to where row indices will end in row2 + DO j = 2, n + ptr2(j) = ptr2(j-1) + ptr2(j) + END DO + ptr2(n+1) = ptr2(n) + 1 + + ! Fill ptr2 and row2 + DO j = 1, n + DO k = ptr(j), ptr(j+1) - 1 + i = row(k) + IF (j/=i) THEN + row2(ptr2(i)) = j + row2(ptr2(j)) = i + ptr2(i) = ptr2(i) - 1 + ptr2(j) = ptr2(j) - 1 + END IF + END DO + END DO + DO j = 1, n + ptr2(j) = ptr2(j) + 1 + END DO + +end subroutine half_to_full + +! This subroutine returns true if a working MeTiS routine is linked, or +! false if the dummy metis.f is used. +logical function check_for_metis() + integer :: ptr(3), row(2), icntl(8), invp(2), perm(2) + + ptr = (/ 1, 2, 3 /) + row = (/ 2, 1 /) + icntl(1) = 0 ! MeTiS defaults + + CALL metis_nodend(2,ptr,row,1,icntl,invp,perm) + + check_for_metis = (perm(1).ne.-1) +end function check_for_metis + +SUBROUTINE mc68_print_message(flag,unit,context) +! Prints out errors and warnings according to value of flag + +! flag: is an integer scaler of intent(in). It is the information flag +! whose corresponding error message is printed + INTEGER (myint), INTENT (IN) :: flag + +! unit: is an integer scaler of intent(in). It is the unit number the +! error message should be printed on + INTEGER (myint), INTENT (IN) :: unit + +! context: is an optional assumed size character array of intent(in). +! It describes the context under which the error occured + CHARACTER (len=*), OPTIONAL, INTENT (IN) :: context + + INTEGER (myint) :: length + + IF (unit<=0) RETURN + + IF (flag>0) THEN + WRITE (unit,advance='yes',fmt='('' WARNING: '')') + ELSE IF (flag<0) THEN + WRITE (unit,advance='yes',fmt='('' ERROR: '')') + END IF + + IF (present(context)) THEN + length = len_trim(context) + WRITE (unit,advance='no',fmt='('' '', a,'': '')') context(1:length) + END IF + + SELECT CASE (flag) + CASE (0) + WRITE (unit,'(A)') 'successful completion' + + CASE (mc68_err_memory_alloc) + WRITE (unit,'(A)') 'memory allocation failure' + + CASE (mc68_err_memory_dealloc) + WRITE (unit,'(A)') 'memory deallocation failure' + + CASE (mc68_err_n) + WRITE (unit,'(A)') 'restriction n>=1 violated' + + CASE (mc68_err_ord) + WRITE (unit,'(A)') 'ord is not associated with an ordering' + + CASE (mc68_err_metis) + WRITE (unit,'(A)') 'MeTiS ordering requested but not linked' + + CASE (mc68_err_zb01) + WRITE (unit,'(A)') 'temporary file failure' + + CASE (mc68_warn_diag) + WRITE (unit,'(A)') 'no diagonal entries' + + CASE (mc68_warn_rank) + WRITE (unit,'(A)') 'matrix rank deficient' + + CASE (mc68_warn_rank+mc68_warn_diag) + WRITE (unit,'(A)') 'no diagonal entries and matrix rank deficient' + + END SELECT + +END SUBROUTINE mc68_print_message + + + + +SUBROUTINE mc68_min_deg_anal(n,ipe,iw,lw,iwfr,nv,iovflo,ncmpa,fratio,info) +! F90 version of subroutine MA27HD. + +! ANALYSIS SUBROUTINE + +! GIVEN REPRESENTATION OF THE WHOLE MATRIX (EXCLUDING DIAGONAL) +! PERFORM MINIMUM DEGREE ORDERING, CONSTRUCTING TREE POINTERS. +! IT WORKS WITH SUPERVARIABLES WHICH ARE COLLECTIONS OF ONE OR MORE +! VARIABLES, STARTING WITH SUPERVARIABLE I CONTAINING VARIABLE I FOR +! I = 1,2,...,N. ALL VARIABLES IN A SUPERVARIABLE ARE ELIMINATED +! TOGETHER. EACH SUPERVARIABLE HAS AS NUMERICAL NAME THAT OF ONE +! OF ITS VARIABLES (ITS PRINCIPAL VARIABLE). + +! N MUST BE SET TO THE MATRIX ORDER. IT IS NOT ALTERED. +! IPE(I) MUST BE SET TO POINT TO THE POSITION IN IW OF THE +! START OF ROW I OR HAVE THE VALUE ZERO IF ROW I HAS NO OFF- +! DIAGONAL NON-ZEROS. DURING EXECUTION IT IS USED AS FOLLOWS. IF +! SUPERVARIABLE I IS ABSORBED INTO SUPERVARIABLE J THEN IPE(I)=-J. +! IF SUPERVARIABLE I IS ELIMINATED THEN IPE(I) EITHER POINTS TO THE +! LIST OF SUPERVARIABLES FOR CREATED ELEMENT I OR IS ZERO IF +! THE CREATED ELEMENT IS NULL. IF ELEMENT I +! IS ABSORBED INTO ELEMENT J THEN IPE(I)=-J. +! IW MUST BE SET ON ENTRY TO HOLD LISTS OF VARIABLES BY +! ROWS, EACH LIST BEING HEADED BY ITS LENGTH. +! DURING EXECUTION THESE LISTS ARE REVISED AND HOLD +! LISTS OF ELEMENTS AND SUPERVARIABLES. THE ELEMENTS +! ALWAYS HEAD THE LISTS. WHEN A SUPERVARIABLE +! IS ELIMINATED ITS LIST IS REPLACED BY A LIST OF SUPERVARIABLES +! IN THE NEW ELEMENT. +! LW MUST BE SET TO THE LENGTH OF IW. IT IS NOT ALTERED. +! IWFR MUST BE SET TO THE POSITION IN IW OF THE FIRST FREE VARIABLE. +! IT IS REVISED DURING EXECUTION AND CONTINUES TO HAVE THIS MEANING. +! NV(JS) NEED NOT BE SET. DURING EXECUTION IT IS ZERO IF +! JS IS NOT A PRINCIPAL VARIABLE AND IF IT IS IT HOLDS +! THE NUMBER OF VARIABLES IN SUPERVARIABLE JS. FOR ELIMINATED +! VARIABLES IT IS SET TO THE DEGREE AT THE TIME OF ELIMINATION. +! IOVFLO should be set to a high legitimate integer. +! It is used as a flag. +! NCMPA number of compresses. +! FRATIO is the density of rows regarded as dense. + + REAL (myreal_mc68), INTENT (IN) :: fratio + INTEGER (long), INTENT (IN) :: lw + INTEGER, INTENT (IN) :: n, iovflo + INTEGER, INTENT (INOUT) :: iwfr, ipe(n), iw(lw) + INTEGER, INTENT (OUT) :: nv(n), ncmpa + TYPE (mc68_info), INTENT (INOUT) :: info + +! Local variables + +! NXT(JS) NEED NOT BE SET. DURING EXECUTION IT IS THE NEXT +! SUPERVARIABLE HAVING THE SAME DEGREE AS JS, OR ZERO +! IF IT IS LAST IN ITS LIST. +! LST(JS) NEED NOT BE SET. DURING EXECUTION IT IS THE +! LAST SUPERVARIABLE HAVING THE SAME DEGREE AS JS OR +! -(ITS DEGREE) IF IT IS FIRST IN ITS LIST. +! IPD(ID) NEED NOT BE SET. DURING EXECUTION IT +! IS THE FIRST SUPERVARIABLE WITH DEGREE ID OR ZERO +! IF THERE ARE NONE. +! FLAG IS USED AS WORKSPACE FOR ELEMENT AND SUPERVARIABLE FLAGS. +! WHILE THE CODE IS FINDING THE DEGREE OF SUPERVARIABLE IS +! FLAG HAS THE FOLLOWING VALUES. +! A) FOR THE CURRENT PIVOT/NEW ELEMENT ME +! FLAG(ME)=-1 +! B) FOR VARIABLES JS +! FLAG(JS)=-1 IF JS IS NOT A PRINCIPAL VARIABLE +! FLAG(JS)=0 IF JS IS A SUPERVARIABLE IN THE NEW ELEMENT +! FLAG(JS)=NFLG IF JS IS A SUPERVARIABLE NOT IN THE NEW +! ELEMENT THAT HAS BEEN COUNTED IN THE DEGREE +! CALCULATION +! FLAG(JS).GT.NFLG IF JS IS A SUPERVARIABLE NOT IN THE NEW +! ELEMENT THAT HAS NOT BEEN COUNTED IN THE DEGREE +! CALCULATION +! C) FOR ELEMENTS IE +! FLAG(IE)=-1 IF ELEMENT IE HAS BEEN MERGED INTO ANOTHER +! FLAG(IE)=-NFLG IF ELEMENT IE HAS BEEN USED IN THE DEGREE +! CALCULATION FOR IS. +! FLAG(IE).LT.-NFLG IF ELEMENT IE HAS NOT BEEN USED IN THE +! DEGREE CALCULATION FOR IS +! .. +! .. Array Arguments .. + INTEGER, ALLOCATABLE, DIMENSION (:) :: flag, ipd, lst, nxt + +! .. +! .. Local Scalars .. +! LIMIT Limit on number of variables for putting node in root. +! NVROOT Number of variables in the root node +! ROOT Index of the root node (N+1 if none chosen yet). + INTEGER :: i, id, idl, idn, ie, ip, is, jp, jp1, jp2, js, k, k1, k2, & + ke, kp, kp0, kp1, kp2, ks, l, len, limit, ln, ls, lwfr, md, me, ml, & + ms, nel, nflg, np, np0, ns, nvpiv, nvroot, root +! .. +! .. +! .. Intrinsic Functions .. + INTRINSIC abs, min, nint +! .. +! If a column of the reduced matrix has relative density greater than +! CNTL(2), it is forced into the root. All such columns are taken to +! have sparsity pattern equal to their merged patterns, so the fill +! and operation counts may be overestimated. + +! IS,JS,KS,LS,MS,NS ARE USED TO REFER TO SUPERVARIABLES. +! IE,JE,KE ARE USED TO REFER TO ELEMENTS. +! IP,JP,KP,K,NP ARE USED TO POINT TO LISTS OF ELEMENTS. +! OR SUPERVARIABLES. +! ID IS USED FOR THE DEGREE OF A SUPERVARIABLE. +! MD IS USED FOR THE CURRENT MINIMUM DEGREE. +! IDN IS USED FOR THE NO. OF VARIABLES IN A NEWLY CREATED ELEMENT +! NEL IS USED TO HOLD THE NO. OF VARIABLES THAT HAVE BEEN +! ELIMINATED. +! ME=MS IS THE NAME OF THE SUPERVARIABLE ELIMINATED AND +! OF THE ELEMENT CREATED IN THE MAIN LOOP. +! NFLG IS USED FOR THE CURRENT FLAG VALUE IN ARRAY FLAG. IT STARTS +! WITH THE VALUE IOVFLO AND IS REDUCED BY 1 EACH TIME IT IS USED +! UNTIL IT HAS THE VALUE 2 WHEN IT IS RESET TO THE VALUE IOVFLO. + +! INITIALIZATIONS + + ALLOCATE (flag(n),ipd(n),lst(n),nxt(n),STAT=info%stat) + IF (info%stat>0) THEN + info%flag = mc68_err_memory_alloc + RETURN + END IF + info%n_dense_rows = 0 + ipd(:) = 0 + nv(:) = 1 + flag(:) = iovflo + md = 1 + ncmpa = 0 + nflg = iovflo + nel = 0 + root = n + 1 + nvroot = 0 + +! LINK TOGETHER VARIABLES HAVING SAME DEGREE + DO is = 1, n + k = ipe(is) + IF (k<=0) THEN +! WE HAVE A VARIABLE THAT CAN BE ELIMINATED AT ONCE BECAUSE THERE +! IS +! NO OFF-DIAGONAL NON-ZERO IN ITS ROW. + nel = nel + 1 + flag(is) = -1 + nxt(is) = 0 + lst(is) = 0 + ELSE + id = iw(k) + 1 + ns = ipd(id) + IF (ns>0) lst(ns) = is + nxt(is) = ns + ipd(id) = is + lst(is) = -id + END IF + END DO + +! START OF MAIN LOOP + DO ml = 1, n +! LEAVE LOOP IF ALL VARIABLES HAVE BEEN ELIMINATED. + IF (nel+nvroot+1>=n) THEN + GO TO 140 + ELSE +! FIND NEXT SUPERVARIABLE FOR ELIMINATION. + DO id = md, n + ms = ipd(id) + IF (ms>0) GO TO 10 + END DO +10 md = id +! NVPIV HOLDS THE NUMBER OF VARIABLES IN THE PIVOT. + nvpiv = nv(ms) + +! REMOVE CHOSEN VARIABLE FROM LINKED LIST + ns = nxt(ms) + nxt(ms) = 0 + lst(ms) = 0 + IF (ns>0) lst(ns) = -id + ipd(id) = ns + me = ms + nel = nel + nvpiv +! IDN HOLDS THE DEGREE OF THE NEW ELEMENT. + idn = 0 + +! RUN THROUGH THE LIST OF THE PIVOTAL SUPERVARIABLE, SETTING TREE +! POINTERS AND CONSTRUCTING NEW LIST OF SUPERVARIABLES. +! KP IS A POINTER TO THE CURRENT POSITION IN THE OLD LIST. + kp = ipe(me) + flag(ms) = -1 +! IP POINTS TO THE START OF THE NEW LIST. + ip = iwfr +! LEN HOLDS THE LENGTH OF THE LIST ASSOCIATED WITH THE PIVOT. + len = iw(kp) + DO kp1 = 1, len + kp = kp + 1 + ke = iw(kp) +! JUMP IF KE IS AN ELEMENT THAT HAS NOT BEEN MERGED INTO +! ANOTHER. + IF (flag(ke)<=-2) THEN +! SEARCH VARIABLE LIST OF ELEMENT KE, USING JP AS A POINTER TO +! IT. + ie = ke + jp = ipe(ie) + ln = iw(jp) + ELSE +! JUMP IF KE IS AN ELEMENT THAT HAS BEEN MERGED INTO ANOTHER +! OR +! IS +! A SUPERVARIABLE THAT HAS BEEN ELIMINATED. + IF (flag(ke)<=0) THEN + IF (ipe(ke)/=-root) THEN + GO TO 30 + ELSE +! KE has been merged into the root + ke = root + IF (flag(ke)<=0) GO TO 30 + END IF + END IF +! WE HAVE A SUPERVARIABLE. PREPARE TO SEARCH REST OF LIST. + jp = kp - 1 + ln = len - kp1 + 1 + ie = ms + END IF + +! SEARCH FOR DIFFERENT SUPERVARIABLES AND ADD THEM TO THE NEW +! LIST, +! COMPRESSING WHEN NECESSARY. THIS LOOP IS EXECUTED ONCE FOR +! EACH ELEMENT IN THE LIST AND ONCE FOR ALL THE SUPERVARIABLES +! IN THE LIST. + DO jp1 = 1, ln + jp = jp + 1 + is = iw(jp) +! JUMP IF IS IS NOT A PRINCIPAL VARIABLE OR HAS ALREADY BEEN +! COUNTED. + IF (flag(is)<=0) THEN + IF (ipe(is)==-root) THEN +! IS has been merged into the root + is = root + iw(jp) = root + IF (flag(is)<=0) GO TO 20 + ELSE + GO TO 20 + END IF + END IF + flag(is) = 0 + IF (iwfr>=lw) THEN +! PREPARE FOR COMPRESSING IW BY ADJUSTING POINTERS AND +! LENGTHS SO THAT THE LISTS BEING SEARCHED IN THE INNER AND +! OUTER +! LOOPS CONTAIN ONLY THE REMAINING ENTRIES. + ipe(ms) = kp + iw(kp) = len - kp1 + ipe(ie) = jp + iw(jp) = ln - jp1 +! COMPRESS IW + CALL mc68_compress(n,ipe,iw,ip-1,lwfr,ncmpa) +! COPY NEW LIST FORWARD + jp2 = iwfr - 1 + iwfr = lwfr + IF (ip<=jp2) THEN + DO jp = ip, jp2 + iw(iwfr) = iw(jp) + iwfr = iwfr + 1 + END DO + END IF +! ADJUST POINTERS FOR THE NEW LIST AND THE LISTS BEING +! SEARCHED. + ip = lwfr + jp = ipe(ie) + kp = ipe(me) + END IF +! STORE IS IN NEW LIST. + iw(iwfr) = is + idn = idn + nv(is) + iwfr = iwfr + 1 +! REMOVE IS FROM DEGREE LINKED LIST + ls = lst(is) + lst(is) = 0 + ns = nxt(is) + nxt(is) = 0 + IF (ns>0) lst(ns) = ls + IF (ls<0) THEN + ls = -ls + ipd(ls) = ns + ELSE IF (ls>0) THEN + nxt(ls) = ns + END IF +20 CONTINUE + END DO +! JUMP IF WE HAVE JUST BEEN SEARCHING THE VARIABLES AT THE END +! OF +! THE LIST OF THE PIVOT. + IF (ie==ms) THEN + GO TO 40 + ELSE +! SET TREE POINTER AND FLAG TO INDICATE ELEMENT IE IS ABSORBED +! INTO +! NEW ELEMENT ME. + ipe(ie) = -me + flag(ie) = -1 + END IF +30 CONTINUE + END DO + +! STORE THE DEGREE OF THE PIVOT. +40 nv(ms) = idn + nvpiv +! JUMP IF NEW ELEMENT IS NULL. + IF (iwfr==ip) THEN + ipe(me) = 0 + ELSE + k1 = ip + k2 = iwfr - 1 + +! RUN THROUGH NEW LIST OF SUPERVARIABLES REVISING EACH +! ASSOCIATED +! LIST, +! RECALCULATING DEGREES AND REMOVING DUPLICATES. + limit = nint(fratio*(n-nel)) + DO k = k1, k2 + is = iw(k) + IF (is/=root) THEN + IF (nflg<=2) THEN +! RESET FLAG VALUES TO +/-IOVFLO. + DO i = 1, n + IF (flag(i)>0) flag(i) = iovflo + IF (flag(i)<=-2) flag(i) = -iovflo + END DO + nflg = iovflo + END IF +! REDUCE NFLG BY ONE TO CATER FOR THIS SUPERVARIABLE. + nflg = nflg - 1 +! BEGIN WITH THE DEGREE OF THE NEW ELEMENT. ITS VARIABLES +! MUST +! ALWAYS +! BE COUNTED DURING THE DEGREE CALCULATION AND THEY ARE +! ALREADY +! FLAGGED WITH THE VALUE 0. + id = idn +! RUN THROUGH THE LIST ASSOCIATED WITH SUPERVARIABLE IS + kp1 = ipe(is) + 1 +! NP POINTS TO THE NEXT ENTRY IN THE REVISED LIST. + np = kp1 + kp2 = iw(kp1-1) + kp1 - 1 + DO kp = kp1, kp2 + ke = iw(kp) +! TEST WHETHER KE IS AN ELEMENT, A REDUNDANT ENTRY OR A +! SUPERVARIABLE. + IF (flag(ke)==-1) THEN + IF (ipe(ke)/=-root) THEN + GO TO 60 + ELSE +! KE has been merged into the root + ke = root + iw(kp) = root + IF (flag(ke)==-1) GO TO 60 + END IF + END IF + IF (flag(ke)>=0) THEN + GO TO 70 + ELSE +! SEARCH LIST OF ELEMENT KE, REVISING THE DEGREE WHEN +! NEW +! VARIABLES +! FOUND. + jp1 = ipe(ke) + 1 + jp2 = iw(jp1-1) + jp1 - 1 + idl = id + DO jp = jp1, jp2 + js = iw(jp) +! JUMP IF JS HAS ALREADY BEEN COUNTED. + IF (flag(js)>nflg) THEN + id = id + nv(js) + flag(js) = nflg + END IF + END DO +! JUMP IF ONE OR MORE NEW SUPERVARIABLES WERE FOUND. + IF (id<=idl) THEN +! CHECK WHETHER EVERY VARIABLE OF ELEMENT KE IS IN NEW +! ELEMENT ME. + DO jp = jp1, jp2 + js = iw(jp) + IF (flag(js)/=0) GO TO 50 + END DO +! SET TREE POINTER AND FLAG TO INDICATE THAT ELEMENT +! KE +! IS ABSORBED +! INTO NEW ELEMENT ME. + ipe(ke) = -me + flag(ke) = -1 + GO TO 60 + END IF +! STORE ELEMENT KE IN THE REVISED LIST FOR SUPERVARIABLE +! IS AND FLAG IT. +50 iw(np) = ke + flag(ke) = -nflg + np = np + 1 + END IF +60 CONTINUE + END DO + np0 = np + GO TO 90 +! TREAT THE REST OF THE LIST ASSOCIATED WITH SUPERVARIABLE +! IS. +! IT +! CONSISTS ENTIRELY OF SUPERVARIABLES. +70 kp0 = kp + np0 = np + DO kp = kp0, kp2 + ks = iw(kp) + IF (flag(ks)<=nflg) THEN + IF (ipe(ks)==-root) THEN + ks = root + iw(kp) = root + IF (flag(ks)<=nflg) GO TO 80 + ELSE + GO TO 80 + END IF + END IF +! ADD TO DEGREE, FLAG SUPERVARIABLE KS AND ADD IT TO NEW +! LIST. + id = id + nv(ks) + flag(ks) = nflg + iw(np) = ks + np = np + 1 +80 CONTINUE + END DO +! MOVE FIRST SUPERVARIABLE TO END OF LIST, MOVE FIRST +! ELEMENT +! TO END +! OF ELEMENT PART OF LIST AND ADD NEW ELEMENT TO FRONT OF +! LIST. +90 IF (id>=limit) THEN +! Treat IS as full. Merge it into the root node. + info%n_dense_rows = info%n_dense_rows + 1 + IF (nvroot==0) THEN + root = is + ipe(is) = 0 + ELSE + iw(k) = root + ipe(is) = -root + nv(root) = nv(root) + nv(is) + nv(is) = 0 + flag(is) = -1 + END IF + nvroot = nv(root) + ELSE + iw(np) = iw(np0) + iw(np0) = iw(kp1) + iw(kp1) = me +! STORE THE NEW LENGTH OF THE LIST. + iw(kp1-1) = np - kp1 + 1 + +! CHECK WHETHER ROW IS IS IDENTICAL TO ANOTHER BY LOOKING +! IN +! LINKED +! LIST OF SUPERVARIABLES WITH DEGREE ID AT THOSE WHOSE +! LISTS +! HAVE +! FIRST ENTRY ME. NOTE THAT THOSE CONTAINING ME COME FIRST +! SO THE +! SEARCH CAN BE TERMINATED WHEN A LIST NOT STARTING WITH +! ME +! IS +! FOUND. + js = ipd(id) + DO l = 1, n + IF (js<=0) THEN + GO TO 120 + ELSE + kp1 = ipe(js) + 1 + IF (iw(kp1)/=me) THEN + GO TO 120 + ELSE +! JS HAS SAME DEGREE AND IS ACTIVE. CHECK IF +! IDENTICAL +! TO IS. + kp2 = kp1 - 1 + iw(kp1-1) + DO kp = kp1, kp2 + ie = iw(kp) +! JUMP IF IE IS A SUPERVARIABLE OR AN ELEMENT NOT +! IN +! THE LIST OF IS. + IF (abs(flag(ie)+0)>nflg) GO TO 100 + END DO + GO TO 110 + +100 js = nxt(js) + END IF + END IF + END DO +! SUPERVARIABLE AMALGAMATION. ROW IS IS IDENTICAL TO ROW +! JS. +! REGARD ALL VARIABLES IN THE TWO SUPERVARIABLES AS BEING +! IN +! IS. SET +! TREE POINTER, FLAG AND NV ENTRIES. +110 ipe(js) = -is + nv(is) = nv(is) + nv(js) + nv(js) = 0 + flag(js) = -1 +! REPLACE JS BY IS IN LINKED LIST. + ns = nxt(js) + ls = lst(js) + IF (ns>0) lst(ns) = is + IF (ls>0) nxt(ls) = is + lst(is) = ls + nxt(is) = ns + lst(js) = 0 + nxt(js) = 0 + IF (ipd(id)==js) ipd(id) = is + GO TO 130 +! INSERT IS INTO LINKED LIST OF SUPERVARIABLES OF SAME +! DEGREE. +120 ns = ipd(id) + IF (ns>0) lst(ns) = is + nxt(is) = ns + ipd(id) = is + lst(is) = -id + md = min(md,id) + END IF + END IF +130 CONTINUE + END DO + +! RESET FLAGS FOR SUPERVARIABLES IN NEWLY CREATED ELEMENT AND +! REMOVE THOSE ABSORBED INTO OTHERS. + DO k = k1, k2 + is = iw(k) + IF (nv(is)/=0) THEN + flag(is) = nflg + iw(ip) = is + ip = ip + 1 + END IF + END DO + iwfr = k1 + flag(me) = -nflg +! MOVE FIRST ENTRY TO END TO MAKE ROOM FOR LENGTH. + iw(ip) = iw(k1) + iw(k1) = ip - k1 +! SET POINTER FOR NEW ELEMENT AND RESET IWFR. + ipe(me) = k1 + iwfr = ip + 1 + END IF + END IF + END DO + +! Absorb any remaining variables into the root +140 DO is = 1, n + IF (nxt(is)/=0 .OR. lst(is)/=0) THEN + IF (nvroot==0) THEN + root = is + ipe(is) = 0 + ELSE + ipe(is) = -root + END IF + nvroot = nvroot + nv(is) + nv(is) = 0 + END IF + END DO +! Link any remaining elements to the root + DO ie = 1, n + IF (ipe(ie)>0) ipe(ie) = -root + END DO + IF (nvroot>0) nv(root) = nvroot + + + DEALLOCATE (flag,ipd,lst,nxt,STAT=info%stat) + IF (info%stat>0) THEN + info%flag = mc68_err_memory_dealloc + RETURN + END IF + + +END SUBROUTINE mc68_min_deg_anal + + +SUBROUTINE mc68_min_deg_tree_search(n,ipe,nv,perm,nemin,info) + +! Tree search +! Given son to father tree pointers, reorder so that eldest son has +! smallest degree and perform depth-first +! search to find pivot order and number of eliminations +! and assemblies at each stage. +! N must be set to the matrix order. It is not altered. +! IPE(I) must be set equal to -(father of node I) or zero if +! node is a root, if NV(I) > 0. If NV(I) = 0, then I is +! subordinate variable of a supervariable and -IPE(I) points to +! principal variable. It is altered to point to its next +! younger brother if it has one, but otherwise is not changed. +! NV(I) must be set to zero if variable is a subordinate variable +! of a supervariable and to the degree otherwise. +! PERM is set to the new permutation after dfs of tree. PERM(I) is +! the position of variable I in the pivot order. + + INTEGER, INTENT (IN) :: n, nemin + INTEGER, INTENT (INOUT) :: ipe(n), nv(n) + TYPE (mc68_info), INTENT (INOUT) :: info + INTEGER, INTENT (OUT) :: perm(n) + +! Local variables +! IPS(I) is used temporarily to hold +! -(eldest son of node I) if it has one and 0 otherwise. It is +! finally set to hold the position of node I in the order. +! NE(IS) is set to the number of variables +! eliminated at stage IS of the elimination. +! NA(IS) is set to the number of elements +! assembled at stage IS of the elimination. +! NODE (I) is used during the code +! to hold the number of subordinate variables for variable I and +! on output it holds +! the node (in dfs ordering) at which variable I is eliminated. +! It is also defined for subordinate variables. +! ND(IS) is set to the degree at stage IS of +! the elimination. +! NSTEPS is set to the number of elimination steps. +! NEMIN is used to control the amalgamation process between +! a son and its father (if the number of fully summed +! variables of both nodes is smaller than NEMIN). +! SUBORD(I) holds the first subordinate variable +! for variable I if I +! is a principal variable and holds the next subordinate variable +! if otherwise. It is zero at the end of the chain. + +! .. Array Arguments .. + INTEGER, ALLOCATABLE, DIMENSION (:) :: fils, frere, ips, na, nd, ne, & + node, subord +! .. +! .. Scalars .. + INTEGER :: i, ib, if, ifson, il, in, inb, inf, infs, inl, ino, inos, & + ins, insw, int, iperm, is, ison, k, l, nr, nr1 + +! Initialisations + + ALLOCATE (fils(n),frere(n),ips(n),na(n),nd(n),ne(n),node(n),subord(n), & + STAT=info%stat) + IF (info%stat>0) THEN + info%flag = mc68_err_memory_alloc + RETURN + END IF + + ips(:) = 0 + ne(:) = 0 + node(:) = 0 + subord(:) = 0 + + +! Set IPS(I) to -(eldest son of node I) and IPE(I) to next younger +! brother of node I if it has one. + nr = n + 1 + DO i = 1, n + if = -ipe(i) + IF (nv(i)==0) THEN +! I is a subordinate node, principal variable is IF + IF (subord(if)/=0) subord(i) = subord(if) + subord(if) = i + node(if) = node(if) + 1 +! Node IF is the father of node I. + ELSE IF (if/=0) THEN +! IS is younger brother of node I. +! IPS(IF) will eventually point to - eldest son of IF. + is = -ips(if) + IF (is>0) ipe(i) = is + ips(if) = -i + ELSE +! I is a root node + nr = nr - 1 + ne(nr) = i + END IF + END DO + +! We reorganize the tree so that the eldest son has maximum number of +! variables. We combine nodes when the number of variables in a son +! is greater than or equal to the number of variables in the father. +! If the eldest son has the maximum number of variables, +! and if a combination is possible, it has to be possible with +! the eldest son. +! FILS is just used as workspace during this reorganization and is +! reset +! afterwards. + + DO i = 1, n + fils(i) = ips(i) + END DO + nr1 = nr + ins = 0 +10 CONTINUE +! Jump if all roots processed. + IF (nr1<=n) THEN +! Get next root + ins = ne(nr1) + nr1 = nr1 + 1 +20 CONTINUE +! Depth first search through eldest sons. + inl = fils(ins) + IF (inl<0) THEN + ins = -inl + GO TO 20 + ELSE + DO WHILE (ipe(ins)<0) +! INS is youngest son otherwise IPE value would be positive. + ins = -ipe(ins) +! INS is now the father of the reorganized son so we can +! clear the pointer to the sons. + fils(ins) = 0 +! Continue backtracking until we encounter node with younger +! brother. + END DO + + IF (ipe(ins)/=0) THEN +! INB is younger brother of INS. + inb = ipe(ins) + IF (nv(inb)>=nv(ins)) THEN + ins = inb +! Do depth first search from younger brother + ELSE +! Exchange INB and INS +! Find previous brother of INS (could be the father) +! then we do depth first search with INS = INB + inf = inb +30 CONTINUE + inf = ipe(inf) + IF (inf>0) GO TO 30 +! -INF IS THE FATHER + inf = -inf + infs = -fils(inf) +! INFS is eldest son of INF + IF (infs==ins) THEN +! INS is eldest brother .. a role which INB now assumes + fils(inf) = -inb + ips(inf) = -inb + ipe(ins) = ipe(inb) + ipe(inb) = ins + ELSE + insw = infs +40 CONTINUE + infs = ipe(insw) + IF (infs/=ins) THEN + insw = infs + GO TO 40 + END IF + ipe(ins) = ipe(inb) + ipe(inb) = ins + ipe(insw) = inb + END IF + ins = inb +! Depth first search from moved younger brother + END IF + GO TO 20 + END IF + END IF +! INS is a root, check for next one. + ins = 0 + GO TO 10 + END IF +! Set FRERE and FILS + DO i = 1, n + frere(i) = ipe(i) + fils(i) = ips(i) + END DO + +! Depth-first search. +! IL holds the current tree level. Roots are at level N, their sons +! are at level N-1, etc. +! IS holds the current elimination stage. We accumulate the number +! of eliminations at stage is directly in NE(IS). The number of +! assemblies is accumulated temporarily in NA(IL), for tree +! level IL, and is transferred to NA(IS) when we reach the +! appropriate stage IS. + is = 1 +! I is the current node. + i = 0 +! IPERM is used as pointer to setting permutation vector + iperm = 1 + DO k = 1, n + IF (i<=0) THEN +! Pick up next root. +! Stop if all roots used (needed because of subordinate variables) + IF (nr>n) THEN + GO TO 130 + ELSE + i = ne(nr) + ne(nr) = 0 + nr = nr + 1 + il = n + na(n) = 0 + END IF + END IF +! Go to son for as long as possible, clearing father-son pointers +! in IPS as each is used and setting NA(IL)=0 for all levels +! reached. + DO l = 1, n + IF (ips(i)>=0) THEN + GO TO 50 + ELSE + ison = -ips(i) + ips(i) = 0 + i = ison + il = il - 1 + na(il) = 0 + END IF + END DO +! Record position of node I in the order. +50 ips(i) = k +! Add number of subordinate variables to variable I + ne(is) = ne(is) + node(i) + 1 + IF (il0) GO TO 80 +! Cannot be root node .. so points to father +! Merge node IS-1 (INO) into node IS (I) + nv(ino) = 0 +! IPE already set .. was father pointer now principal variable +! pointer +! Now make subsidiary nodes of INO into subsidiary nodes of I. +! Subordinate nodes of INO become subordinate nodes of I + in = i +90 CONTINUE + IF (subord(in)/=0) THEN + in = subord(in) + node(in) = is - 1 + GO TO 90 + END IF + subord(in) = ino + in = ino + IF (subord(in)/=0) THEN + in = subord(in) + ipe(in) = -i + END IF + +! INOS is eldest son of INO + inos = -fils(ino) + +! Find elder brother of node INO +! First check to see if he is only son + IF (ifson/=ino) THEN + in = ifson +100 CONTINUE + ins = in + in = frere(in) + IF (in/=ino) GO TO 100 +! INS is older brother .. make him brother of first son of INO (ie +! INOS) +! and make INOS point to I now as father. +! Jump if there is no son of INO + IF (inos==0) THEN +! Elder brother of INO just points to (new) father. + frere(ins) = -i + GO TO 120 + ELSE + frere(ins) = inos + END IF + END IF +! INT is youngest brother of INOS. Make him point to (new) father. + in = inos + IF (in/=0) THEN +110 CONTINUE + int = in + in = frere(in) + IF (in>0) GO TO 110 + frere(int) = -i + END IF +120 ib = ipe(i) + IF (ib>=0) THEN +! Node I has a younger brother or is a root + IF (ib>0) na(il) = 0 + i = ib + ELSE +! I has no brothers. Go to father of node I + i = -ib + il = il + 1 + END IF + END DO +130 continue + + + DEALLOCATE (fils,frere,ips,na,nd,ne,node,subord,STAT=info%stat) + IF (info%stat>0) THEN + info%flag = mc68_err_memory_dealloc + RETURN + END IF + +END SUBROUTINE mc68_min_deg_tree_search + +SUBROUTINE mc68_compress(n,ipe,iw,lw,iwfr,ncmpa) +! Is identical to subroutine MA27UD. Internal version for MA57. +! COMPRESS LISTS HELD BY MA27H/HD (MA57H/HD) IN IW AND ADJUST POINTERS +! IN IPE TO CORRESPOND. +! N IS THE MATRIX ORDER. IT IS NOT ALTERED. +! IPE(I) POINTS TO THE POSITION IN IW OF THE START OF LIST I OR IS +! ZERO IF THERE IS NO LIST I. ON EXIT IT POINTS TO THE NEW POSITION. +! IW HOLDS THE LISTS, EACH HEADED BY ITS LENGTH. ON OUTPUT THE SAME +! LISTS ARE HELD, BUT THEY ARE NOW COMPRESSED TOGETHER. +! LW HOLDS THE LENGTH OF IW. IT IS NOT ALTERED. +! IWFR NEED NOT BE SET ON ENTRY. ON EXIT IT POINTS TO THE FIRST FREE +! LOCATION IN IW. +! ON RETURN IT IS SET TO THE FIRST FREE LOCATION IN IW. +! NCMPA is number of compresses. + +! .. Scalar Arguments .. + INTEGER, INTENT (IN) :: lw, n + INTEGER, INTENT (OUT) :: iwfr + INTEGER, INTENT (INOUT) :: ncmpa +! .. +! .. Array Arguments .. + INTEGER, INTENT (INOUT) :: ipe(n), iw(lw) +! .. +! .. Local Scalars .. + INTEGER i, ir, k, k1, k2, lwfr +! .. + ncmpa = ncmpa + 1 +! PREPARE FOR COMPRESSING BY STORING THE LENGTHS OF THE +! LISTS IN IPE AND SETTING THE FIRST ENTRY OF EACH LIST TO +! -(LIST NUMBER). + DO i = 1, n + k1 = ipe(i) + IF (k1>0) THEN + ipe(i) = iw(k1) + iw(k1) = -i + END IF + END DO + +! COMPRESS +! IWFR POINTS JUST BEYOND THE END OF THE COMPRESSED FILE. +! LWFR POINTS JUST BEYOND THE END OF THE UNCOMPRESSED FILE. + iwfr = 1 + lwfr = iwfr + DO ir = 1, n + IF (lwfr>lw) THEN + GO TO 20 + ELSE +! SEARCH FOR THE NEXT NEGATIVE ENTRY. + DO k = lwfr, lw + IF (iw(k)<0) GO TO 10 + END DO + GO TO 20 +! PICK UP ENTRY NUMBER, STORE LENGTH IN NEW POSITION, SET NEW +! POINTER +! AND PREPARE TO COPY LIST. +10 i = -iw(k) + iw(iwfr) = ipe(i) + ipe(i) = iwfr + k1 = k + 1 + k2 = k + iw(iwfr) + iwfr = iwfr + 1 + IF (k1<=k2) THEN +! COPY LIST TO NEW POSITION. + DO k = k1, k2 + iw(iwfr) = iw(k) + iwfr = iwfr + 1 + END DO + END IF + lwfr = k2 + 1 + END IF + END DO +20 RETURN + +END SUBROUTINE mc68_compress +! ----------------------------------------------------------- + +SUBROUTINE mc68_ma47_analyse(n,ipe,iw,lw,iwfr,cntl,count,nv,next,info) + INTEGER, PARAMETER :: wp = kind(0.0D0) + +! Analysis subroutine + +! Given representation of the whole matrix, perform Markowitz +! ordering, +! constructing tree pointers. It works with supervariables which +! are collections of one or more variables whose rows have the same +! pattern, starting with supervariable I containing variable I for I +! = 1,2,...,N. Each supervariable has as numerical name that of one +! of its variables (its principal variable). When a supervariable is +! eliminated, its name is used for the name of the element created. + + +! N must be set to the matrix order. It is not altered. +! Constraint: N <= HUGE/3. +! IPE(I) must be set to the position in IW of the list for row I, +! I=1,N. +! During execution, IPE(I) is used as follows: +! if I is a supervariable, IPE(I) is the position in IW of its list; +! if I is an element, IPE(I) is the position in IW of its list, or +! 0 if the list has zero length; +! if I is a variable that has been absorbed in a supervariable, +! IPE(I) = 0. +! IW must be set on entry to hold lists of entries by rows, each list +! being headed by its length. The lists include any diagonal entries +! and the entries of both the upper and lower triangular parts. +! During execution, it holds lists for supervariables and lists for +! elements. A list for a supervariable represents its row of the +! reduced matrix and has the form: +! length ( = total number of elements and supervariables) +! list of element parts in the form JS+N*PART, where JS is an +! element name and PART has the value +! 2 for the part with leading zeros; +! 0 for the full part; +! 1 for the part with trailing zeros; +! list of supervariables. +! A list for an element has the form: +! length ( = 2 + total number of supervariables) +! number of supervariables in the part with leading zeros +! number of supervariables in the part with trailing zeros +! list of supervariables. +! LW must be set to the length of IW. It may be altered. +! IWFR must be set to the position in IW of the first unused location. +! It is revised during execution and continues to have +! this meaning. +! COUNT need not be set on entry. For supervariables, it is used to +! hold the row counts in the reduced matrix. COUNT(I) is negated +! if supervariable I has been eliminated as the trailing +! part of a tile or oxo pivot. +! NV must be set on entry so that NV(I) = 1 for a nondefective +! variable +! (nonzero diagonal entry) and NV(I) = -1 otherwise, I = 1,..., N. +! During execution, NV(JS) is used as follows: +! if JS is a variable that has been absorbed into another, +! NV(JS) = 0; +! if JS is a supervariable, NV(JS) holds its number of +! variables, negated for a defective supervariable. +! NEXT need not be set. During execution, it is used as follows: +! if JS is a supervariable that has not been eliminated or +! absorbed, NEXT(JS) is the next such supervariable having the +! same row count, or zero if JS is last in its list; +! if supervariable IS has been absorbed and JS is the next +! variable in its supervariable, NEXT(IS)=-JS; +! if supervariable IS was eliminated in a block pivot with +! supervariable JS, NEXT(IS)=-JS; +! if IE is an element whose parent in the tree is JE, NEXT(IE)=-JE; +! if IE is an element with no parent in the tree, NEXT(IE)=0. +! NCMP is number of times garbage collection routine is called. +! ICNTL must be set by the user as follows and is not altered. +! ICNTL(1) must be set to the stream number for error messages. +! A value less than 1 suppresses output. +! ICNTL(2) must be set to the stream number for diagnostic output. +! A value less than 1 suppresses output. +! ICNTL(3) must be set to control the amount of output: +! 0 None. +! 1 Error messages only. +! 2 Error and warning messages. +! 3 As 2, plus scalar parameters and a few entries of array +! parameters on entry and exit. +! 4 As 2, plus all parameters on entry and exit. +! CNTL must set to one if the user wants the pivot order chosen +! by Markowitz strategy,, and greater than 1 for Markowits strategy +! with +! each search for a structured pivot limited to this number of rows. +! INFO is left unaltered except +! 8 is added to INFO%flag and +! INFO%n_zero_eigs is set to the number of zero eigenvalues found. + +! Local constants + +! Local variables +! BOUND True if row count is to be bounded rather than recomputed. +! CMIN holds the minimum Markowitz cost of a potential structured +! pivot +! found so far. +! COST holds the Markowitz cost of a potential structured pivot. +! FLG Flag value. +! FLG1 Flag value. +! I Temporary variable. +! IE is an element. +! IEL is an element. +! IP is used to point to a list of elements or supervariables. +! IR is used for row counts. +! IRL last value of IR +! IS is a supervariable. +! ITHR Index for do loop in case threshold needs to be raised. +! JP is used to point to a list of elements or supervariables. +! JP1 start of range for JP. +! JP2 end of range for JP. +! JP3 start of range for JP. +! JP4 end of range for JP. +! JS is a supervariable. +! K is used to point to a list of elements or supervariables. +! KE is an element. +! KIND has the value +! 1 for a full pivot, +! 2 for a tile pivot, or +! 3 for an oxo pivot +! KP is used to point to a list of elements or supervariables. +! KP1 start of range for KP. +! KP2 end of range for KP. +! KS is a supervariable. +! K1 start of range for K. +! K2 end of range for K. +! LIST is used to search a list. +! LOOP Row of the pivot when constructing the index list of a new +! element. +! LS is a supervariable. +! ME is the element created by the current pivot step. +! MINF is lower bound for the row count of a nondefective variable. +! MINR is used for the current minimum row count. +! ML is used for the main loop index. +! MP is stream for warning and diagnostic messages. +! MROWS holds the max. number of rows to be searched for a structured +! pivot. +! MS is a supervariable. +! NEL is used to hold the number of variables that have been +! eliminated. +! NFLG is used for the current flag value in array FLAG. It starts +! with the value N*3 and is reduced by 1 each time it is used +! until it has the value 4 when it is reset to the value N*3. +! NP is used to point to a list of elements or supervariables. +! NP0 is used to point to a list of elements or supervariables. +! NR is used for the row counts in the generated element: +! NR(1) for a row of the middle block +! NR(2) for a row of the last block +! NR(3) for a row of the first block +! NROWS holds the number of rows searched for a structured pivot. +! NS is a supervariable. +! NSC is used for supervariable counts: +! NSC(1) first zero block +! NSC(2) full block +! NSC(3) second zero block +! NSVARS Supervariable counts. +! NVC Number of variables in both pivot rows, excluding the pivot. +! NVPIV holds the number of variables in the pivot (each half in the +! case of a tile or oxo). +! PART Part of element: 0 for full part, 1 for trailing part, +! 2 for leading part. +! PIV holds the name(s) of the pivot supervariable(s), ordered in the +! case of a tile pivot so that the first diagonal entry is nonzero. +! PIVOT As PIV, except that this holds the original names when one +! has been split. +! PIVT In the case of a structured pivot with unbalanced +! supervariables, +! PIVT is equal to whichever of PIVOT(1) and PIVOT(2) has more +! variables. Zero otherwise. +! RANK Upper bound for the rank. +! SHIFT Movement of current list after compress. +! THRESH Row counts greater than THRESH are lower bounds (fill-ins may +! have been ignored. +! LAST need not be set. During execution, it is used as follows: +! if JS is a supervariable that has not been eliminated or +! absorbed, LAST(JS) is the previous such supervariable having +! the same row count, or zero if JS is first in its list; +! otherwise, if NEXT(JS) < 0, LAST(JS) is one of the values +! NEXT(JS), NEXT(-NEXT(JS)), NEXT(-NEXT(-NEXT(JS))), ... +! IPR need not be set. During execution IPR(IR) is the first +! supervariable with row count IR or zero if there are none. +! FLAG is used as workspace for element and supervariable flags. +! if IS is a pivotal supervariable, FLAG(IS) = -1; +! if IS is a non-pivotal supervariable, FLAG(IS) >= 0; +! if IS is a supervariable involved in the current pivot row (other +! than in the pivot): +! for a full pivot: FLAG(IS) = 1 +! for a tile or oxo pivot: +! if in both rows, FLAG(IS) = 0 +! if in first row only, FLAG(IS) = 1 +! if in second row only, FLAG(IS) = 2 +! if IE is an element, FLAG(IE) < -1; +! if I is neither a supervariable nor an element, FLAG(I) = -1. +! LEAF need not be set. During execution, if IS is a supervariable, +! its +! final variable is LEAF(IS). LEAF(IS) is linked to IS through NEXT +! in a chain that covers the other variables of the supervariable. +! For an element IE to which the current supervariable IS belongs, +! LEAF(IE) holds the part to which the supervariable belongs. +! SVARS is used as workspace for the supervariables of the new +! element. +! .. Parameters .. + REAL (wp) :: zero + PARAMETER (zero=0E0_wp) +! .. +! .. Scalar Arguments .. + INTEGER, INTENT (IN) :: n, cntl + INTEGER, INTENT (INOUT) :: iwfr + INTEGER (long), INTENT (INOUT) :: lw + +! .. +! .. Array Arguments .. + INTEGER, INTENT (INOUT) :: ipe(n), nv(n) + INTEGER, DIMENSION (:), ALLOCATABLE, INTENT (INOUT) :: iw + INTEGER, INTENT (OUT) :: count(n), next(n) + + TYPE (mc68_info), INTENT (INOUT) :: info +! .. +! .. Local Scalars .. + + REAL (wp) :: cmin, cost + + INTEGER :: flg, flg1, ie, iel, ip, ir, irl, is, ithr, jp, jp1, jp2, & + jp3, jp4, js, k, k1, k2, ke, kind1, kp, kp1, kp2, ks, list, loop, & + ls, me, minf, minr, ml, mrows, ms, nel, nflg, np, np0, nrows, & + ns, nsvars, nvc, nvpiv, part, pivt, rank, shift, thresh + INTEGER (long) :: szw + LOGICAL :: bound +! .. +! .. Local Arrays .. + INTEGER :: nr(3), nsc(3), piv(2), pivot(2), icntl4 + INTEGER, ALLOCATABLE, DIMENSION (:) :: flag, ipr, last, leaf, svars + + TYPE (zb01_info) :: info_zb01 +! .. +! .. Intrinsic Functions .. + INTRINSIC abs, max, min, real, sign, sqrt + + IF (cntl<=1) THEN + icntl4 = 0 + ELSE + icntl4 = cntl + END IF + mrows = n + IF (icntl4>1) mrows = icntl4 + + ALLOCATE (flag(n),ipr(n),last(n),leaf(n),svars(n),STAT=info%stat) + IF (info%stat>0) THEN + info%flag = mc68_err_memory_alloc + RETURN + END IF + +! Create supervariables from variables with identical rows + CALL mc68_ma47_merge(n,ipe,iw,lw,nv,next,last,leaf,flag,count,svars) + +! Initializations + + thresh = int( max(sqrt(real(n,kind=wp)),3._wp) ) + rank = n + minf = 1 + minr = 1 + info%n_compressions = 0 + nflg = n*3 + nel = 0 + DO is = 1, n + ipr(is) = 0 + flag(is) = nflg + END DO + +! Link together supervariables having same row count + DO is = 1, n + k = ipe(is) + IF (k==0) THEN +! Row IS is identical to another row and has been absorbed. + flag(is) = -1 + ELSE + ir = iw(k) + IF (ir==0) THEN + rank = rank + nv(is) +! Treat zero block row as if it had nonzero diagonal entries. + nv(is) = -nv(is) + ir = 1 + END IF +! Store the row count and add the row to its linked list. + count(is) = ir + ns = ipr(ir) + IF (ns>0) last(ns) = is + next(is) = ns + ipr(ir) = is + last(is) = 0 + END IF + END DO + +! Start of main loop + DO ml = 1, n +! Leave loop if all variables have been eliminated. + IF (nel>=n) THEN + GO TO 280 + ELSE +! Find minimum row count + ir = minr + DO minr = ir, n + IF (ipr(minr)/=0) GO TO 10 + END DO +! Find next pivot. +10 DO ithr = 1, n +! Outer loop on ITHR needed in case of the threshold needing to +! be +! increased. + nrows = 0 + cmin = real(n,kind=wp)**2 + DO ir = minr, n + IF (minf<=ir) THEN +! Look for a full pivot + ms = ipr(ir) + DO list = 1, n + IF (ms==0) THEN + GO TO 20 +! If this is a full pivot, accept it or raise the +! threshold and try +! again. + ELSE IF (nv(ms)>0) THEN + GO TO 60 + ELSE + ms = next(ms) + END IF + END DO + GO TO 30 +20 minf = ir + 1 + END IF +! Look for a tile or oxo pivot with MS as its defective +! variable. +30 ms = ipr(ir) + DO list = 1, n + IF (ms==0) THEN + GO TO 50 + ELSE +! We need not look for a tile with MS as its non-defective +! variable +! because if the row count of its mate is IS, its M-cost +! is +! (IR+IS-3)*(IS-1) +! >= (IS-1)**2 since IR >= 2 +! >= (IR-1)**2 since IS >= IR +! Reduce NFLG by one to cater for this supervariable. + IF (nflg<=4) CALL mc68_ma47_reset(n,flag,nflg) + nrows = nrows + 1 + nflg = nflg - 1 + kp = ipe(ms) + kp1 = kp + 1 + kp2 = kp + iw(kp) + DO kp = kp1, kp2 + part = (iw(kp)-1)/n + ke = iw(kp) - part*n + IF (flag(ke)/=-1) THEN + IF (flag(ke)<=-2) THEN +! KE is an element touched by MS. + jp = ipe(ke) + IF (part==2) THEN +! Supervariable in leading part of element + jp1 = jp + 3 + iw(jp+1) + jp2 = jp + iw(jp) + ELSE +! Supervariable in trailing part of element + jp1 = jp + 3 + jp2 = jp + iw(jp) - iw(jp+2) + END IF + ELSE +! Supervariable MS is defective so cannot lie in +! full +! part of element +! We have reached the list of variables + jp1 = kp + jp2 = kp2 + END IF +! Search the variable list. + DO jp = jp1, jp2 + is = iw(jp) + IF (flag(is)>nflg) THEN +! This is the first time IS has been encountered +! in +! this search. + flag(is) = nflg + IF (nv(is)<0) THEN +! Potential oxo pivot + cost = real(count(is)-1,kind=wp)* & + real(ir-1,kind=wp) + ELSE +! Potential tile pivot + cost = real(ir+count(is)-3,kind=wp)* & + real(ir-1,kind=wp) + END IF + + IF (cost=mrows) THEN + GO TO 70 + ELSE + ms = next(ms) + END IF + END IF + END DO +! Exit loop no better pivot is possible. +50 IF (cmin<=real(ir,kind=wp)**2) GO TO 70 + END DO + GO TO 70 +60 IF (ir<=thresh) THEN + GO TO 90 + ELSE + GO TO 80 + END IF +70 ir = max(count(pivot(1)),count(pivot(2))) + IF (ir<=thresh) GO TO 100 +! Revise the threshold and repeat the choice of pivot. +80 CALL mc68_ma47_thresh(thresh,ir+n/10,n,ipe,iw,lw,count,nv,next, & + last,ipr,flag,nflg) + END DO + +! Accept full pivot +90 kind1 = 1 + me = ms + pivot(1) = ms + pivot(2) = ms + pivt = 0 + nvpiv = nv(ms) + cmin = real(ir-1,kind=wp)**2 + flag(ms) = -1 + nel = nel + nvpiv + GO TO 110 + +! Accept tile or oxo pivot +! PIVOT(2) cannot have greater row count than PIVOT(1). +100 kind1 = 2 + IF (nv(pivot(1))<0) kind1 = 3 + flag(pivot(1)) = -1 + flag(pivot(2)) = -1 + piv(1) = pivot(1) + piv(2) = pivot(2) + nvpiv = abs(nv(pivot(1))) + IF (nvpiv==abs(nv(pivot(2)))) THEN + pivt = 0 + ELSE + IF (nvpiv>abs(nv(pivot(2)))) THEN + pivt = pivot(1) + nvpiv = abs(nv(pivot(2))) + ELSE + pivt = pivot(2) + END IF +! Split PIVT + ms = leaf(pivt) + DO k = 2, nvpiv + ms = -next(ms) + END DO + leaf(ms) = leaf(pivt) + leaf(pivt) = -next(ms) +! PIVT remains as an active supervariable, but with less +! variables. + flag(pivt) = nflg + next(ms) = 0 + nv(pivt) = sign(abs(nv(pivt))-nvpiv,nv(pivt)) + nv(ms) = sign(nvpiv,nv(pivt)) + count(ms) = count(pivt) + IF (pivt==pivot(1)) THEN + piv(1) = ms + ELSE + piv(2) = ms + END IF + END IF + + me = piv(1) + nsc(2) = 0 + nvc = 0 + nel = nel + nvpiv*2 + +! Find variables of new element +110 nsvars = 0 + ir = 0 + DO loop = min(kind1,2), 1, -1 + ms = pivot(loop) + nsc(1) = nsvars + nr(1) = ir +! Remove chosen variable from linked list (unless it has been +! split). + IF (ms/=pivt) THEN + ns = next(ms) + ls = last(ms) + next(ms) = 0 + IF (ns>0) last(ns) = ls + IF (ls>0) THEN + next(ls) = ns + ELSE + ipr(count(ms)) = ns + END IF + END IF + +! Run through the list of the pivotal supervariable, setting +! tree +! pointers and constructing new list of supervariables. +! KP is a pointer to the current position in the old list. + kp = ipe(ms) + kp1 = kp + 1 + kp2 = kp + iw(kp) + DO kp = kp1, kp2 + part = (iw(kp)-1)/n + ke = iw(kp) - part*n + IF (flag(ke)/=-1) THEN + IF (flag(ke)<=-2) THEN +! KE is an element. +! Link KE or its ancestor to tree if not already linked. + ie = ke + DO list = 1, n + IF (next(ie)==0) THEN + GO TO 120 + ELSE + iel = ie + ie = -last(ie) + IF (ie==me) THEN + GO TO 130 + ELSE + last(iel) = -me + END IF + END IF + END DO +120 next(ie) = -me + last(ie) = -me +! Find the relevant part of the list of element KE. +130 jp = ipe(ke) + jp1 = jp + 3 + jp2 = jp + iw(jp) + IF (part/=0) THEN +! Supervariable in full part of element + IF (part==2) THEN +! Supervariable in leading part of element + jp1 = jp1 + iw(jp+1) + ELSE +! Supervariable in trailing part of element + jp2 = jp2 - iw(jp+2) + END IF + END IF + ELSE +! We have reached the list of variables + jp1 = kp + jp2 = kp2 + END IF + +! Search for different supervariables and add them to the +! new +! list. +! This loop is executed once for each element in the list +! and +! once +! for all the supervariables in the list. + DO jp = jp1, jp2 + is = iw(jp) + IF (flag(is)>loop) THEN +! IS is not a supervariable or has already been counted. + IF (flag(is)==2) THEN +! Supervariable in both rows of the block pivot + nvc = nvc + abs(nv(is)) + nsc(2) = nsc(2) + 1 + flag(is) = 0 + count(is) = count(is) - nvpiv + ELSE +! New supervariable + ir = ir + abs(nv(is)) + flag(is) = loop +! Store IS in new list. + nsvars = nsvars + 1 + svars(nsvars) = is +! Remove IS from row count linked list + ls = last(is) + last(is) = 0 + ns = next(is) + next(is) = 0 + IF (ns>0) last(ns) = ls + IF (ls>0) THEN + next(ls) = ns + ELSE + ipr(count(is)) = ns + END IF + count(is) = count(is) - nvpiv + END IF + END IF + END DO + + IF (jp2/=kp2 .AND. loop==1) THEN +! See if the pivot is covered by element KE. If so, +! element +! KE will +! be covered by the new element and is no longer needed. + IF (kind1/=1) THEN + DO jp = jp1, jp2 + IF (iw(jp)==pivot(2)) GO TO 140 + END DO + GO TO 150 +140 flag(ke) = -1 + GO TO 160 + ELSE IF (part==0) THEN + flag(ke) = -1 + END IF +150 CONTINUE + END IF + END IF +160 CONTINUE + END DO + END DO + + IF (kind1==1) THEN +! Complete calculation of counts for a full pivot. + nsc(2) = nsvars + nr(1) = ir + nsc(3) = 0 + nr(3) = 0 + ELSE +! Link PIV(2) into tree. + next(piv(2)) = -me + last(piv(2)) = -me + count(piv(2)) = -count(piv(2)) + IF (kind1==2) THEN +! Complete calculation of counts for a tile pivot. + nsc(3) = nsvars - nsc(1) + nr(3) = ir - nr(1) + nsc(2) = nsc(1) + nr(2) = nr(1) + nsc(1) = 0 + nr(1) = ir + ELSE +! Complete calculation of counts for an oxo pivot. + nsc(3) = nsvars - nsc(1) + nr(3) = ir - nr(1) + nvc + nsc(1) = nsc(1) - nsc(2) + nr(2) = nr(1) + nr(1) = ir +! Bring the variables of the leading part to the front. + k1 = 1 + DO k = 1, nsc(1) + nsc(2) + IF (flag(svars(k))==2) THEN + ks = svars(k) + svars(k) = svars(k1) + svars(k1) = ks + k1 = k1 + 1 + END IF + END DO + END IF + END IF + +! Deal with the case where the list of the new element has zero +! length. + IF (nsvars==0) THEN + ipe(me) = 0 + ELSE +! Run through new list of supervariables looking for elements +! that +! may be absorbed into the new element +! Reduce NFLG by one to cater for these tests. + IF (nflg<=4) CALL mc68_ma47_reset(n,flag,nflg) + nflg = nflg - 1 + DO k = 1, nsvars + is = svars(k) +! Run through the list associated with supervariable IS + kp = ipe(is) + kp1 = kp + 1 + kp2 = iw(kp) + kp + DO kp = kp1, kp2 + part = (iw(kp)-1)/n + ke = iw(kp) - n*part +! Exit if we have reached the list of supervariables + IF (flag(ke)>=0) THEN + GO TO 190 +! Cycle if this is a dummy or has already been checked + ELSE IF (flag(ke)/=-1) THEN + IF (flag(ke)/=-nflg) THEN + flag(ke) = -nflg + jp = ipe(ke) + jp1 = jp + 3 + jp2 = jp1 + iw(jp+1) + jp4 = jp + iw(jp) + jp3 = jp4 - iw(jp+2) + IF (kind1==1) THEN +! Check for inclusion in a new full element + DO jp = jp1, jp4 + IF (flag(iw(jp))>2) GO TO 180 + END DO + + ELSE IF (kind1==2) THEN +! Check for inclusion in a new tile element. +! Check the full part + DO jp = jp2, jp3 + IF (flag(iw(jp))>2) THEN + GO TO 180 + ELSE IF (flag(iw(jp))==1) THEN + GO TO 180 + END IF + END DO + flg1 = 0 +! Check the trailing part + DO jp = jp3 + 1, jp4 + flg = flag(iw(jp)) + IF (flg>2) THEN + GO TO 180 + ELSE IF (flg>0) THEN + flg1 = flg + END IF + END DO +! Check the leading part + DO jp = jp1, jp2 - 1 + flg = flag(iw(jp)) + IF (flg>2) THEN + GO TO 180 + ELSE IF (flg>0) THEN + IF (flg1/=0) GO TO 180 + END IF + END DO + ELSE + +! Check for inclusion in a new oxo element. +! Check the full part + DO jp = jp2, jp3 + IF (flag(iw(jp))>0) GO TO 180 + END DO + flg1 = 0 +! Check the trailing part + DO jp = jp3 + 1, jp4 + flg = flag(iw(jp)) + IF (flg>2) THEN + GO TO 180 + ELSE IF (flg>0) THEN + IF (flg1==0) flg1 = flg + IF (flg/=flg1) GO TO 180 + END IF + END DO + flg1 = 3 - flg1 +! Check the leading part + DO jp = jp1, jp2 - 1 + flg = flag(iw(jp)) + IF (flg>2) THEN + GO TO 180 + ELSE IF (flg>0) THEN + IF (flg1==3) flg1 = flg + IF (flg/=flg1) GO TO 180 + END IF + END DO + END IF +! Element KE is absorbed into new element ME. + flag(ke) = -1 +! Link KE or its ancestor to tree if not already linked. + ie = ke + DO list = 1, n + IF (next(ie)==0) THEN + GO TO 170 + ELSE + iel = ie + ie = -last(ie) + IF (ie==me) THEN + GO TO 180 + ELSE + last(iel) = -me + END IF + END IF + END DO +170 next(ie) = -me + last(ie) = -me + END IF + END IF +180 CONTINUE + END DO +190 CONTINUE + END DO + +! Run through new list of supervariables revising each +! associated +! list, +! recalculating row counts and removing duplicates. + DO loop = 1, kind1 +! Find the range to be treated and set flags appropriately. + IF (loop==1) THEN +! Treat middle block + k1 = 1 + nsc(1) + k2 = k1 + nsc(2) - 1 + + ELSE IF (loop==2) THEN +! Treat last block + k1 = k2 + 1 + k2 = nsvars + DO k = k1, k2 + is = svars(k) + IF (nv(is)/=0) flag(is) = nflg + END DO + ELSE + +! Treat first block + DO k = k1, k2 + is = svars(k) + IF (nv(is)/=0) flag(is) = 1 + END DO + k1 = 1 + k2 = nsc(1) + DO k = k1, k2 + is = svars(k) + IF (nv(is)/=0) flag(is) = nflg + END DO + END IF +! Run through the list of supervariables. + DO k = k1, k2 + is = svars(k) + bound = count(is) > thresh + IF (loop==1) nv(is) = abs(nv(is)) +! Reduce NFLG by one to cater for this supervariable. + IF (nflg<=4) CALL mc68_ma47_reset(n,flag,nflg) + nflg = nflg - 1 +! Begin with the row count of the new element. Its variables +! must always be counted during the row count calculation +! and they are already flagged with the value 0, 1, or 2. + ir = nr(loop) +! Run through the list associated with supervariable IS + kp = ipe(is) +! NP points to the next entry in the revised list. + np = kp + 1 + kp1 = kp + 1 + kp2 = iw(kp) + kp + DO kp = kp1, kp2 + part = (iw(kp)-1)/n + ke = iw(kp) - n*part + IF (flag(ke)<=-2) THEN +! KE is an element. Flag it. + flag(ke) = -nflg + IF ( .NOT. bound) THEN +! Store the part involved in preparation for the test +! for identical +! variables. + leaf(ke) = part +! Find the bounds for the search of the element list + jp = ipe(ke) + jp1 = jp + 3 + jp2 = jp + iw(jp) + IF (part/=0) THEN +! Supervariable in full part of element + IF (part==2) THEN +! Supervariable in leading part of element + jp1 = jp1 + iw(jp+1) + ELSE + +! Supervariable in trailing part of element + jp2 = jp2 - iw(jp+2) + END IF + END IF +! Search list of element KE, revising the row count +! when +! new +! variables found. + irl = ir + DO jp = jp1, jp2 + js = iw(jp) +! Cycle if JS has been eliminated or already +! counted. + IF (flag(js)>nflg) THEN + ir = ir + abs(nv(js)) + flag(js) = nflg + END IF + END DO +! KP need not be stored in the new list if it is +! linked +! to ME and KE +! made no contribution to the count. + IF (ir==irl .AND. last(ke)==-me) GO TO 200 + END IF +! Store KP in the new list + iw(np) = iw(kp) + np = np + 1 + + ELSE IF (flag(ke)>=0) THEN + GO TO 210 + END IF +200 CONTINUE + END DO + + np0 = np + GO TO 220 +! KE is a supervariable +210 CONTINUE +! Treat the rest of the list associated with supervariable +! IS. It consists entirely of supervariables. + np0 = np + kp1 = kp + DO kp = kp1, kp2 + ks = iw(kp) + IF (flag(ks)>nflg) THEN +! Add to row count, flag supervariable KS and add it to +! new list. + ir = ir + abs(nv(ks)) + flag(ks) = nflg + iw(np) = ks + np = np + 1 + END IF + END DO +220 IF (bound) ir = count(is) + IF (np>kp2) THEN +! List is longer than it was. Copy it to free space. + kp = ipe(is) + IF (np+iwfr-kp>=lw) THEN +! Compress IW + CALL mc68_ma47_compress(n,ipe,flag,iw,iwfr-1,iwfr, & + info%n_compressions) + IF (np+iwfr-kp>=lw) THEN +! Expand the length of iw + szw = lw + lw = np + iwfr - kp + 1 + CALL zb01_resize1(iw,szw,lw,info_zb01) + IF (info_zb01%flag<0) THEN + IF (info_zb01%flag==-11) THEN + info%flag = mc68_err_memory_alloc + info%stat = info_zb01%stat + ELSE IF (info_zb01%flag==-12) THEN + info%flag = mc68_err_memory_dealloc + info%stat = info_zb01%stat + ELSE IF (info_zb01%flag<-12) THEN + info%flag = mc68_err_zb01 + info%iostat = info_zb01%iostat + info%zb01_info = info_zb01%flag + END IF + RETURN + END IF + END IF + + shift = ipe(is) - kp + kp = kp + shift + kp2 = kp2 + shift + np = np + shift + np0 = np0 + shift + END IF + + np = np + iwfr - kp + np0 = np0 + iwfr - kp + ipe(is) = iwfr + kp1 = kp + DO kp = kp1, kp2 + iw(iwfr) = iw(kp) + iwfr = iwfr + 1 + END DO + iw(iwfr) = 0 + iwfr = iwfr + 1 + END IF +! Move first supervariable to end of list, move first +! element +! to end +! of element part of list and add new element to front of +! list. + iw(np) = iw(np0) + kp = ipe(is) + iw(np0) = iw(kp+1) + iw(kp+1) = me + (loop-1)*n +! Store the new length of the list. + iw(kp) = np - kp + IF (ir==0) THEN +! Treat zero row as if it had a nonzero diagonal block + ir = -nv(is) + nv(is) = ir + rank = rank - ir + ir = 1 + END IF + +! Unless the Markowitz cost is zero (which means that rows +! not +! previously identical cannot be identical now) or the row +! count is +! above the threshold, check whether row IS is identical to +! another by +! looking in the linked list of supervariables with row +! count +! IR at +! those whose lists have first entry ME and occur in the +! same +! part +! of it. Note that those containing ME come first so the +! search can +! be terminated when a list not starting with ME is found. + IF (cmin/=zero) THEN + IF (ir<=thresh) THEN + js = ipr(ir) + DO list = 1, n + IF (js<=0) THEN + GO TO 260 + ELSE + kp = ipe(js) + IF (iw(kp+1)/=me+(loop-1)*n) THEN + GO TO 260 + ELSE +! JS has same row count and is active. Check if +! identical to IS. + IF (sign(1,nv(js))==sign(1,nv(is))) THEN + kp1 = kp + DO kp = kp1 + 2, kp1 + iw(kp1) + part = (iw(kp)-1)/n + ie = iw(kp) - part*n +! Jump if IE (which may be a +! supervariable or an element) +! is not in the list of IS. + IF (abs(flag(ie))>nflg) THEN + GO TO 230 +! Jump if JS belongs to another part +! of IE + ELSE IF (flag(ie)==-nflg) THEN + IF (part/=leaf(ie)) GO TO 230 + END IF + END DO + GO TO 240 + END IF + +230 js = next(js) + END IF + END IF + END DO + GO TO 250 + +240 CONTINUE +! Supervariable amalgamation. Row IS is identical to row +! JS. Regard all variables in the two supervariables as +! being in IS. Set tree pointer, FLAG and NV entries. +250 ipe(js) = 0 + nv(is) = nv(is) + nv(js) + nv(js) = 0 + flag(js) = -1 +! Replace JS by IS in linked list. + ns = next(js) + ls = last(js) + IF (ns>0) last(ns) = is + IF (ls>0) next(ls) = is + last(is) = ls + next(is) = ns + IF (ipr(ir)==js) ipr(ir) = is + count(is) = ir + next(js) = -leaf(is) + leaf(is) = leaf(js) + last(js) = -is + GO TO 270 + END IF + END IF +! Insert IS into linked list of supervariables of same row +! count. +260 ns = ipr(ir) + IF (ns>0) last(ns) = is + next(is) = ns + ipr(ir) = is + last(is) = 0 + minr = min(minr,ir) + IF (nv(is)>0) minf = min(minf,ir) + count(is) = ir +270 CONTINUE + END DO + END DO + +! Reset flags for supervariables in newly created element, +! remove those absorbed into others, and store the new list. + IF (iwfr+nsvars+3>=lw) THEN +! Compress IW + CALL mc68_ma47_compress(n,ipe,flag,iw,iwfr-1,iwfr, & + info%n_compressions) + IF (iwfr+nsvars+3>=lw) THEN + szw = lw + lw = iwfr + nsvars + 4 + CALL zb01_resize1(iw,szw,lw,info_zb01) + IF (info_zb01%flag<0) THEN + IF (info_zb01%flag==-11) THEN + info%flag = mc68_err_memory_alloc + info%stat = info_zb01%stat + ELSE IF (info_zb01%flag==-12) THEN + info%flag = mc68_err_memory_dealloc + info%stat = info_zb01%stat + ELSE IF (info_zb01%flag<-12) THEN + info%flag = mc68_err_zb01 + info%iostat = info_zb01%iostat + info%zb01_info = info_zb01%flag + END IF + RETURN + END IF +! GO TO 280 + ELSE + END IF + END IF + + ip = iwfr + iwfr = iwfr + 3 + k2 = 0 + DO loop = 1, 3 + k1 = k2 + 1 + k2 = k1 + nsc(loop) - 1 + DO k = k1, k2 + is = svars(k) + IF (nv(is)==0) THEN + nsc(loop) = nsc(loop) - 1 + ELSE + flag(is) = nflg + iw(iwfr) = is + iwfr = iwfr + 1 + END IF + END DO + END DO + iw(ip) = iwfr - ip - 1 + iw(ip+1) = nsc(1) + iw(ip+2) = nsc(3) + flag(me) = -nflg +! Set pointer for new element. + ipe(me) = ip + END IF + END IF + END DO + +280 IF (rank0) THEN + info%flag = mc68_err_memory_dealloc + RETURN + END IF + +END SUBROUTINE mc68_ma47_analyse + +SUBROUTINE mc68_ma47_treesearch(n,father,count,ne,perm,nemin,info) +! Given the tree provided by MC68_MA47_ANALYSE/KD, which has a node +! for every +! variable, perform depth-first search to find pivot order and +! construct a new tree whose nodes correspond to block eliminations, +! and whose depth-first-search post ordering is 1,2,...,NODES. + +! N must be set to the matrix order. It is not altered. +! FATHER(I) must be set equal to -(father of node I) in the given tree +! or zero if node I is a root. It is altered to point to its next +! younger brother if it has one. Finally, it is set to the father +! of node I in the new tree, or NODES+1 if node I is a root. +! COUNT(I) must be set to the row count at the time of elimination if +! I +! is a node at which an elimination takes place, negated for the +! second node of a tile or oxo pivot. It is revised for a node at +! which an amalgamaton occurs, but is otherwise unchanged. +! NE(I) must be set to the number of variables eliminated at node I, +! negated for a defective variable. It is revised for a node at +! which an amalgamaton occurs, but is otherwise unchanged. +! PERM need not be set. + +! Local variables +! SON(I) need not be set. It is used to hold +! (eldest son of node I) if it has one and 0 otherwise. +! NODE(I) need not be set. It is used temporarily to hold the row +! count of the secondary variable of a tile or oxo , -1 for a +! node merged into its father and 0 otherwise. It is finally +! set to hold the elimination stage of variable I, negated for a +! defective variable. +! NA need not be set. NA(I) is used temporarily to hold the next +! younger +! brother of node I if it has one or -(father) if it does not. +! NA(STAGE) and NA(LEVEL) are used to hold the numbers of elements +! assembled at stage STAGE and level LEVEL of the elimination. +! MARK need not be set. The indices of the root nodes are stored in +! MARK(I), I=NR,N. MARK(STAGE) eventually is set to the Markowitz +! cost at stage STAGE of the elimination. +! NODES need not be set. It is set to the number of elimination steps. +! ICNTL must be set by the user as follows and is not altered. The +! only entry used is +! ICNTL(6) Two nodes of the assembly tree are merged only if both +! involve less than ICNTL(6) eliminations. +! COUNT2 Row count of the second row of a tile or oxo. +! I Index of current tree node. +! IBRTHR Brother of node I. +! IFATHR Father of node I. +! ISON Son of node I. +! J Temporary variable. +! K Position in elimination sequence +! L Temporary variable. +! LDIAG Control for amount of information output. +! LEVEL holds the current tree level. Roots are at level N, their sons +! are at level N-1, etc. +! MP Stream number for warnings and diagnostics. +! NDE Do index when looping through new tree. +! NEMIN is used to control the amalgamation process between +! a son and its father (if the number of fully summed +! variables of both nodes is smaller than NEMIN). +! NST Number of structured pivots in the active chain of the +! depth-first search. +! NR Position of next root. +! NRL The indices of the root nodes are stored in MARK(I), I=NRL,N. +! NVPIV holds the number of variables in the pivot (each half in the +! case of an oxo). +! PERM1(LEVEL) is used temporarily to hold the node at level LEVEL of +! the +! active chain. PERM1(K) is eventually set to the variable that is in +! position K of the elimination. +! STAGE holds the current elimination stage. +! Set local print variables +! .. Scalar Arguments .. + INTEGER, INTENT (IN) :: n, nemin +! .. +! .. Array Arguments .. + INTEGER, INTENT (INOUT) :: count(n), father(n), ne(n) + INTEGER, INTENT (OUT) :: perm(n) + TYPE (mc68_info), INTENT (INOUT) :: info +! .. +! .. Local Scalars .. + INTEGER :: count2, i, ibrthr, ifathr, ison, j, k, l, ldiag, level, mp, & + nr, nrl, nst, nvpiv, stage + INTEGER, ALLOCATABLE, DIMENSION (:) :: mark, na, node, son, perm1 +! .. + mp = -1 + ldiag = 0 + IF (mp<=0) ldiag = 0 + + + ALLOCATE (mark(n),na(n),node(n),son(n),perm1(n),STAT=info%stat) + IF (info%stat>0) THEN + info%flag = mc68_err_memory_alloc + RETURN + END IF + + +! Set SON(I) to (eldest son of node I) and NA(I) to next younger +! brother of node I if it has one or -(father) if it does not. +! Find the root nodes. +! Load all the eliminations of any oxo and tile pivot on its first +! node and store the second count in NODE. + DO i = 1, n + son(i) = 0 + node(i) = 0 + END DO + nrl = n + 1 + DO i = 1, n + ifathr = -father(i) + na(i) = -ifathr + IF (ifathr==0) THEN +! We have a root + nrl = nrl - 1 + mark(nrl) = i + ELSE + ibrthr = son(ifathr) +! If node I has a next younger brother, set pointer to him. + IF (ibrthr>0) na(i) = ibrthr +! Set father-to-eldest-son pointer + son(ifathr) = i + IF (count(i)<0) THEN +! Second node of tile or oxo. Load the eliminations on the first +! node +! and store the second count. + ne(ifathr) = ne(ifathr)*2 + ne(i) = 0 + node(ifathr) = -count(i) + END IF + END IF + END DO + +! Depth-first search looking for father-son pairs that can be merged. +! Adjust NE, COUNT, and NODE to correspond. +! PERM1(LEVEL) is used temporarily to hold the node at level +! LEVEL of the active chain. + nr = nrl + i = 0 + DO k = 1, n + IF (i<=0) THEN +! Pick up next root. + i = mark(nr) + nr = nr + 1 + level = n + nst = 0 + perm1(level) = i + END IF +! Go to son for as long as possible, clearing father-son pointers +! in SON as each is used. + DO l = 1, n + IF (son(i)<=0) THEN + GO TO 10 + ELSE + ison = son(i) + son(i) = 0 + i = ison + IF (node(i)/=0) nst = nst + 1 + level = level - 1 + perm1(level) = i + END IF + END DO +! Jump if node has no eliminations +10 nvpiv = ne(i) + IF (nvpiv/=0) THEN +! Jump if at a root. + IF (level/=n) THEN + ifathr = perm1(level+1) + IF (node(i)/=0 .OR. node(ifathr)/=0) THEN + IF (node(i)==0 .OR. node(ifathr)==0) THEN + GO TO 20 + ELSE + IF (nvpiv>0 .AND. ne(ifathr)>0) THEN +! Both nodes are tiles. +! Do not merge if this would cause fill. + IF (node(i)-nvpiv/2/=node(ifathr)) THEN + GO TO 20 + ELSE IF (count(i)-nvpiv/=count(ifathr)) THEN + GO TO 20 + END IF + ELSE IF (nvpiv<0 .AND. ne(ifathr)<0) THEN +! Both nodes are oxos. + nvpiv = -nvpiv/2 +! Do not merge unless sure that this would not cause fill. + IF (node(i)-nvpiv/=node(ifathr)) THEN + GO TO 20 + ELSE IF (count(i)-nvpiv/=count(ifathr)) THEN + GO TO 20 + ELSE IF (count(i)==node(i)) THEN + GO TO 20 + END IF + ELSE + GO TO 20 + END IF +! Merge two tiles or two oxos. + node(ifathr) = node(i) + nst = nst - 1 + END IF +! Both nodes are full +! Merge the nodes if this would cause no more fill + ELSE IF (count(i)-nvpiv/=count(ifathr)) THEN +! Do not merge the nodes if there is a structured pivot on +! path +! to root + IF (nst>0) THEN + GO TO 20 +! Do not merge the nodes if either node has more than NEMIN +! eliminations + ELSE IF (nvpiv>=nemin) THEN + GO TO 20 + ELSE IF (ne(ifathr)>=nemin) THEN + GO TO 20 + END IF + END IF +! Merge the two nodes + ne(ifathr) = ne(ifathr) + ne(i) + ne(i) = 0 + IF (ldiag>4) WRITE (mp,fmt='(A,2I5)') ' Merging nodes', i, & + ifathr + count(ifathr) = count(ifathr) + nvpiv + node(i) = -1 + END IF + END IF +! Go to next brother, or failing this to the father. +20 ibrthr = na(i) + IF (node(i)>0) nst = nst - 1 + IF (ibrthr>0) THEN +! Node I has a younger brother. Go to him. + perm1(level) = ibrthr + i = ibrthr + IF (node(i)>0) nst = nst + 1 + ELSE +! Go to father of node I + level = level + 1 + i = -ibrthr + END IF + END DO + DO i = 1, n + son(i) = 0 + END DO + +! Set SON(I) to (eldest son of node I) and NA(I) to next younger +! brother of node I if it has one or -(father) if it does not. + DO i = 1, n + ifathr = -father(i) + na(i) = -ifathr + IF (ifathr/=0) THEN + ibrthr = son(ifathr) +! If node I has a next younger brother, set pointer to him. + IF (ibrthr>0) na(i) = ibrthr +! Set father-to-son pointer + son(ifathr) = i + END IF + END DO + +! Depth-first search in which FATHER is revised to accord with the +! merges. PERM1(LEVEL) is used temporarily to hold the node at level +! LEVEL of the active chain. + i = 0 + nr = nrl + DO k = 1, n + IF (i<=0) THEN +! Pick up next root. + i = mark(nr) + nr = nr + 1 + level = n + perm1(n) = i + END IF +! Go to son for as long as possible, clearing father-son pointers +! in SON as each is used. + DO l = 1, n + IF (son(i)<=0) THEN + GO TO 30 + ELSE + ison = son(i) + son(i) = 0 + i = ison + father(i) = -perm1(level) + IF (node(i)>=0) THEN + level = level - 1 + perm1(level) = i + END IF + END IF + END DO + +! Go to next brother, or failing this to the father. +30 ibrthr = na(i) + IF (ibrthr>0) THEN +! Node I has a younger brother. Go to him. + IF (node(i)<0) level = level - 1 + i = ibrthr + perm1(level) = i + father(i) = -perm1(level+1) + IF (node(i)<0) level = level + 1 + ELSE +! Go to father of node I + IF (node(i)>=0) level = level + 1 + i = -ibrthr + END IF + END DO + +! Set SON(I) to (eldest son of node I) and FATHER(I) to next younger +! brother of node I if it has one. + DO i = 1, n + son(i) = 0 + END DO +! First pass is for nodes without eliminations. + DO i = 1, n + IF (ne(i)==0 .AND. count(i)>=0) THEN + ifathr = -father(i) + ibrthr = son(ifathr) +! If node I has a next younger brother, set pointer to him. + IF (ibrthr>0) father(i) = ibrthr +! Set father-to-eldest-son pointer + son(ifathr) = i + END IF + END DO + +! Second pass is for second nodes of tile and oxo pivots. + DO i = 1, n + IF (count(i)<0) THEN + ifathr = -father(i) + ibrthr = son(ifathr) +! If node I has a next younger brother, set pointer to him. + IF (ibrthr>0) father(i) = ibrthr +! Set father-to-eldest-son pointer + son(ifathr) = i + END IF + END DO + +! Third pass is for elimination nodes. + DO i = 1, n + IF (ne(i)/=0) THEN + ifathr = -father(i) + IF (ifathr/=0) THEN + ibrthr = son(ifathr) +! If node I has a next younger brother, set pointer to him. + IF (ibrthr>0) father(i) = ibrthr +! Set father-to-son pointer + son(ifathr) = i + END IF + END IF + END DO + +! Depth-first search. +! STAGE holds the current elimination stage. The number +! of assemblies for nodes of the active chain is accumulated +! temporarily in NA(LEVEL), for tree level N, N-1,..., and is +! transfered to NA(STAGE) when we reach the appropriate stage STAGE. + stage = 1 +! I is the current node. + i = 0 + nr = nrl + DO k = 1, n + IF (i<=0) THEN +! Pick up next root. + i = mark(nr) + nr = nr + 1 + level = n + na(n) = 0 + END IF +! Go to son for as long as possible, clearing father-son pointers +! in SON as each is used and setting NA(LEVEL)=0 for all levels +! reached. + l = level + DO level = l, 1, -1 + IF (son(i)<=0) THEN + GO TO 40 + ELSE + ison = son(i) + son(i) = 0 + i = ison + na(level-1) = 0 + END IF + END DO +! Record variable in position I in the order. +40 perm1(k) = i + count2 = node(i) + node(i) = stage +! Jump if node has no eliminations + IF (ne(i)/=0) THEN + IF (level0) THEN +! Tile pivot + DO j = k - ne(i) + 1, k - ne(i)/2 + node(perm1(j)) = -node(perm1(j)) + END DO + mark(stage) = (count(i)+count2-3)*(count2-1) + ELSE +! Oxo pivot + DO j = k + ne(i) + 1, k + node(perm1(j)) = -node(perm1(j)) + END DO + mark(stage) = (count(i)-1)*(count2-1) + END IF + stage = stage + 1 + END IF +! Go to next brother, or failing this to the father. + ibrthr = father(i) + IF (ibrthr>0) THEN +! Node I has a younger brother. Go to him. + na(level) = 0 + i = ibrthr + ELSE +! Go to father of node I + level = level + 1 + ison = i + i = -ibrthr + END IF + END DO + +! Search for 2x2 pivots + i = 1 + DO WHILE (i0) THEN + i = i + 1 + ELSE + perm1(i) = -perm1(i) + perm1(i+1) = -perm1(i+1) + i = i + 2 + END IF + END DO + DO i = 1, n + IF (perm1(i)>0) THEN + perm(perm1(i)) = i + ELSE + perm(-perm1(i)) = -i + END IF + END DO + + DEALLOCATE (mark,na,node,son,perm1,STAT=info%stat) + IF (info%stat>0) THEN + info%flag = mc68_err_memory_dealloc + RETURN + END IF + + +END SUBROUTINE mc68_ma47_treesearch + +SUBROUTINE mc68_ma47_merge(n,ipe,iw,lw,nv,next,last,leaf,flag,var,svar) + +! Merge variables whose rows are identical into supervariables. This +! is done by updating the supervariable structure for the submatrix +! of the first J-1 columns to that for the first J columns, +! J=1,2,...,N. If a nontrivial supervariable IS is involved in +! column J, all of its variables that are involved in column J are +! removed to make a new supervariable. + +! N must be set to the matrix order. It is not altered. +! IPE(I) must be set to the position in IW of the list for row I, +! I=1,N. On return, it is unchanged except that if I is a variable +! that has been absorbed into a supervariable, IPE(I) = 0. +! IW must be set on entry to hold lists of entries by rows, each list +! being headed by its length. There must be no duplicate indices +! in a list. IW is not altered. +! LW must be set to the length of IW. It is not altered. +! NV must be set on entry so that NV(I) = 1 for a nondefective +! variable +! (nonzero diagonal entry) and NV(I) = -1 otherwise, I = 1,..., N. +! On return: +! if I is a variable that has been absorbed, NV(I) = 0; +! if I is a supervariable, NV(I) holds its number of variables, +! negated for a defective supervariable. +! NEXT need not be set. During execution, NEXT(I) is the next +! variable in a circular list of variables in a supervariable. +! On return, if variable I has been absorbed and J is the next +! variable in its supervariable, NEXT(I)=-J; +! LAST need not be set. During execution, LAST(I) is the previous +! variable in a circular list of variables in a supervariable. +! On return, if variable I has been absorbed and J is the next +! variable in its supervariable, LAST(I)=-J; +! LEAF need not be set. On return, if IS is a supervariable, LEAF(IS) +! holds its first variable. +! FLAG is used as workspace for supervariable flags. If IS has already +! been encountered in column J, FLAG(IS) = J. +! VAR is used as workspace. If IS is a supervariable involved in +! column +! J, VAR(IS) is the first variable to be removed from supervariable +! IS. If IS is not a supervariable, VAR(IS) is the next free +! supervariable index in a chain of such indices. +! SVAR is used as workspace. SVAR(I) is the supervariable to which I +! belongs. + +! Local variables + +! FREE The first free supervariable index (head of chain) +! I Row index. +! IS Supervariable. +! JS Supervariable. +! J Column index. +! K DO index. +! KK Temporary variable. +! LS Last (previous) variable in circular list. +! NS Next variable in circular list. + +! Begin by setting SVAR, LAST, and NEXT to represent all variables +! belonging to supervariable 1. Also initialize FLAG and set +! FREE and VAR as a chain of indices that are free for use as +! supervariable names. +! .. Scalar Arguments .. + INTEGER (long), INTENT (IN) :: lw + INTEGER, INTENT (IN) :: n +! .. +! .. Array Arguments .. + INTEGER, INTENT (IN) :: iw(lw) + INTEGER, INTENT (INOUT) :: ipe(n), nv(n) + INTEGER, INTENT (OUT) :: flag(n), last(n), leaf(n), next(n), svar(n), & + var(n) +! .. +! .. Local Scalars .. + INTEGER :: free, i, is, j, js, k, kk, ls, ns +! .. +! .. Intrinsic Functions .. + INTRINSIC sign +! .. + DO i = 1, n + svar(i) = 1 + last(i) = i - 1 + next(i) = i + 1 + flag(i) = 0 + var(i) = i + 1 + END DO + last(1) = n + next(n) = 1 + free = 2 + +! Scan the columns in turn, splitting the supervariables that are +! involved. + DO j = 1, n + kk = ipe(j) + DO k = kk + 1, kk + iw(kk) + i = iw(k) + is = svar(i) + IF (flag(is)/=j) THEN +! First occurrence of supervariable IS for column J + flag(is) = j + IF (next(i)/=i) THEN +! No action needed since IS has I as its only variable. +! Establish new supervariable + js = free + free = var(js) + var(is) = i + svar(i) = js +! Remove I from old circular list + ns = next(i) + ls = last(i) + next(ls) = ns + last(ns) = ls +! Make new circular list + next(i) = i + last(i) = i + END IF + ELSE +! Subsequent occurrence of IS for column J +! Remove I from old circular list + IF (next(i)==i) THEN +! Supervariable now empty + ns = var(is) + var(is) = free + free = is + ELSE + ns = next(i) + ls = last(i) + next(ls) = ns + last(ns) = ls + ns = var(is) + END IF +! Add I to new list + ls = last(ns) + next(ls) = i + next(i) = ns + last(ns) = i + last(i) = ls + svar(i) = svar(ns) + END IF + END DO + END DO + +! Set the data in final format. + DO is = 1, n + leaf(is) = is +! No action for a trivial supervariable + IF (last(is)/=is) THEN +! No action if already treated + IF (last(is)>=0) THEN +! IS is a nontrivial supervariable + ls = last(is) + leaf(is) = ls + DO k = 1, n + i = ls + IF (i==is) THEN + GO TO 10 + ELSE + ipe(i) = 0 + ls = last(i) + next(i) = -ls + last(i) = -ls + nv(i) = 0 + END IF + END DO +10 nv(is) = sign(k,nv(is)) + END IF + END IF + END DO +END SUBROUTINE mc68_ma47_merge + +SUBROUTINE mc68_ma47_reset(n,flag,nflg) +! Reset flag values to +/- N*3. +! N Matrix order. Unchanged. +! FLAG Unchaged if FLAG(I) = -1, 0, 1, or 2. +! Otherwise, reset to +/- N*3. + +! .. Scalar Arguments .. + INTEGER, INTENT (IN) :: n + INTEGER, INTENT (OUT) :: nflg +! .. +! .. Array Arguments .. + INTEGER, INTENT (INOUT) :: flag(n) +! .. +! .. Local Scalars .. + INTEGER :: i, n3 +! .. + n3 = n*3 + DO i = 1, n + IF (flag(i)>2) flag(i) = n3 + IF (flag(i)<=-2) flag(i) = -n3 + END DO + nflg = n3 +END SUBROUTINE mc68_ma47_reset + +SUBROUTINE mc68_ma47_thresh(thresh,newthr,n,ipe,iw,lw,count,nv,next, & + last,ipr,flag,nflg) +! Alter the threshold for calculation of row counts. + +! THRESH Old threshold. Changed to NEWTHR. +! NEWTHR New threshold. It is not altered. +! N must be set to the matrix order. It is not altered. +! IPE(I) must be set to the position in IW of the list for row I, +! I=1,N. +! It is not altered. +! IW must be set on entry to hold lists of entries by rows, each list +! being headed by its length. It is not altered. +! LW must be set to the length of IW. It is not altered. +! COUNT is used to hold the row counts in the reduced matrix. +! COUNT(IS) is recalculated if THRESH < COUNT(IS) <= NEWTHR. +! NV: if JS is a supervariable, NV(JS) holds its number of variables, +! negated for a defective supervariable. It is not altered. +! NEXT: if JS is a supervariable that has not been eliminated or +! absorbed, NEXT(JS) is the next such supervariable having the +! same row count, or zero if JS is last in its list. Revised +! if a recalculated row count makes it necessary. +! LAST: if JS is a supervariable that has not been eliminated or +! absorbed, LAST(JS) is the previous such supervariable having +! the same row count, or zero if JS is last in its list. +! Revised if a recalculated row count makes it necessary. +! IPR: IPR(IR) is the first supervariable with row count IR or zero +! if there are none. Revised if a recalculated row count makes it +! necessary. +! FLAG: if IS is a supervariable, FLAG(IS) >= 0; +! if IE is an element, FLAG(IE) < -1; +! if I is neither a supervariable nor an element, FLAG(I) = -1. +! The values of the supervariable flags may change while remaining +! positive. Otherwise, unchanged. +! NFLG is used for the current flag value in array FLAG, as in +! MC68_MA47_ANALYSE. +! Local variables + +! .. Scalar Arguments .. + INTEGER (long), INTENT (IN) :: lw + INTEGER, INTENT (IN) :: n, newthr + INTEGER, INTENT (INOUT) :: nflg, thresh +! .. +! .. Array Arguments .. + INTEGER, INTENT (IN) :: ipe(n), iw(lw), nv(n) + INTEGER, INTENT (INOUT) :: count(n), flag(n), ipr(n), last(n), next(n) +! .. +! .. Local Scalars .. + INTEGER :: ir, is, jp, jp1, jp2, k, ke, kp, kp2, ls, ms, ns, part +! .. +! .. +! .. Intrinsic Functions .. + INTRINSIC abs +! .. + DO ms = 1, n + IF (flag(ms)>=0) THEN + IF (count(ms)>thresh) THEN + IF (count(ms)<=newthr) THEN +! Find the row count afresh + ir = 0 + IF (nflg<=4) CALL mc68_ma47_reset(n,flag,nflg) +! Reduce NFLG by one to cater for this supervariable. + nflg = nflg - 1 + k = ipe(ms) + kp2 = k + iw(k) + DO kp = k + 1, kp2 + part = (iw(kp)-1)/n + ke = iw(kp) - part*n + IF (flag(ke)/=-1) THEN + IF (flag(ke)<=-2) THEN +! KE is an element. + jp = ipe(ke) + jp1 = jp + 3 + jp2 = jp + iw(jp) + IF (part/=0) THEN +! Supervariable in full part of element + IF (part==2) THEN +! Supervariable in leading part of element + jp1 = jp1 + iw(jp+1) + ELSE +! Supervariable in trailing part of element + jp2 = jp2 - iw(jp+2) + END IF + END IF + ELSE +! We have reached the list of variables + jp1 = kp + jp2 = kp2 + END IF +! Search the variable list. + DO jp = jp1, jp2 + is = iw(jp) + IF (flag(is)>nflg) THEN + flag(is) = nflg + ir = ir + abs(nv(is)) + END IF + END DO + IF (jp2==kp2 .OR. ir>newthr) GO TO 10 + END IF + END DO +10 IF (ir/=count(ms)) THEN +! Remove MS from linked list + ns = next(ms) + ls = last(ms) + next(ms) = 0 + IF (ns>0) last(ns) = ls + IF (ls>0) THEN + next(ls) = ns + ELSE + ipr(count(ms)) = ns + END IF +! Insert MS into linked list of supervariables of same row +! count. + ns = ipr(ir) + IF (ns>0) last(ns) = ms + next(ms) = ns + ipr(ir) = ms + last(ms) = 0 + count(ms) = ir + END IF + END IF + END IF + END IF + END DO + thresh = newthr +END SUBROUTINE mc68_ma47_thresh + +SUBROUTINE mc68_ma47_compress(n,ipe,flag,iw,lw,iwfr,ncmpa) +! Compress lists held by MC68_MA47_ANALYSE and MA47KD in IW, removing +! inactive +! variables from element lists. Adjust pointers in IPE to correspond. +! N is the matrix order. It is not altered. +! IPE(I) points to the position in IW of the start of list I or is +! zero if there is no list I. On exit it points to the new position. +! FLAG holds element and supervariable flags: +! if IS is an active supervariable, FLAG(IS) >= 0; +! if IS is inactive, FLAG(IS) = -1; +! if IE is an element, FLAG(IE) < -1; +! It is not altered. +! IW holds the lists, each headed by its length. Every entry must be +! nonnegative. On output, the same lists are held, but they are +! now compressed together. +! LW holds the length of IW. It is not altered. +! IWFR need not be set on entry. On exit it points to the first free +! location in IW. + +! Local variables +! I Row index. +! IR DO index. +! K Temporary variable. +! L Temporary variable. +! LEN1 Length of the leading zero part of element list +! LEN2 Length of the middle part of element list +! LEN3 Length of the trailing zero part of element list +! LWFR points just beyond the end of the uncompressed file. + +! .. Scalar Arguments .. + INTEGER, INTENT (IN) :: lw, n + INTEGER, INTENT (INOUT) :: ncmpa + INTEGER, INTENT (OUT) :: iwfr +! .. +! .. Array Arguments .. + INTEGER, INTENT (IN) :: flag(n) + INTEGER, INTENT (INOUT) :: ipe(n), iw(lw) +! .. +! .. Local Scalars .. + INTEGER :: i, ir, k, l, len1, len2, len3, lwfr +! .. + ncmpa = ncmpa + 1 +! Prepare for compressing by storing the lengths of the lists in IPE +! and +! setting the first entry of each list to -(list number). + DO i = 1, n + l = ipe(i) + IF (l>0 .AND. flag(i)/=-1) THEN + ipe(i) = iw(l) + iw(l) = -i + END IF + END DO + +! Compress +! IWFR points just beyond the end of the compressed file. + iwfr = 1 + lwfr = 1 + DO ir = 1, n +! Search for the next negative entry. + DO k = lwfr, lw + IF (iw(k)<0) GO TO 10 + END DO + RETURN +! Pick up entry number, store length in new position, set new +! pointer +! and prepare to copy list. +10 i = -iw(k) + iw(iwfr) = ipe(i) + ipe(i) = iwfr + iwfr = iwfr + 1 + IF (flag(i)<=-2) THEN +! We have an element list. Remove dummy entries. + l = iwfr - 1 + len1 = iw(k+1) + iw(l+1) = len1 + len3 = iw(k+2) + iw(l+2) = len3 + len2 = iw(l) - len1 - len3 - 2 + iwfr = l + 3 + DO lwfr = k + 3, k + 2 + len1 + IF (flag(iw(lwfr))<0) THEN + iw(l+1) = iw(l+1) - 1 + iw(l) = iw(l) - 1 + ELSE + iw(iwfr) = iw(lwfr) + iwfr = iwfr + 1 + END IF + END DO + + k = lwfr + DO lwfr = k, k - 1 + len2 + IF (flag(iw(lwfr))<0) THEN + iw(l) = iw(l) - 1 + ELSE + iw(iwfr) = iw(lwfr) + iwfr = iwfr + 1 + END IF + END DO + + k = lwfr + DO lwfr = k, k - 1 + len3 + IF (flag(iw(lwfr))<0) THEN + iw(l+2) = iw(l+2) - 1 + iw(l) = iw(l) - 1 + ELSE + iw(iwfr) = iw(lwfr) + iwfr = iwfr + 1 + END IF + END DO + ELSE +! Copy list to new position. + DO lwfr = k + 1, k + iw(iwfr-1) + iw(iwfr) = iw(lwfr) + iwfr = iwfr + 1 + END DO + END IF + END DO + +END SUBROUTINE mc68_ma47_compress + +SUBROUTINE amdd(n,iwlen,pe,pfree,len,iw,elen,icntl,info) + +! ------------------------------------------------------------------- +! AMDD is a modified version of MC47 version 1. Dense rows are detected +! and removed. AMDD is then applied to the remaining matrix. The dense rows are +! then appended to the end of this ordering. + +! We use the term Le to denote the set of all supervariables in element +! E. +! A row is declared as dense if removing it from the current matrix +! will result in a significant reduction in the mean degree of the remaining +! rows +! A row is sparse if it is not dense. +! ------------------------------------------------------------------- + +! .. Parameters .. + INTEGER, PARAMETER :: wp = kind(0.0D0) + REAL (wp) :: zero + PARAMETER (zero=0E0_wp) +! .. +! .. Scalar Arguments .. + INTEGER (long), INTENT (IN) :: iwlen + INTEGER, INTENT (IN) :: n + INTEGER, INTENT (INOUT) :: pfree +! .. +! .. Array Arguments .. + INTEGER, INTENT (IN) :: icntl(10) + INTEGER, INTENT (INOUT) :: iw(iwlen), len(n), pe(n) + INTEGER, INTENT (OUT) :: elen(n) + + TYPE (mc68_info), INTENT (INOUT) :: info + +! N must be set to the matrix order. +! Restriction: N .ge. 1 + +! IWLEN must be set to the length of IW. It is not altered. On input, +! the matrix is stored in IW (1..PFREE-1). +! *** We do not recommend running this algorithm with *** +! *** IWLEN .LT. PFREE + N. *** +! *** Better performance will be obtained if *** +! *** IWLEN .GE. PFREE + N *** +! *** or better yet *** +! *** IWLEN .GT. 1.2 * PFREE *** +! Restriction: IWLEN .GE. PFREE-1 + +! PE(i) must be set to the the index in IW of the start of row I, or be +! zero if row I has no off-diagonal entries. During execution, +! it is used for both supervariables and elements: +! * Principal supervariable I: index into IW of the +! list of supervariable I. A supervariable +! represents one or more rows of the matrix +! with identical pattern. +! * Non-principal supervariable I: if I has been absorbed +! into another supervariable J, then PE(I) = -J. +! That is, J has the same pattern as I. +! Note that J might later be absorbed into another +! supervariable J2, in which case PE(I) is still -J, +! and PE(J) = -J2. +! * Unabsorbed element E: the index into IW of the list +! of element E. Element E is created when +! the supervariable of the same name is selected as +! the pivot. +! * Absorbed element E: if element E is absorbed into element +! E2, then PE(E) = -E2. This occurs when one of its +! variables is eliminated and when the pattern of +! E (that is, Le) is found to be a subset of the pattern +! of E2 (that is, Le2). If element E is "null" (it has +! no entries outside its pivot block), then PE(E) = 0. + +! On output, PE holds the assembly tree/forest, which implicitly +! represents a pivot order with identical fill-in as the actual +! order (via a depth-first search of the tree). If NV(I) .GT. 0, +! then I represents a node in the assembly tree, and the parent of +! I is -PE(I), or zero if I is a root. If NV(I)=0, then (I,-PE(I)) +! represents an edge in a subtree, the root of which is a node in +! the assembly tree. + +! PFREE must be set to the position in IW of the first free variable. +! During execution, additional data is placed in IW, and PFREE is +! modified so that components of IW from PFREE are free. +! On output, PFREE is set equal to the size of IW that would have +! caused no compressions to occur. If NCMPA is zero, then +! PFREE (on output) is less than or equal to IWLEN, and the space +! IW(PFREE+1 ... IWLEN) was not used. Otherwise, PFREE (on output) +! is greater than IWLEN, and all the memory in IW was used. + +! LEN(I) must be set to hold the number of entries in row I of the +! matrix, excluding the diagonal. The contents of LEN(1..N) are +! undefined on output. + +! IW(1..PFREE-1) must be set to hold the patterns of the rows of +! the matrix. The matrix must be symmetric, and both upper and +! lower triangular parts must be present. The diagonal must not be +! present. Row I is held as follows: +! IW(PE(I)...PE(I) + LEN(I) - 1) must hold the list of +! column indices for entries in row I (simple +! supervariables), excluding the diagonal. All +! supervariables start with one row/column each +! (supervariable I is just row I). If LEN(I) is zero on +! input, then PE(I) is ignored on input. Note that the +! rows need not be in any particular order, and there may +! be empty space between the rows. +! During execution, the supervariable I experiences fill-in. This +! is represented by constructing a list of the elements that cause +! fill-in in supervariable I: +! IE(PE(i)...PE(I) + ELEN(I) - 1) is the list of elements +! that contain I. This list is kept short by removing +! absorbed elements. IW(PE(I)+ELEN(I)...PE(I)+LEN(I)-1) +! is the list of supervariables in I. This list is kept +! short by removing nonprincipal variables, and any entry +! J that is also contained in at least one of the +! elements in the list for I. +! When supervariable I is selected as pivot, we create an element E +! of the same name (E=I): +! IE(PE(E)..PE(E)+LEN(E)-1) is the list of supervariables +! in element E. +! An element represents the fill-in that occurs when supervariable +! I is selected as pivot. +! CAUTION: THE INPUT MATRIX IS OVERWRITTEN DURING COMPUTATION. +! The contents of IW are undefined on output. + +! ELEN(I) need not be set. See the description of IW above. At the +! start of execution, ELEN(I) is set to zero. For a supervariable, +! ELEN(I) is the number of elements in the list for supervariable +! I. For an element, ELEN(E) is the negation of the position in the +! pivot sequence of the supervariable that generated it. ELEN(I)=0 +! if I is nonprincipal. +! On output ELEN(1..N) holds the inverse permutation (the same +! as the 'INVP' argument in Sparspak). That is, if K = ELEN(I), +! then row I is the Kth pivot row. Row I of A appears as the +! (ELEN(I))-th row in the permuted matrix, PAP^T. + +! ICNTL is an INTEGER array of length 10 that contains control +! parameters and must be set by the user. +! ICNTL(1) - ICNTL(3) are not used. + +! ICNTL(4) controls the choice of AMD algorithm +! <= 0 No checking for dense rows performed +! > 0 Corresponds to automatic setting of the minimum density +! requirement. mc68_order sets this to 1. + +! ICNTL(5) defines the largest positive +! integer that your computer can represent (-iovflo should also +! be representable). HUGE(1) in Fortran 95. + +! Local arrays: +! --------------- + +! NV(I) During execution, ABS(NV(I)) is equal to the +! number of rows represented by the principal supervariable I. If I +! is a nonprincipal variable, then NV(I) = 0. Initially, NV(I) = 1 +! for all I. NV(I) .LT. 0 signifies that I is a principal variable +! in the pattern Lme of the current pivot element ME. On termination, +! NV(E) holds the true degree of element E at the time it was +! created (including the diagonal part). + +! LAST(I) In a degree list, LAST(I) is the +! supervariable preceding I, or zero if I is the head of the list. +! In a hash bucket, LAST(I) is the hash key for I. LAST(HEAD(HASH)) +! is also used as the head of a hash bucket if HEAD(HASH) contains +! a degree list (see HEAD, below). +! On output, LAST(1..N) holds the permutation (the same as the +! 'PERM' argument in Sparspak). That is, if I = LAST(K), then row I +! is the Kth pivot row. Row LAST(K) of A is the K-th row in the +! permuted matrix, PAP^T. + + +! DEGREE If I is a supervariable and sparse, +! then DEGREE(I) holds the current approximation of the external +! degree of row I (an upper bound). The external degree is the +! number of entries in row I, minus ABS(NV(I)) (the diagonal +! part). The bound is equal to the external degree if ELEN(I) is +! less than or equal to two. We also use the term "external degree" +! for elements E to refer to |Le \ Lme|. If I is full in the reduced +! matrix, then DEGREE(I)=N+1. If I is dense in the reduced matrix, +! then DEGREE(I)=N+1+last_approximate_external_deg of I. +! All dense rows are stored in the list pointed by HEAD(N). +! Quasi dense rows are stored first, and are followed by full rows +! in the reduced matrix. LASTD holds the last row in +! this list of dense rows or is zero if the list is empty. + +! HEAD(DEG) is used for degree lists. +! HEAD(DEG) is the first supervariable in a degree list (all +! supervariables I in a degree list DEG have the same approximate +! degree, namely, DEG = DEGREE(I)). If the list DEG is empty then +! HEAD(DEG) = 0. +! During supervariable detection HEAD(HASH) also serves as a +! pointer to a hash bucket. +! If HEAD(HASH) .GT. 0, there is a degree list of degree HASH. The +! hash bucket head pointer is LAST(HEAD(HASH)). +! If HEAD(HASH) = 0, then the degree list and hash bucket are +! both empty. +! If HEAD(HASH) .LT. 0, then the degree list is empty, and +! -HEAD(HASH) is the head of the hash bucket. +! After supervariable detection is complete, all hash buckets are +! empty, and the (LAST(HEAD(HASH)) = 0) condition is restored for +! the non-empty degree lists. + +! DENXT(I) For supervariable I, DENXT(I) is +! the supervariable following I in a link list, or zero if I is +! the last in the list. Used for two kinds of lists: degree lists +! and hash buckets (a supervariable can be in only one kind of +! list at a time). For element E, DENXT(E) is the number of +! variables with dense or full rows in the element E. + +! W(I) The flag array W determines the status +! of elements and variables, and the external degree of elements. +! For elements: +! if W(E) = 0, then the element E is absorbed. +! if W(E) .GE. WFLG, then W(E)-WFLG is the size of the set +! |Le \ Lme|, in terms of nonzeros (the sum of ABS(NV(I)) +! for each principal variable I that is both in the +! pattern of element E and NOT in the pattern of the +! current pivot element, ME). +! if WFLG .GT. WE(E) .GT. 0, then E is not absorbed and has +! not yet been seen in the scan of the element lists in +! the computation of |Le\Lme| in loop 150 below. +! ***SD: change comment to remove reference to label*** +! For variables: +! during supervariable detection, if W(J) .NE. WFLG then J is +! not in the pattern of variable I. +! The W array is initialized by setting W(I) = 1 for all I, and by +! setting WFLG = 2. It is reinitialized if WFLG becomes too large +! (to ensure that WFLG+N does not cause integer overflow). + + +! Local variables: +! --------------- + +! DEG: the degree of a variable or element +! DEGME: size (no. of variables), |Lme|, of the current element, +! ME (= DEGREE(ME)) +! DEXT: external degree, |Le \ Lme|, of some element E +! DMAX: largest |Le| seen so far +! E: an element +! ELENME: the length, ELEN(ME), of element list of pivotal var. +! ELN: the length, ELEN(...), of an element list +! EMP1: stores number of rows found to be empty +! HASH: the computed value of the hash function +! HMOD: the hash function is computed modulo HMOD = MAX(1,N-1) +! I: a supervariable +! IDUMMY: loop counter +! ILAST: the entry in a link list preceding I +! INEXT: the entry in a link list following I +! IOVFLO: local copy of ICNTL(5) +! J: a supervariable +! JDUMMY: loop counter +! JLAST: the entry in a link list preceding J +! JNEXT: the entry in a link list, or path, following J +! K: the pivot order of an element or variable +! KNT1: loop counter used during element construction +! KNT2: loop counter used during element construction +! KNT3: loop counter used during element construction +! LASTD: index of the last row in the list of dense rows +! LENJ: LEN(J) +! LN: length of a supervariable list +! MAXMEM: amount of memory needed for no compressions +! ME: current supervariable being eliminated, and the +! current element created by eliminating that +! supervariable +! MEM: memory in use assuming no compressions have occurred +! MINDEG: current approximate minimum degree +! MU: current mean of external degrees during dense detection +! NBD: total number of dense rows selected +! NCMPA: counter for the number of times IW was compressed +! NEL: number of pivots selected so far +! NEWMEM: amount of new memory needed for current pivot element +! NLEFT: N-NEL, the number of nonpivotal rows/columns remaining +! NRLADU: counter for the forecast number of reals in matrix factor +! NVI: the number of variables in a supervariable I (= NV(I)) +! NVJ: the number of variables in a supervariable J (= NV(J)) +! NVPIV: number of pivots in current element +! P: pointer into lots of things +! P1: pe (i) for some variable i (start of element list) +! P2: pe (i) + elen (i) - 1 for some var. i (end of el. list) +! P3: index of first supervariable in clean list +! PJ: pointer into an element or variable +! PDST: destination pointer, for compression +! PEND: end of memory to compress +! PME: pointer into the current element (PME1...PME2) +! PME1: the current element, ME, is stored in IW(PME1...PME2) +! PME2: the end of the current element +! PN: pointer into a "clean" variable, also used to compress +! PSRC: source pointer, for compression +! SDEN: used to remember whether dense rows occur +! SLENME: number of variables in variable list of pivotal variable +! THRESH: local copy of ICNTL(4) +! THRESM : local integer holding the threshold used to detect quasi +! dense rows. When quasi dense rows are reintegrated in the +! graph to be processed then THRESM is modified. +! WE: W(E) +! WFLG: used for flagging the W array. See description of W. +! WNVI: WFLG-NV(I) +! X: either a supervariable or an element + +! OPS: counter for forecast number of flops +! RELDEN : holds average density to set THRESM automatically + +! IDENSE is true if supervariable I is dense + +! ------------------------------------------------------------------- +! FUNCTIONS CALLED: +! ------------------------------------------------------------------- + +! ==================================================================== +! INITIALIZATIONS +! ==================================================================== + +! .. +! .. Local Arrays .. + INTEGER, ALLOCATABLE, DIMENSION (:) :: nv, last, degree, head, denxt, & + w + +! .. +! .. Local Scalars .. + REAL (myreal_mc68) mu, relden + INTEGER deg, degme, dext, dmax, e, elenme, eln, emp1, hash, hmod, i, & + ilast, inext, iovflo, j, jdummy, jlast, jnext, k, knt1, & + knt2, knt3, lastd, lenj, ln, maxmem, me, mem, mindeg, nbd, ncmpa, & + nel, newmem, nleft, nvi, nvj, nvpiv, p, p1, p2, p3, pdst, & + pend, pj, pme, pme1, pme2, pn, psrc, sden, slenme, thresh, thresm, & + we, wflg, wnvi, x + INTEGER(long) :: idummy +! .. +! .. Intrinsic Functions .. + INTRINSIC abs, int, log, max, min, mod, real, sqrt +! .. + + dmax = 0 + hmod = max(1,n-1) + iovflo = icntl(5) + lastd = 0 + mem = pfree - 1 + maxmem = mem + mindeg = 1 + nbd = 0 + ncmpa = 0 + nel = 0 + thresh = icntl(4) + wflg = 2 + emp1 = 0 + sden = 0 + + ALLOCATE (nv(n),last(n),degree(n),head(n),denxt(n),w(n), & + STAT=info%stat) + IF (info%stat>0) THEN + info%flag = mc68_err_memory_alloc + RETURN + END IF + + IF (thresh>0) THEN + thresm = int(sqrt(real(n))) + +! --------------------------------------------------------------------- +! initialize head(n) and next(n) +! --------------------------------------------------------------------- + relden = 0 + head(1:n) = 0 + denxt(1:n) = 0 + +! --------------------------------------------------------------------- +! create the degree hash buckets and linked lists +! for the dense nodes +! --------------------------------------------------------------------- + relden = 0 + degree(1:n) = len(1:n) + DO i = 1, n + deg = len(i) + IF (deg>0) THEN + sden = 1 + relden = relden + deg +! insert node in degree list + denxt(i) = head(deg) + head(deg) = i + ELSE + emp1 = emp1 + 1 + END IF + END DO + + IF (n==emp1) THEN + mu = 0 + ELSE + mu = relden/(n-emp1) + END IF + +! --------------------------------------------------------------------- + +! 1) Recalculate the degree length of all nodes adjacent to +! the dense nodes in the degree list. (Note: Many of the +! dense nodes in the degree list will no longer be dense after +! this section.) + +! 2) Constuct the ordering for the nodes not sent to AMD by +! selecting the most dense node in the degree list and +! then reduce the lengths of all adjacent nodes. Repeat this +! until no nodes are left with length higher than dense. +! The dense nodes are placed in the last(n) array. +! NOTE: 1) nodes are placed after the final value +! of lastnode in the last(n) array +! 2) the AMD routine will not effect anything after +! last node in the last(n) array. +! 3) nodes are saved in degree order and in their +! original state, i.e., no reverse mapping is +! needed on these. +! --------------------------------------------------------------------- + + IF (sden==1) THEN + sden = 0 + k = n +10 CONTINUE + +! ** get node from bucket + me = head(k) + +! ** main loop control + IF (mu/=zero .AND. (n-1/=sden+emp1) .AND. (n-2/=sden+emp1)) THEN + IF (me==0) THEN + k = k - 1 + IF ((mu-((relden-2*k)/real(n-sden-1-emp1))>=(40.0_wp* & + log(real(n-sden-1-emp1)))/real(n-sden-1-emp1)+mu/real(n- & + sden-2-emp1)) .AND. k/=0) GO TO 10 + ELSE + +! ** remove node from bucket + head(k) = denxt(me) + +! ** get degree of current node + deg = degree(me) + +! ** skip this node if degree was changed to less than dense + IF (deg>=1) THEN + +! ** check if degree was changed + IF (deg0) THEN + +! ** insert back into linked list at the lower degree + denxt(me) = head(deg) + head(deg) = me + ELSE + +! ** update degree lengths of adjacent nodes + p1 = pe(me) + len(me) - 1 + DO i = pe(me), p1 + j = iw(i) + IF (degree(j)==1) THEN + degree(j) = 0 + emp1 = emp1 + 1 + ELSE IF (degree(j)<2*n+1) THEN + degree(j) = degree(j) - 1 + END IF + END DO + sden = sden + 1 + relden = relden - 2*deg + IF (n==sden+emp1) THEN + mu = 0 + ELSE + mu = relden/(n-sden-emp1) + END IF +! Mark as dense row + degree(me) = deg + 2*n + 1 + pe(me) = 0 + END IF + END IF + GO TO 10 + END IF + END IF + END IF + + DO i = 1, n + IF (degree(i)<2*n+1) THEN + IF (degree(i)>0) THEN + p1 = pe(i) + p2 = pe(i) + len(i) - 1 + pj = p1 + DO j = p1, p2 +! Search I for dense variables + IF (degree(iw(j))>2*n+1) THEN + len(i) = len(i) - 1 + ELSE + iw(pj) = iw(j) + pj = pj + 1 + END IF + END DO + degree(i) = len(i) + IF (len(i)==0) pe(i) = 0 + len(i) = pj - p1 + ELSE + len(i) = 0 + pe(i) = 0 + END IF + END IF + END DO + END IF + + IF (thresh>0) THEN +! ---------------------------------------------------------- +! initialize arrays and eliminate rows with no off-diag. nz. +! ---------------------------------------------------------- + last(1:n) = 0 + head(1:n) = 0 + denxt(1:n) = 0 + nv(1:n) = 1 + DO i = 1, n + IF (len(i)==0 .AND. degree(i)==0) THEN + nel = nel + 1 + elen(i) = -nel + pe(i) = 0 + w(i) = 0 + ELSE + w(i) = 1 + elen(i) = 0 + END IF + END DO + + IF (n==nel) THEN + GO TO 100 + ELSE + thresm = n + 1 + END IF + ELSE + + thresm = thresh + last(1:n) = 0 + head(1:n) = 0 + nv(1:n) = 1 + degree(1:n) = len(1:n) + DO i = 1, n + IF (degree(i)==0) THEN + nel = nel + 1 + elen(i) = -nel + pe(i) = 0 + w(i) = 0 + ELSE + w(i) = 1 + elen(i) = 0 + END IF + END DO + END IF + +! ---------------------------------------------------------------- +! initialize degree lists +! ---------------------------------------------------------------- + DO i = 1, n + deg = degree(i) + IF (deg>0) THEN +! ---------------------------------------------------------- +! place i in the degree list corresponding to its degree +! or in the dense row list if i is dense +! ---------------------------------------------------------- +! test for row density + IF ((thresm>=0) .AND. (deg>=2*n+1)) THEN +! I is dense and will be inserted in the degree +! list of N + deg = n + inext = head(deg) + IF (inext/=0) last(inext) = i + denxt(i) = inext + head(deg) = i + last(i) = 0 + IF (lastd==0) lastd = i + ELSE +! place i in the degree list corresponding to its degree + inext = head(deg) + IF (inext/=0) last(inext) = i + denxt(i) = inext + head(deg) = i + END IF + END IF + END DO + nbd = sden + +! We suppress dense row selection if none of them was found in A +! in the 1st pass + IF (nbd==0 .AND. thresh>0) thresm = -1 + + DO WHILE (nel0) GO TO 20 + END DO +20 mindeg = deg + + IF (deg0) THEN +! ---------------------------------------------------- +! i is a principal variable not yet placed in the +! generated element. Store i in new list +! ---------------------------------------------------- + degme = degme + nvi +! flag i as being in Lme by negating nv (i) + nv(i) = -nvi + pme2 = pme2 + 1 + iw(pme2) = i + +! ---------------------------------------------------- +! remove variable i from degree list. +! ---------------------------------------------------- + ilast = last(i) + inext = denxt(i) + IF (inext/=0) last(inext) = ilast + IF (ilast/=0) THEN + denxt(ilast) = inext + ELSE +! i is at the head of the degree list + head(degree(i)) = inext + END IF + END IF + END DO +! this element takes no new memory in iw: + newmem = 0 + ELSE +! ---------------------------------------------------------- +! construct the new element in empty space, iw (pfree ...) +! ---------------------------------------------------------- + p = pe(me) + pme1 = pfree + slenme = len(me) - elenme + DO knt1 = 1, elenme +! search the elements in me. + e = iw(p) + p = p + 1 + pj = pe(e) + ln = len(e) +! ------------------------------------------------------- +! search for different supervariables and add them to the +! new list, compressing when necessary. +! ------------------------------------------------------- + DO knt2 = 1, ln + i = iw(pj) + pj = pj + 1 + nvi = nv(i) + IF (nvi>0) THEN +! ------------------------------------------------- +! compress iw, if necessary +! ------------------------------------------------- + IF (pfree>iwlen) THEN +! prepare for compressing iw by adjusting +! pointers and lengths so that the lists being +! searched in the inner and outer loops contain +! only the remaining entries. +! ***** SD: Seperate compression subroutine tried +! but found to be inefficient in comparison **** + pe(me) = p + len(me) = len(me) - knt1 +! Check if anything left in supervariable ME + IF (len(me)==0) pe(me) = 0 + pe(e) = pj + len(e) = ln - knt2 +! Check if anything left in element E + IF (len(e)==0) pe(e) = 0 + ncmpa = ncmpa + 1 +! store first item in pe +! set first entry to -item + DO j = 1, n + pn = pe(j) + IF (pn>0) THEN + pe(j) = iw(pn) + iw(pn) = -j + END IF + END DO + +! psrc/pdst point to source/destination + pdst = 1 + psrc = 1 + pend = pme1 - 1 + +! while loop: + DO idummy = 1, iwlen + IF (psrc>pend) THEN + GO TO 30 + ELSE +! search for next negative entry + j = -iw(psrc) + psrc = psrc + 1 + IF (j>0) THEN + iw(pdst) = pe(j) + pe(j) = pdst + pdst = pdst + 1 +! copy from source to destination + lenj = len(j) + DO knt3 = 0, lenj - 2 + iw(pdst+knt3) = iw(psrc+knt3) + END DO + pdst = pdst + lenj - 1 + psrc = psrc + lenj - 1 + END IF + END IF + END DO + +! move the new partially-constructed element +30 p1 = pdst + DO psrc = pme1, pfree - 1 + iw(pdst) = iw(psrc) + pdst = pdst + 1 + END DO + pme1 = p1 + pfree = pdst + pj = pe(e) + p = pe(me) + END IF + +! ------------------------------------------------- +! i is a principal variable not yet placed in Lme +! store i in new list +! ------------------------------------------------- + degme = degme + nvi +! flag i as being in Lme by negating nv (i) + nv(i) = -nvi + iw(pfree) = i + pfree = pfree + 1 + +! ------------------------------------------------- +! remove variable i from degree link list +! ------------------------------------------------- + ilast = last(i) + inext = denxt(i) + IF (inext/=0) last(inext) = ilast + IF (ilast/=0) THEN + denxt(ilast) = inext + ELSE +! i is at the head of the degree list + head(degree(i)) = inext + END IF + END IF + END DO + +! set tree pointer and flag to indicate element e is +! absorbed into new element me (the parent of e is me) + pe(e) = -me + w(e) = 0 + END DO + +! search the supervariables in me. + knt1 = elenme + 1 + e = me + pj = p + ln = slenme + +! ------------------------------------------------------- +! search for different supervariables and add them to the +! new list, compressing when necessary. +! ------------------------------------------------------- + DO knt2 = 1, ln + i = iw(pj) + pj = pj + 1 + nvi = nv(i) + IF (nvi>0) THEN +! ------------------------------------------------- +! compress iw, if necessary +! ------------------------------------------------- + IF (pfree>iwlen) THEN +! prepare for compressing iw by adjusting +! pointers and lengths so that the lists being +! searched in the inner and outer loops contain +! only the remaining entries. + pe(me) = p + len(me) = len(me) - knt1 +! Check if anything left in supervariable ME + IF (len(me)==0) pe(me) = 0 + pe(e) = pj + len(e) = ln - knt2 +! Check if anything left in element E + IF (len(e)==0) pe(e) = 0 + ncmpa = ncmpa + 1 +! store first item in pe +! set first entry to -item + DO j = 1, n + pn = pe(j) + IF (pn>0) THEN + pe(j) = iw(pn) + iw(pn) = -j + END IF + END DO + +! psrc/pdst point to source/destination + pdst = 1 + psrc = 1 + pend = pme1 - 1 + +! while loop: +! 122 CONTINUE + DO idummy = 1, iwlen + IF (psrc>pend) THEN + GO TO 40 + ELSE +! search for next negative entry + j = -iw(psrc) + psrc = psrc + 1 + IF (j>0) THEN + iw(pdst) = pe(j) + pe(j) = pdst + pdst = pdst + 1 +! copy from source to destination + lenj = len(j) + DO knt3 = 0, lenj - 2 + iw(pdst+knt3) = iw(psrc+knt3) + END DO + pdst = pdst + lenj - 1 + psrc = psrc + lenj - 1 + END IF + END IF + END DO + +! move the new partially-constructed element +40 p1 = pdst + DO psrc = pme1, pfree - 1 + iw(pdst) = iw(psrc) + pdst = pdst + 1 + END DO + pme1 = p1 + pfree = pdst + pj = pe(e) + p = pe(me) + END IF + +! ------------------------------------------------- +! i is a principal variable not yet placed in Lme +! store i in new list +! ------------------------------------------------- + degme = degme + nvi +! flag i as being in Lme by negating nv (i) + nv(i) = -nvi + iw(pfree) = i + pfree = pfree + 1 + +! ------------------------------------------------- +! remove variable i from degree link list +! ------------------------------------------------- + ilast = last(i) + inext = denxt(i) + IF (inext/=0) last(inext) = ilast + IF (ilast/=0) THEN + denxt(ilast) = inext + ELSE +! i is at the head of the degree list + head(degree(i)) = inext + END IF + END IF + END DO + + pme2 = pfree - 1 +! this element takes newmem new memory in iw (possibly zero) + newmem = pfree - pme1 + mem = mem + newmem + maxmem = max(maxmem,mem) + END IF + +! ------------------------------------------------------------- +! me has now been converted into an element in iw (pme1..pme2) +! ------------------------------------------------------------- +! degme holds the external degree of new element + degree(me) = degme + pe(me) = pme1 + len(me) = pme2 - pme1 + 1 + +! ------------------------------------------------------------- +! make sure that wflg is not too large. With the current +! value of wflg, wflg+n must not cause integer overflow +! ------------------------------------------------------------- + IF (wflg>iovflo-n) THEN + DO x = 1, n + IF (w(x)/=0) w(x) = 1 + END DO + wflg = 2 + END IF + +! ==================================================================== +! COMPUTE (w(e) - wflg) = |Le(G')\Lme(G')| FOR ALL ELEMENTS +! where G' is the subgraph of G containing just the sparse rows) +! ==================================================================== +! ------------------------------------------------------------- +! Scan 1: compute the external degrees of elements touched +! with respect to the current element. That is: +! (w (e) - wflg) = |Le \ Lme| +! for each element e involving a supervariable in Lme. +! The notation Le refers to the pattern (list of +! supervariables) of a previous element e, where e is not yet +! absorbed, stored in iw (pe (e) + 1 ... pe (e) + iw (pe (e))). +! The notation Lme refers to the pattern of the current element +! (stored in iw (pme1..pme2)). +! ------------------------------------------------------------- + DO pme = pme1, pme2 + i = iw(pme) + eln = elen(i) + IF (eln>0) THEN +! note that nv (i) has been negated to denote i in Lme: + nvi = -nv(i) + wnvi = wflg - nvi + DO p = pe(i), pe(i) + eln - 1 + e = iw(p) + we = w(e) + IF (we>=wflg) THEN +! unabsorbed element e has been seen in this loop + we = we - nvi + ELSE IF (we/=0) THEN +! e is an unabsorbed element - this is +! the first we have seen e in all of Scan 1 + we = degree(e) + wnvi + END IF + w(e) = we + END DO + END IF + END DO + +! ==================================================================== +! DEGREE UPDATE AND ELEMENT ABSORPTION +! ==================================================================== + +! ------------------------------------------------------------- +! Scan 2: for each sparse i in Lme, sum up the external degrees +! of each Le for the elements e appearing within i, plus the +! supervariables in i. Place i in hash list. +! ------------------------------------------------------------- + + DO pme = pme1, pme2 + i = iw(pme) +! remove absorbed elements from the list for i + p1 = pe(i) + p2 = p1 + elen(i) - 1 + pn = p1 + hash = 0 + deg = 0 + +! ------------------------------------------------------- +! scan the element list associated with supervariable i +! ------------------------------------------------------- + DO p = p1, p2 + e = iw(p) +! dext = | Le | - | (Le \cap Lme)\D | - DENXT(e) + dext = w(e) - wflg + IF (dext>0) THEN + deg = deg + dext + iw(pn) = e + pn = pn + 1 + hash = hash + e + ELSE IF (dext==0) THEN +! aggressive absorption: e is not adjacent to me, but +! |Le(G') \ Lme(G')| is 0, so absorb it into me + pe(e) = -me + w(e) = 0 + END IF + END DO + +! count the number of elements in i (including me): + elen(i) = pn - p1 + 1 + +! ---------------------------------------------------------- +! scan the supervariables in the list associated with i +! ---------------------------------------------------------- + p3 = pn + DO p = p2 + 1, p1 + len(i) - 1 + j = iw(p) + nvj = nv(j) + IF (nvj>0) THEN +! j is unabsorbed, and not in Lme. +! add to degree and add to new list + deg = deg + nvj + iw(pn) = j + pn = pn + 1 + hash = hash + j + END IF + END DO + +! ---------------------------------------------------------- +! update the degree and check for mass elimination +! ---------------------------------------------------------- + IF (deg==0) THEN +! ------------------------------------------------------- +! mass elimination - supervariable i can be eliminated +! ------------------------------------------------------- + pe(i) = -me + nvi = -nv(i) + degme = degme - nvi + nvpiv = nvpiv + nvi + nel = nel + nvi + nv(i) = 0 + elen(i) = 0 + ELSE +! ------------------------------------------------------- +! update the upper-bound degree of i +! A bound for the new external degree is the old bound plus +! the size of the generated element +! ------------------------------------------------------- + +! the following degree does not yet include the size +! of the current element, which is added later: + degree(i) = min(deg,degree(i)) + +! ------------------------------------------------------- +! add me to the list for i +! ------------------------------------------------------- +! move first supervariable to end of list + iw(pn) = iw(p3) +! move first element to end of element part of list + iw(p3) = iw(p1) +! add new element to front of list. + iw(p1) = me +! store the new length of the list in len (i) + len(i) = pn - p1 + 1 + +! ------------------------------------------------------- +! place in hash bucket. Save hash key of i in last (i). +! ------------------------------------------------------- + hash = abs(mod(hash,hmod)) + 1 + j = head(hash) + IF (j<=0) THEN +! the degree list is empty, hash head is -j + denxt(i) = -j + head(hash) = -i + ELSE +! degree list is not empty - has j as its head +! last is hash head + denxt(i) = last(j) + last(j) = i + END IF + last(i) = hash + END IF + END DO + degree(me) = degme + +! ------------------------------------------------------------- +! Clear the counter array, w (...), by incrementing wflg. +! ------------------------------------------------------------- + dmax = max(dmax,degme) + wflg = wflg + dmax + +! make sure that wflg+n does not cause integer overflow + IF (wflg>=iovflo-n) THEN + DO x = 1, n + IF (w(x)/=0) w(x) = 1 + END DO + wflg = 2 + END IF +! at this point, w (1..n) .lt. wflg holds + +! ==================================================================== +! SUPERVARIABLE DETECTION +! ==================================================================== + DO pme = pme1, pme2 + i = iw(pme) + IF ((nv(i)<0) .AND. (degree(i)<=n)) THEN +! only done for sparse rows +! replace i by head of its hash bucket, and set the hash +! bucket header to zero + +! ------------------------------------------------------- +! examine all hash buckets with 2 or more variables. We +! do this by examing all unique hash keys for super- +! variables in the pattern Lme of the current element, me +! ------------------------------------------------------- + hash = last(i) +! let i = head of hash bucket, and empty the hash bucket + j = head(hash) + IF (j/=0) THEN + IF (j<0) THEN +! degree list is empty + i = -j + head(hash) = 0 + ELSE +! degree list is not empty, restore last () of head + i = last(j) + last(j) = 0 + END IF + IF (i/=0) THEN + +! while loop: + DO jdummy = 1, n + IF (denxt(i)==0) THEN + GO TO 80 + ELSE +! ---------------------------------------------------- +! this bucket has one or more variables following i. +! scan all of them to see if i can absorb any entries +! that follow i in hash bucket. Scatter i into w. +! ---------------------------------------------------- + ln = len(i) + eln = elen(i) +! do not flag the first element in the list (me) + DO p = pe(i) + 1, pe(i) + ln - 1 + w(iw(p)) = wflg + END DO + +! ---------------------------------------------------- +! scan every other entry j following i in bucket +! ---------------------------------------------------- + jlast = i + j = denxt(i) + +! while loop: + DO idummy = 1, n + IF (j==0) THEN + GO TO 70 + ELSE + +! ------------------------------------------------- +! check if j and i have identical nonzero pattern +! ------------------------------------------------- +! jump if i and j do not have same size data structure + IF (len(j)==ln) THEN +! jump if i and j do not have same number adj elts + IF (elen(j)==eln) THEN +! do not flag the first element in the list (me) + + DO p = pe(j) + 1, pe(j) + ln - 1 +! jump if an entry (iw(p)) is in j but not in i + IF (w(iw(p))/=wflg) GO TO 50 + END DO + +! ------------------------------------------------- +! found it! j can be absorbed into i +! ------------------------------------------------- + pe(j) = -i +! both nv (i) and nv (j) are negated since they +! are in Lme, and the absolute values of each +! are the number of variables in i and j: + nv(i) = nv(i) + nv(j) + nv(j) = 0 + elen(j) = 0 +! delete j from hash bucket + j = denxt(j) + denxt(jlast) = j + GO TO 60 + END IF + END IF + +! ------------------------------------------------- +50 CONTINUE +! j cannot be absorbed into i +! ------------------------------------------------- + jlast = j + j = denxt(j) + END IF +60 CONTINUE + END DO + +! ---------------------------------------------------- +! no more variables can be absorbed into i +! go to next i in bucket and clear flag array +! ---------------------------------------------------- +70 wflg = wflg + 1 + i = denxt(i) + IF (i==0) GO TO 80 + END IF + END DO + END IF + END IF + END IF +80 CONTINUE + END DO + +! ==================================================================== +! RESTORE DEGREE LISTS AND REMOVE NONPRINCIPAL SUPERVAR. FROM ELEMENT +! Squeeze out absorbed variables +! ==================================================================== + p = pme1 + nleft = n - nel + DO pme = pme1, pme2 + i = iw(pme) + nvi = -nv(i) + IF (nvi>0) THEN +! i is a principal variable in Lme +! restore nv (i) to signify that i is principal + nv(i) = nvi + IF (degree(i)<=n) THEN +! ------------------------------------------------------- +! compute the external degree (add size of current elem) +! ------------------------------------------------------- + deg = min(degree(i)+degme-nvi,nleft-nvi) + degree(i) = deg + +! ------------------------------------------------------- +! place the supervariable at the head of the degree list +! ------------------------------------------------------- + inext = head(deg) + IF (inext/=0) last(inext) = i + denxt(i) = inext + last(i) = 0 + head(deg) = i +! ------------------------------------------------------- +! save the new degree, and find the minimum degree +! ------------------------------------------------------- + mindeg = min(mindeg,deg) + END IF +! ------------------------------------------------------- +! place the supervariable in the element pattern +! ------------------------------------------------------- + iw(p) = i + p = p + 1 + END IF + END DO + +! ===================================================================== +! FINALIZE THE NEW ELEMENT +! ===================================================================== + nv(me) = nvpiv + degme +! nv (me) is now the degree of pivot (including diagonal part) +! save the length of the list for the new element me + len(me) = p - pme1 + IF (len(me)==0) THEN +! there is nothing left of the current pivot element + pe(me) = 0 + w(me) = 0 + END IF + IF (newmem/=0) THEN +! element was not constructed in place: deallocate part +! of it (final size is less than or equal to newmem, +! since newly nonprincipal variables have been removed). + pfree = p + mem = mem - newmem + len(me) + END IF + +! ===================================================================== +! END WHILE (selecting pivots) + ELSE +! DEGREE(ME).GT.N+1 so ME is dense +! RESTARTING STRATEGY +! FOR EACH dense row d +! 1/ insert d in the degree list according to the +! value degree(d)-(N+1) (updating MINDEG) +! 2/ ME is assumed to have no adjacent variables because just +! sorting according to order removed from matrix at initialisation +! 3/ get back to min degree process + +! While loop: ME is the current dense row +! make sure that WFLG is not too large + IF (wflg>iovflo-nbd-1) THEN + DO x = 1, n + IF (w(x)/=0) w(x) = 1 + END DO + wflg = 2 + END IF + wflg = wflg + 1 + DO idummy = 1, n + pe(me) = 0 + len(me) = 0 + +! --------------------------------------------------------- +! remove chosen variable from link list +! --------------------------------------------------------- + inext = denxt(me) + IF (inext/=0) THEN + last(inext) = 0 + ELSE + lastd = 0 + END IF +! ---------------------------------------------------------- +! build adjacency list of ME in quotient graph +! and calculate its external degree in ndense(me) +! ---------------------------------------------------------- + denxt(me) = 0 +! Flag ME as having been considered in this calculation + w(me) = wflg + p1 = pe(me) + p2 = p1 + len(me) - 1 +! LN-1 holds the pointer in IW to last elt/var in adj list +! of ME. LEN(ME) will then be set to LN-P1 +! ELN-1 hold the pointer in IW to last elt in in adj list +! of ME. ELEN(ME) will then be set to ELN-P1 +! element adjacent to ME + ln = p1 + eln = p1 + +! ---------------------------------------------- +! DEGREE(ME)-(2*N+1) holds last external degree computed +! when ME was detected as dense +! DENXT(ME) is the exact external degree of ME +! ---------------------------------------------- + wflg = wflg + 1 + len(me) = ln - p1 + elen(me) = eln - p1 + IF (denxt(me)==0) denxt(me) = 1 +! --------------------------------------------------------- +! place ME in the degree list of DENXT(ME), update DEGREE +! --------------------------------------------------------- + deg = degree(me) - 2*n - 1 + degree(me) = denxt(me) + mindeg = min(deg,mindeg) + jnext = head(deg) + IF (jnext/=0) last(jnext) = me + denxt(me) = jnext + head(deg) = me +! nel = nel+1 + +! ------------------------------ +! process dense row +! ------------------------------ + me = inext + IF (me==0) THEN + GO TO 90 + ELSE IF (degree(me)<=(n+1)) THEN + GO TO 90 + END IF + END DO +90 head(n) = me +! get back to min degree elimination loop + END IF + END DO +! ===================================================================== + +100 CONTINUE +! =================================================================== +! COMPUTE THE PERMUTATION VECTORS +! =================================================================== + +! ---------------------------------------------------------------- +! The time taken by the following code is O(n). At this +! point, elen (e) = -k has been done for all elements e, +! and elen (i) = 0 has been done for all nonprincipal +! variables i. At this point, there are no principal +! supervariables left, and all elements are absorbed. +! ---------------------------------------------------------------- + +! ---------------------------------------------------------------- +! compute the ordering of unordered nonprincipal variables +! ---------------------------------------------------------------- + + DO i = 1, n + IF (elen(i)==0) THEN +! ---------------------------------------------------------- +! i is an un-ordered row. Traverse the tree from i until +! reaching an element, e. The element, e, was the +! principal supervariable of i and all nodes in the path +! from i to when e was selected as pivot. +! ---------------------------------------------------------- + j = -pe(i) +! while (j is a variable) do: + DO jdummy = 1, n + IF (elen(j)<0) THEN + GO TO 110 + ELSE + j = -pe(j) + END IF + END DO +110 e = j +! ---------------------------------------------------------- +! get the current pivot ordering of e +! ---------------------------------------------------------- + k = -elen(e) + +! ---------------------------------------------------------- +! traverse the path again from i to e, and compress the +! path (all nodes point to e). Path compression allows +! this code to compute in O(n) time. Order the unordered +! nodes in the path, and place the element e at the end. +! ---------------------------------------------------------- + j = i +! while (j is a variable) do: + DO idummy = 1, n + IF (elen(j)<0) THEN + GO TO 120 + ELSE + jnext = -pe(j) + pe(j) = -e + IF (elen(j)==0) THEN +! j is an unordered row + elen(j) = k + k = k + 1 + END IF + j = jnext + END IF + END DO +! leave elen (e) negative, so we know it is an element +120 elen(e) = -k + END IF + END DO + +! ---------------------------------------------------------------- +! reset the inverse permutation (elen (1..n)) to be positive, +! and compute the permutation (last (1..n)). +! ---------------------------------------------------------------- + DO i = 1, n + k = abs(elen(i)) + last(k) = i + elen(i) = k + END DO + +! ==================================================================== +! RETURN THE MEMORY USAGE IN IW AND SET INFORMATION ARRAYS +! ==================================================================== +! If maxmem is less than or equal to iwlen, then no compressions +! occurred, and iw (maxmem+1 ... iwlen) was unused. Otherwise +! compressions did occur, and iwlen would have had to have been +! greater than or equal to maxmem for no compressions to occur. +! Return the value of maxmem in the pfree argument. + + DEALLOCATE (nv,last,degree,head,denxt,w,STAT=info%stat) + IF (info%stat>0) THEN + info%flag = mc68_err_memory_dealloc + RETURN + END IF + + info%n_compressions = ncmpa + info%n_zero_eigs = -1 + info%n_dense_rows = nbd + pfree = maxmem + +END SUBROUTINE amdd + +! ------------------------------------------------------------------- + + +END MODULE hsl_mc68_integer + +! Additional modules to provide backwards compatibility. +! These modules are deprecated and may be removed at a later date. +module hsl_mc68_double + use hsl_mc68_integer +end module hsl_mc68_double +module hsl_mc68_single + use hsl_mc68_integer +end module hsl_mc68_single +! COPYRIGHT (c) 2012 Science and Technology Facilities Council +! Original date 6 June 2012, Version 1.0.0 +! +! Written by: Jonathan Hogg and Jennifer Scott + +! Given a sparse symmetric matrix A, this package +! uses a matching algorithm to compute an elimination +! order that is suitable for use with a sparse direct solver. +! It optionally computes scaling factors. + +! Note: this version uses mc64 to compute the matching +! and follows approach of Duff and Pralet (2005). +! It does not compute the optimal matching in the +! structurally singular case as we found the extra work +! required to do this did not result in a better +! pivot order. + +! To convert from double to single: +! * Change wp +! * Replace _double by _single +! * Replace call to mc64wd to mc64w + +module hsl_mc80_double + use hsl_mc34_double + use hsl_mc68_integer + ! Also calls mc64 + implicit none + + private + public :: mc80_order, mc80_order_full, mc80_control, mc80_info + + integer, parameter :: wp = kind(0d0) + real(wp), parameter :: one = 1.0_wp + real(wp), parameter :: zero = 0.0_wp + real(wp), parameter :: rinf = huge(0.0_wp) + + ! Error flags + integer, parameter :: MC80_SUCCESS = 0 + integer, parameter :: MC80_ERROR_ALLOCATION = -1 + integer, parameter :: MC80_ERROR_A_N_OOR = -2 + integer, parameter :: MC80_ERROR_SINGULAR = -3 + integer, parameter :: MC80_ERROR_MC68 = -4 + integer, parameter :: MC80_ERROR_ORD_OOR = -5 + integer, parameter :: MC80_ERROR_NO_METIS = -6 + + ! warning flags + integer, parameter :: MC80_WARNING_SINGULAR = 1 + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + ! + ! Data type for information returned by code + ! + type mc80_info + integer :: compress_rank = 0 ! order of compressed matrix (ordering + ! applied to this matrix) + integer :: flag = 0 ! Takes one of the enumerated flag values: + ! Possible following values: + ! 0 : successful entry (for structurally nonsingular matrix). + ! -1 : allocation error + ! -2 : Metis not available when required + ! -3 : either n or ord is out of range (immediate return) + ! -4 : unexpected error returned by hsl_mc68 + ! +1 : successful entry (for structurally singular matrix). + integer :: flag68 = 0 ! error flag from hsl_mc68 + integer :: max_cycle = 0 ! maximum cycle length + integer :: struct_rank = 0 ! structural rank + integer :: stat = 0 ! stat parameter + + end type mc80_info + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + type mc80_control + logical :: action = .true. ! if set to .true. and the matrix + ! is found to be structurally singular, the code exits immediately + ! with an error flag set. + logical :: unmatched_scale_zero = .false. ! If true, then in the singular + ! case, the scaling factors associated with the unmatched part of the + ! matrix are set to zero. This will breakdown if the matched submatrix + ! is numerically singular, but if no any factorization will likely have + ! far fewer delayed pivots. If false, then Duff and Pralet are followed + ! and the value is set such that the corresponding scaled entries are + ! <= 1 in absolute value. + logical :: unmatched_last = .false. ! If true, then in singular case, rows + ! and columns associated with the unmatched part are ordered last in + ! the elimination order. If false, they are placed in a fill-minimising + ! position. + end type mc80_control + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + interface mc80_order + ! to be used if lower triangle of A available + module procedure mc80_order_double + end interface + + interface mc80_order_full + ! to be used if lower and upper triangles of A available + module procedure mc80_order_full_double + end interface + +contains + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +! +! This routine computes the matching, splits long cycles, +! compresses the matrix, applies AMD, Min Deg or Metis to the compressed +! matrix and then returns an ordering for the original +! matrix. This ordering flags 2x2 pivots using negative signs +! (as used on input to hsl_ma77). +! If scale is present, the mc64 scaling factors are returned. +! The matrix may be singular. +! +! Input (ptr, row , val) is the ** lower triangular part ** of the matrix. +! Diagonal entries need not be present. +! There is no matrix data checking. +! +subroutine mc80_order_double(ord, n, ptr, row, val, order, & + control, info, scale) + integer, intent(in) :: ord ! controls ordering on compressed matrix + ! 1 An approximate minimum degree ordering is used. + ! 2 A minimum degree ordering is used (as in MA27). + ! 3 METIS ordering with default settings is used. + integer, intent(in) :: n + integer, dimension(:), intent(in) :: ptr + integer, dimension(:), intent(in) :: row + real(wp), dimension(:), intent(in) :: val + integer, dimension(:), intent(out) :: order ! |order(i)| holds the position + ! of variable i in the elimination order (pivot sequence). If a + ! 1x1 pivot i is obtained, order(i)>0. If a + ! 2x2 pivot involving i and j is obtained, + ! order(i)<0, order(j)<0 and |order(j)|=|order(i)|+1. + type(mc80_control), intent(in) :: control + type (mc80_info), intent(out) :: info ! used to hold information + real(wp), dimension(n), intent(out), optional :: scale ! if present, + ! returns the mc64 symmetric scaling + + integer, dimension(:), allocatable :: cperm ! used to hold matching + integer, dimension(:), allocatable :: ptr2 ! column pointers for expanded + ! matrix. + integer, dimension(:), allocatable :: row2 ! row indices for expanded matrix. + real(wp), dimension(:), allocatable :: val2 ! entries of expanded matrix. + real(wp), dimension(:), allocatable :: scale2 ! holds scaling factors + ! if scale is not present. + + integer :: i, j, k, ne + + info%compress_rank = 0 + info%flag = 0 + info%flag68 = 0 + info%stat = 0 + info%max_cycle = 0 + info%struct_rank = n + + ! check n has valid value + if (n < 0) then + info%flag = MC80_ERROR_A_N_OOR + return + end if + + ! check ord has valid value + if (ord < 1 .or. ord > 3) then + info%flag = MC80_ERROR_ORD_OOR + return + end if + + ! just return with no action if n = 0 + if (n.eq. 0) return + + ! + ! Take absolute values, expand out, removing any explicit zeroes + ! + ne = ptr(n+1) - 1 + allocate(ptr2(n+1), row2(2*ne), val2(2*ne), cperm(n), stat=info%stat) + if (info%stat.ne.0) then + info%flag = MC80_ERROR_ALLOCATION + return + end if + + k = 1 + do i = 1, n + ptr2(i) = k + do j = ptr(i), ptr(i+1)-1 + if (val(j).eq.zero) cycle + row2(k) = row(j) + val2(k) = abs(val(j)) + k = k + 1 + end do + end do + ptr2(n+1) = k + + call mc34_expand(n, row2, ptr2, cperm, a=val2) + + ! Compute matching and scaling + + if (present(scale)) then + call mc80_scale(n,ptr2,row2,val2,scale,control,info, & + perm=cperm) + else + allocate(scale2(n), stat=info%stat) + if (info%stat.ne.0) then + info%flag = MC80_ERROR_ALLOCATION + return + end if + call mc80_scale(n,ptr2,row2,val2,scale2,control,info, & + perm=cperm) + deallocate(scale2, stat=info%stat) + end if + deallocate(val2, stat=info%stat) + + if (info%flag.lt.0) return + + ! Note: row j is matched with column cperm(j) + ! + ! Split matching into 1- and 2-cycles only and then + ! compress matrix and order. + + call mc80_split(ord,n,row2,ptr2,order,cperm,control,info) + + if(present(scale)) scale(1:n) = exp( scale(1:n) ) + +end subroutine mc80_order_double + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +! +! This routine is the same as mc80_order EXCEPT on +! input ptr, row , val hold the ** lower AND upper ** triangular +! parts of the matrix. +! this reduces amount of copies of matrix required (so slightly +! more efficient on memory and does not need to expand supplied matrix) +! +subroutine mc80_order_full_double(ord, n, ptr, row, val, order, & + control, info, scale) + integer, intent(in) :: ord ! controls ordering on compressed matrix + ! 1 An approximate minimum degree ordering is used. + ! 2 A minimum degree ordering is used (as in MA27). + ! 3 METIS ordering with default settings is used. + integer, intent(in) :: n + integer, dimension(:), intent(in) :: ptr + integer, dimension(:), intent(in) :: row + real(wp), dimension(:), intent(in) :: val + integer, dimension(:), intent(out) :: order ! |order(i)| holds the position + ! of variable i in the elimination order (pivot sequence). If a + ! 1x1 pivot i is obtained, order(i)>0. If a + ! 2x2 pivot involving i and j is obtained, + ! order(i)<0, order(j)<0 and |order(j)|=|order(i)|+1. + type(mc80_control), intent(in) :: control + type (mc80_info), intent(out) :: info ! used to hold information + real(wp), dimension(n), intent(out), optional :: scale ! if present, + ! returns the mc64 symmetric scaling + + integer, dimension(:), allocatable :: cperm ! used to hold matching + integer, dimension(:), allocatable :: ptr2 ! column pointers for expanded + ! matrix. + integer, dimension(:), allocatable :: row2 ! row indices for expanded matrix + real(wp), dimension(:), allocatable :: val2 ! entries of expanded matrix. + real(wp), dimension(:), allocatable :: scale2 ! holds scaling factors + ! if scale is not present. + + integer :: i, j, k, ne + + info%compress_rank = 0 + info%flag = 0 + info%flag68 = 0 + info%stat = 0 + info%max_cycle = 0 + info%struct_rank = n + + ! check n has valid value + if (n < 0) then + info%flag = MC80_ERROR_A_N_OOR + return + end if + + ! check ord has valid value + if (ord < 1 .or. ord > 3) then + info%flag = MC80_ERROR_ORD_OOR + return + end if + + ! just return with no action if n = 0 + if (n.eq.0) return + + ! + ! Remove any explicit zeroes and take absolute values + ! + ne = ptr(n+1) - 1 + allocate(ptr2(n+1), row2(ne), val2(ne), cperm(n), stat=info%stat) + if (info%stat.ne.0) then + info%flag = MC80_ERROR_ALLOCATION + return + end if + + k = 1 + do i = 1, n + ptr2(i) = k + do j = ptr(i), ptr(i+1)-1 + if (val(j).eq.zero) cycle + row2(k) = row(j) + val2(k) = abs(val(j)) + k = k + 1 + end do + end do + ptr2(n+1) = k + + ! Compute matching and scaling + + if (present(scale)) then + call mc80_scale(n,ptr2,row2,val2,scale,control,info, & + perm=cperm) + else + allocate(scale2(n), stat=info%stat) + if (info%stat.ne.0) then + info%flag = MC80_ERROR_ALLOCATION + return + end if + call mc80_scale(n,ptr2,row2,val2,scale2,control,info, & + perm=cperm) + deallocate(scale2, stat=info%stat) + end if + deallocate(val2, stat=info%stat) + + if (info%flag.lt.0) return + + ! Note: row j is matched with column cperm(j) + ! write (*,'(a,15i4)') 'cperm',cperm(1:min(15,n)) + ! + ! Split matching into 1- and 2-cycles only and then + ! compress matrix and order. + + call mc80_split(ord,n,row2,ptr2,order,cperm,control,info) + + if(present(scale)) scale(1:n) = exp( scale(1:n) ) + +end subroutine mc80_order_full_double + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +! +! Split matching into 1- and 2-cycles only and then +! compress matrix and order using mc68. +! +! Input (ptr2, row2 , val2) holds the ** lower and upper triangles ** +! of the matrix (with explicit zeros removed). +! Overwritten in the singular case +! +subroutine mc80_split(ord,n,row2,ptr2,order,cperm,control,info) + integer, intent(in) :: ord ! controls choice of ordering algorithm + ! on compressed matrix + integer, intent(in) :: n + integer, dimension(:), intent(in) :: ptr2 + integer, dimension(:), intent(in) :: row2 + integer, dimension(n), intent(out) :: order ! used to hold ordering + integer, dimension(n), intent(inout) :: cperm ! used to hold matching + type (mc80_control), intent(in) :: control + type (mc80_info), intent(inout) :: info ! used to hold information + + type (mc68_control) :: control68 + type (mc68_info) :: info68 + + integer, dimension(:), allocatable :: iwork ! work array + integer, dimension(:), allocatable :: old_to_new, new_to_old + ! holds mapping between original matrix indices and those in condensed + ! matrix. + integer, dimension(:), allocatable :: ptr3 ! column pointers for condensed + ! matrix. + integer, dimension(:), allocatable :: row3 ! row indices for condensed + ! matrix. + + + integer :: csz ! current cycle length + integer :: i, j, j1, j2, jj, k, krow + integer :: max_csz ! maximum cycle length + integer :: ncomp ! order of compressed matrix + integer :: ncomp_matched ! order of compressed matrix (matched entries only) + integer :: ne ! number of non zeros + + ! Use iwork to track what has been matched: + ! -2 unmatched + ! -1 matched as singleton + ! 0 not yet seen + ! >0 matched with specified node + + ne = ptr2(n+1) - 1 + allocate(ptr3(n+1), row3(ne), old_to_new(n), new_to_old(n), iwork(n), & + stat=info%stat) + if (info%stat.ne.0) return + + iwork(1:n) = 0 + max_csz = 0 + do i = 1, n + if (iwork(i).ne.0) cycle + j = i + csz = 0 + do + if (cperm(j).eq.-1) then + ! unmatched by MC64 + iwork(j) = -2 + csz = csz + 1 + exit + else if (cperm(j).eq.i) then + ! match as singleton, unmatched or finished + iwork(j) = -1 + csz = csz + 1 + exit + end if + ! match j and cperm(j) + jj = cperm(j) + iwork(j) = jj + iwork(jj) = j + csz = csz + 2 + ! move onto next start of pair + j = cperm(jj) + if (j.eq.i) exit + end do + max_csz = max(max_csz, csz) + end do + info%max_cycle = max_csz + + ! Overwrite cperm with new matching + cperm(1:n) = iwork(1:n) + + ! + ! Build maps for new numbering schemes + ! + k = 1 + do i = 1,n + j = cperm(i) + if (control%unmatched_last .and. j.eq.-2) cycle + if (jncomp_matched) cycle ! unmatched row not participating + row3(jj) = krow + jj = jj + 1 + iwork(krow) = i + end do + if (j.gt.0) then + ! Also check column cperm(i) + do k = ptr2(j), ptr2(j+1)-1 + krow = old_to_new(row2(k)) + if (iwork(krow).eq.i) cycle ! already added to column + if (krow>ncomp_matched) cycle ! unmatched row not participating + row3(jj) = krow + jj = jj + 1 + iwork(krow) = i + end do + end if + ptr3(ncomp+1) = jj + ncomp = ncomp + 1 + end do + ncomp = ncomp - 1 + info%compress_rank = ncomp + + if(control%unmatched_last) ncomp = ncomp_matched + + ! store just lower triangular part for input to hsl_mc68 + ptr3(1) = 1 + jj = 1 + j1 = 1 + do i = 1, ncomp + j2 = ptr3(i+1) + do k = j1, j2-1 + krow = row3(k) + if ( krow.lt.i ) cycle ! already added to column + row3(jj) = krow + jj = jj + 1 + end do + ptr3(i+1) = jj + j1 = j2 + end do + + ! reorder the compressed matrix using hsl_mc68. + ! switch off hsl_mc68 printing + control68%lp = -1 + control68%wp = -1 + control68%mp = -1 + control68%print_level = -1 + call mc68_order(ord,ncomp,ptr3,row3,order,control68,info68) + + if (info68%flag < 0) then + info%flag68 = info68%flag + select case(info68%flag) + case(-1) + info%flag = MC80_ERROR_ALLOCATION + info%stat = info68%stat + case(-5) + info%flag = MC80_ERROR_NO_METIS + case default + info%flag = MC80_ERROR_MC68 + end select + return + end if + + do i = 1, ncomp + j = order(i) + iwork(j) = i + end do + + ! + ! Translate inverse permutation in iwork back to + ! permutation for original variables. + ! Set negative signs for 2x2 pivots (exploited by hsl_ma77). + ! + k = 1 + do i = 1, ncomp + j = new_to_old( iwork(i) ) + order(j) = k + k = k + 1 + if (cperm(j).gt.0) then + order(j) = -order(j) + j = cperm(j) + order(j) = -k + k = k + 1 + end if + end do + + ! Place unmatched columns last + if(control%unmatched_last) then + do i = ncomp+1, ncomp + (n-info%struct_rank) + j = new_to_old( i ) + order(j) = k + k = k + 1 + end do + endif + +end subroutine mc80_split + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +! +! Scale the matrix using MC64, accounting for singular matrices using the +! approach of Duff and Pralet +! +! Expects a full matrix as input +! +subroutine mc80_scale(n, ptr, row, val, scale, control, info, perm) + integer, intent(in) :: n + integer, dimension(:), intent(in) :: ptr + integer, dimension(:), intent(in) :: row + real(wp), dimension(:), intent(in) :: val + real(wp), dimension(n), intent(out) :: scale ! returns the symmetric scaling + type(mc80_control), intent(in) :: control + type(mc80_info), intent(inout) :: info ! used to hold information + integer, dimension(n), intent(out), optional :: perm ! if present, returns + ! the matching + + integer, dimension(:), allocatable :: ptr2 ! column pointers after + ! zeros removed. + integer, dimension(:), allocatable :: row2 ! row indices after zeros + ! removed. + real(wp), dimension(:), allocatable :: val2 ! matrix of absolute values + ! (zeros removed). + real(wp), dimension(:), allocatable :: cscale ! temporary copy of scaling + ! factors. Only needed if A rank deficient. allocated to have size n. + + integer :: i, j, k, ne + + info%struct_rank = n + + ! + ! Remove any explicit zeroes and take absolute values + ! + ne = ptr(n+1) - 1 + allocate(ptr2(n+1), row2(ne), val2(ne),stat=info%stat) + if (info%stat.ne.0) then + info%flag = MC80_ERROR_ALLOCATION + return + end if + + k = 1 + do i = 1, n + ptr2(i) = k + do j = ptr(i), ptr(i+1)-1 + if (val(j).eq.zero) cycle + row2(k) = row(j) + val2(k) = val(j) + k = k + 1 + end do + end do + ptr2(n+1) = k + + call mc80_match(n,row2,ptr2,val2,scale,control,info,perm=perm) + if (info%flag.lt.0) return + + if (info%struct_rank.ne.n) then + ! structurally singular case. At this point, scaling factors + ! for rows in corresponding to rank deficient part are set to + ! zero. The following is to set them according to Duff and Pralet. + deallocate(ptr2, stat=info%stat) + deallocate(row2, stat=info%stat) + deallocate(val2, stat=info%stat) + if(.not.control%unmatched_scale_zero) then + allocate(cscale(n),stat=info%stat) + if (info%stat.ne.0) then + info%flag = MC80_ERROR_ALLOCATION + return + end if + cscale(1:n) = scale(1:n) + do i = 1,n + if (cscale(i).ne.-huge(scale)) cycle + do j = ptr(i), ptr(i+1)-1 + k = row(j) + if (cscale(k).eq.-huge(scale)) cycle + scale(i) = max(scale(i), val(j)+scale(k)) + end do + if(scale(i).eq.-huge(scale)) then + scale(i) = zero + else + scale(i) = -scale(i) + endif + end do + end if + end if + +end subroutine mc80_scale + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +! +! Input (ptr2, row2 , val2) holds the ** lower and upper triangles ** +! of the matrix (with explicit zeros removed). +! val2 holds absolute values of matrix entries. +! Overwritten in the singular case +! +subroutine mc80_match(n,row2,ptr2,val2,scale,control,info,perm) + integer, intent(in) :: n + integer, dimension(:), intent(inout) :: ptr2 ! In singular case, overwritten + ! by column pointers for non singular part of matrix. + integer, dimension(:), intent(inout) :: row2 ! In singular case, overwritten + ! by row indices for non singular part of matrix. + real(wp), dimension(:), intent(inout) :: val2 ! In singular case, overwritten + ! by entries for non singular part of matrix. + real(wp), dimension(n), intent(out) :: scale ! returns the symmetric scaling + type(mc80_control), intent(in) :: control + type (mc80_info), intent(inout) :: info ! used to hold information + integer, dimension(n), intent(out), optional :: perm ! if present, returns + ! the matching + + integer, dimension(:), allocatable :: iwork ! work array + integer, dimension(:), allocatable :: cperm ! used to hold matching + integer, dimension(:), allocatable :: old_to_new, new_to_old + ! holds mapping between original matrix indices and those in reduced + ! non singular matrix. + real(wp), dimension(:), allocatable :: cmax ! (log) column maximum + real(wp), dimension(:), allocatable :: dw ! array used by mc64 + + integer :: i, j, j1, j2, jj, k + integer :: ne ! number of non zeros + integer :: nn ! Holds number of rows/cols in non singular part of matrix + integer :: nne ! Only used in singular case. Holds number of non zeros + ! in non-singular part of matrix. + integer :: rank ! returned by mc64 + real(wp) :: colmax ! max. entry in col. of expanded matrix + + allocate(iwork(5*n), cperm(n), dw(2*n), cmax(n), stat=info%stat) + if (info%stat.ne.0) then + info%flag = MC80_ERROR_ALLOCATION + return + end if + + ! Compute column maximums + do i = 1,n + colmax = max(zero,maxval(val2(ptr2(i):ptr2(i+1)-1))) + if (colmax.ne.zero) colmax = log(colmax) + cmax(i) = colmax + end do + + do i = 1,n + val2(ptr2(i):ptr2(i+1)-1) = cmax(i) - log(val2(ptr2(i):ptr2(i+1)-1)) + end do + + ne = ptr2(n+1)-1 + call mc64wd(n,ne,ptr2,row2,val2,cperm,rank, & + iwork(1),iwork(n+1),iwork(2*n+1),iwork(3*n+1),iwork(4*n+1), & + dw(1),dw(n+1)) + + if (rank.eq.n) then + do i = 1,n + scale(i) = (dw(i)+dw(n+i)-cmax(i))/2 + end do + if (present(perm)) perm(1:n) = cperm(1:n) + return + end if + + !!!! we have to handle the singular case. Either immediate exit + ! or set warning, squeeze out the unmatched entries and recall mc64wd. + + info%struct_rank = rank + if (.not.control%action) then + info%flag = MC80_ERROR_SINGULAR + return + end if + + info%flag = MC80_WARNING_SINGULAR + + allocate(old_to_new(n), new_to_old(n),stat=info%stat) + if (info%stat.ne.0) then + info%flag = MC80_ERROR_ALLOCATION + return + end if + + k = 0 + do i = 1,n + if (cperm(i) < 0) then + ! row i and col j are not part of the matching + old_to_new(i) = -1 + else + k = k + 1 + ! old_to_new(i) holds the new index for variable i after + ! removal of singular part and new_to_old(k) is the + ! original index for k + old_to_new(i) = k + new_to_old(k) = i + end if + end do + + ! Overwrite ptr2, row2 and val2 + nne = 0 + k = 0 + ptr2(1) = 1 + j2 = 1 + do i = 1,n + j1 = j2 + j2 = ptr2(i+1) + ! skip over unmatched entries + if (cperm(i) < 0) cycle + k = k + 1 + do j = j1,j2-1 + jj = row2(j) + if (cperm(jj) < 0) cycle + nne = nne + 1 + row2(nne) = old_to_new(jj) + val2(nne) = val2(j) + end do + ptr2(k+1) = nne + 1 + end do + ! nn is order of non-singular part. + nn = k + call mc64wd(nn,nne,ptr2,row2,val2,cperm,rank, & + iwork(1),iwork(nn+1),iwork(2*nn+1),iwork(3*nn+1),iwork(4*nn+1), & + dw(1),dw(nn+1)) + + do i = 1,n + j = old_to_new(i) + if (j < 0) then + scale(i) = -huge(scale) + else + ! Note: we need to subtract col max using old matrix numbering + scale(i) = (dw(j)+dw(nn+j)-cmax(i))/2 + end if + end do + + if (present(perm)) then + perm(1:n) = -1 + do i = 1,nn + j = cperm(i) + perm(new_to_old(i)) = new_to_old(j) + end do + end if + +end subroutine mc80_match + +!********************************************************************** +end module hsl_mc80_double diff --git a/coinhsl/common/deps90.lo b/coinhsl/common/deps90.lo new file mode 100644 index 0000000..4bc2db9 --- /dev/null +++ b/coinhsl/common/deps90.lo @@ -0,0 +1,12 @@ +# coinhsl/common/deps90.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4.6 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/deps90.o' + +# Name of the non-PIC object +non_pic_object=none + diff --git a/coinhsl/common/dump.f90 b/coinhsl/common/dump.f90 new file mode 100644 index 0000000..6fd139c --- /dev/null +++ b/coinhsl/common/dump.f90 @@ -0,0 +1,77 @@ +subroutine dump_mat(factidx, n, ne, row, col, a) + implicit none + + integer, intent(in) :: factidx, n, ne + integer, intent(in) :: row(ne), col(ne) + double precision, intent(in) :: a(ne) + + character(len=80) :: filename + character(len=72) :: title + character(len=8) :: key + integer :: icntl(10), info(5) + + integer :: i + integer, allocatable :: ip(:), ind(:), iw(:) + double precision, allocatable :: anew(:) + + icntl(1) = 12 ! unit number + icntl(2) = 17 ! output precision + icntl(3) = 1 ! values supplied (not just pattern) + icntl(4) = 0 ! symmetric matrix + icntl(5) = 1 ! coordinate form + + write(key, "(i8)") factidx + key = adjustl(key) + title = "IPOPT MA57 dump factorization number " // trim(key) + filename = "matrix." // trim(key) // ".rb" + open(icntl(1), file=filename, status="replace") + + allocate(ip(2*n+1), ind(2*ne), iw(n+1), anew(ne)) + ind(1:ne) = row(:) + ind(ne+1:2*ne) = col(:) + anew(:) = a(:) + + call mc54ad(icntl, title, key, n, n, ne, ip, ind, anew, iw, info) + + close(icntl(1)) +end subroutine dump_mat + +subroutine dump_mat_csc(factidx, n, ptr, row, a) + implicit none + + integer, intent(in) :: factidx, n + integer, intent(in) :: ptr(n+1), row(ptr(n+1)-1) + double precision, intent(in) :: a(ptr(n+1)-1) + + character(len=80) :: filename + character(len=72) :: title + character(len=8) :: key + integer :: icntl(10), info(5) + + integer :: i, ne + integer, allocatable :: ip(:), ind(:), iw(:) + double precision, allocatable :: anew(:) + + ne = ptr(n+1)-1 + + icntl(1) = 12 ! unit number + icntl(2) = 17 ! output precision + icntl(3) = 1 ! values supplied (not just pattern) + icntl(4) = 0 ! symmetric matrix + icntl(5) = 0 ! CSC form + + write(key, "(i8)") factidx + key = adjustl(key) + title = "IPOPT MA86 dump factorization number " // trim(key) + filename = "matrix." // trim(key) // ".rb" + open(icntl(1), file=filename, status="replace") + + allocate(ip(2*n+1), ind(2*ne), iw(n+1), anew(ne)) + ip(1:n+1) = ptr(1:n+1) + ind(1:ne) = row(:) + anew(:) = a(:) + + call mc54ad(icntl, title, key, n, n, ne, ip, ind, anew, iw, info) + + close(icntl(1)) +end subroutine dump_mat_csc diff --git a/coinhsl/compile b/coinhsl/compile new file mode 100755 index 0000000..531136b --- /dev/null +++ b/coinhsl/compile @@ -0,0 +1,347 @@ +#! /bin/sh +# Wrapper for compilers which do not understand '-c -o'. + +scriptversion=2012-10-14.11; # UTC + +# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# Written by Tom Tromey . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +nl=' +' + +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent tools from complaining about whitespace usage. +IFS=" "" $nl" + +file_conv= + +# func_file_conv build_file lazy +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. If the determined conversion +# type is listed in (the comma separated) LAZY, no conversion will +# take place. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv/,$2, in + *,$file_conv,*) + ;; + mingw/*) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin/*) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine/*) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_cl_dashL linkdir +# Make cl look for libraries in LINKDIR +func_cl_dashL () +{ + func_file_conv "$1" + if test -z "$lib_path"; then + lib_path=$file + else + lib_path="$lib_path;$file" + fi + linker_opts="$linker_opts -LIBPATH:$file" +} + +# func_cl_dashl library +# Do a library search-path lookup for cl +func_cl_dashl () +{ + lib=$1 + found=no + save_IFS=$IFS + IFS=';' + for dir in $lib_path $LIB + do + IFS=$save_IFS + if $shared && test -f "$dir/$lib.dll.lib"; then + found=yes + lib=$dir/$lib.dll.lib + break + fi + if test -f "$dir/$lib.lib"; then + found=yes + lib=$dir/$lib.lib + break + fi + if test -f "$dir/lib$lib.a"; then + found=yes + lib=$dir/lib$lib.a + break + fi + done + IFS=$save_IFS + + if test "$found" != yes; then + lib=$lib.lib + fi +} + +# func_cl_wrapper cl arg... +# Adjust compile command to suit cl +func_cl_wrapper () +{ + # Assume a capable shell + lib_path= + shared=: + linker_opts= + for arg + do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + eat=1 + case $2 in + *.o | *.[oO][bB][jJ]) + func_file_conv "$2" + set x "$@" -Fo"$file" + shift + ;; + *) + func_file_conv "$2" + set x "$@" -Fe"$file" + shift + ;; + esac + ;; + -I) + eat=1 + func_file_conv "$2" mingw + set x "$@" -I"$file" + shift + ;; + -I*) + func_file_conv "${1#-I}" mingw + set x "$@" -I"$file" + shift + ;; + -l) + eat=1 + func_cl_dashl "$2" + set x "$@" "$lib" + shift + ;; + -l*) + func_cl_dashl "${1#-l}" + set x "$@" "$lib" + shift + ;; + -L) + eat=1 + func_cl_dashL "$2" + ;; + -L*) + func_cl_dashL "${1#-L}" + ;; + -static) + shared=false + ;; + -Wl,*) + arg=${1#-Wl,} + save_ifs="$IFS"; IFS=',' + for flag in $arg; do + IFS="$save_ifs" + linker_opts="$linker_opts $flag" + done + IFS="$save_ifs" + ;; + -Xlinker) + eat=1 + linker_opts="$linker_opts $2" + ;; + -*) + set x "$@" "$1" + shift + ;; + *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) + func_file_conv "$1" + set x "$@" -Tp"$file" + shift + ;; + *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) + func_file_conv "$1" mingw + set x "$@" "$file" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift + done + if test -n "$linker_opts"; then + linker_opts="-link$linker_opts" + fi + exec "$@" $linker_opts + exit 1 +} + +eat= + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand '-c -o'. +Remove '-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file 'INSTALL'. + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) + func_cl_wrapper "$@" # Doesn't return... + ;; +esac + +ofile= +cfile= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + # So we strip '-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no '-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # '.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use '[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/coinhsl/config.guess b/coinhsl/config.guess new file mode 100755 index 0000000..b79252d --- /dev/null +++ b/coinhsl/config.guess @@ -0,0 +1,1558 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright 1992-2013 Free Software Foundation, Inc. + +timestamp='2013-06-10' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). +# +# Originally written by Per Bothner. +# +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD +# +# Please send patches with a ChangeLog entry to config-patches@gnu.org. + + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright 1992-2013 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +case "${UNAME_SYSTEM}" in +Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + + eval $set_cc_for_build + cat <<-EOF > $dummy.c + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #else + LIBC=gnu + #endif + EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` + ;; +esac + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + exitcode=$? + trap '' 0 + exit $exitcode ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux${UNAME_RELEASE} + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval $set_cc_for_build + SUN_ARCH="i386" + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH="x86_64" + fi + fi + echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=`/usr/bin/uname -p` + case ${UNAME_PROCESSOR} in + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW64*:*) + echo ${UNAME_MACHINE}-pc-mingw64 + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:MSYS*:*) + echo ${UNAME_MACHINE}-pc-msys + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + IA64) + echo ia64-unknown-interix${UNAME_RELEASE} + exit ;; + esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + 8664:Windows_NT:*) + echo x86_64-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + aarch64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC="gnulibc1" ; fi + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + arm*:Linux:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi + else + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf + fi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + cris:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-${LIBC} + exit ;; + crisv32:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-${LIBC} + exit ;; + frv:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + hexagon:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + i*86:Linux:*:*) + echo ${UNAME_MACHINE}-pc-linux-${LIBC} + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } + ;; + or1k:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + or32:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-${LIBC} + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-${LIBC} + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; + PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; + *) echo hppa-unknown-linux-${LIBC} ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-${LIBC} + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-${LIBC} + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-${LIBC} + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-${LIBC} + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux-${LIBC} + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + tile*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-${LIBC} + exit ;; + x86_64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configury will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + x86_64:Haiku:*:*) + echo x86_64-unknown-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + eval $set_cc_for_build + if test "$UNAME_PROCESSOR" = unknown ; then + UNAME_PROCESSOR=powerpc + fi + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + fi + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NEO-?:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk${UNAME_RELEASE} + exit ;; + NSE-*:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; + i*86:AROS:*:*) + echo ${UNAME_MACHINE}-pc-aros + exit ;; + x86_64:VMkernel:*:*) + echo ${UNAME_MACHINE}-unknown-esx + exit ;; +esac + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix\n"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + c34*) + echo c34-convex-bsd + exit ;; + c38*) + echo c38-convex-bsd + exit ;; + c4*) + echo c4-convex-bsd + exit ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/coinhsl/config.h.in b/coinhsl/config.h.in new file mode 100644 index 0000000..ccce53f --- /dev/null +++ b/coinhsl/config.h.in @@ -0,0 +1,102 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if MA27 is available. */ +#undef COINHSL_HAS_MA27 + +/* Define to 1 if MA28 is available. */ +#undef COINHSL_HAS_MA28 + +/* Define to 1 if MA57 is available. */ +#undef COINHSL_HAS_MA57 + +/* Define to 1 if MA77 is available. */ +#undef COINHSL_HAS_MA77 + +/* Define to 1 if MA86 is available. */ +#undef COINHSL_HAS_MA86 + +/* Define to 1 if MA97 is available. */ +#undef COINHSL_HAS_MA97 + +/* Define to 1 if MC19 is available. */ +#undef COINHSL_HAS_MC19 + +/* Define to 1 if MC68 is available. */ +#undef COINHSL_HAS_MC68 + +/* Define to 1 if METIS is available to compile. */ +#undef COINHSL_HAS_METIS + +/* Define to dummy `main' function (if any) required to link to the Fortran + libraries. */ +#undef F77_DUMMY_MAIN + +/* Define if F77 and FC dummy `main' functions are identical. */ +#undef FC_DUMMY_MAIN_EQ_F77 + +/* Define if you have a BLAS library. */ +#undef HAVE_BLAS + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_WINDOWS_H + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#undef LT_OBJDIR + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Version number of package */ +#undef VERSION diff --git a/coinhsl/config.sub b/coinhsl/config.sub new file mode 100755 index 0000000..9633db7 --- /dev/null +++ b/coinhsl/config.sub @@ -0,0 +1,1791 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright 1992-2013 Free Software Foundation, Inc. + +timestamp='2013-08-10' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). + + +# Please send patches with a ChangeLog entry to config-patches@gnu.org. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright 1992-2013 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ + linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ + knetbsd*-gnu* | netbsd*-gnu* | \ + kopensolaris*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + android-linux) + os=-linux-android + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray | -microblaze*) + os= + basic_machine=$1 + ;; + -bluegene*) + os=-cnk + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*178) + os=-lynxos178 + ;; + -lynx*5) + os=-lynxos5 + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | aarch64 | aarch64_be \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arceb \ + | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ + | avr | avr32 \ + | be32 | be64 \ + | bfin \ + | c4x | c8051 | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | epiphany \ + | fido | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | hexagon \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | le32 | le64 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipsr5900 | mipsr5900el \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nds32 | nds32le | nds32be \ + | nios | nios2 | nios2eb | nios2el \ + | ns16k | ns32k \ + | open8 \ + | or1k | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle \ + | pyramid \ + | rl78 | rx \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu \ + | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ + | ubicom32 \ + | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ + | we32k \ + | x86 | xc16x | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + c54x) + basic_machine=tic54x-unknown + ;; + c55x) + basic_machine=tic55x-unknown + ;; + c6x) + basic_machine=tic6x-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + strongarm | thumb | xscale) + basic_machine=arm-unknown + ;; + xgate) + basic_machine=$basic_machine-unknown + os=-none + ;; + xscaleeb) + basic_machine=armeb-unknown + ;; + + xscaleel) + basic_machine=armel-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | aarch64-* | aarch64_be-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | be32-* | be64-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* \ + | c8051-* | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | hexagon-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | le32-* | le64-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ + | microblaze-* | microblazeel-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipsr5900-* | mipsr5900el-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nds32-* | nds32le-* | nds32be-* \ + | nios-* | nios2-* | nios2eb-* | nios2el-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | open8-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ + | pyramid-* \ + | rl78-* | romp-* | rs6000-* | rx-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ + | tahoe-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tile*-* \ + | tron-* \ + | ubicom32-* \ + | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ + | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; + c54x-*) + basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c55x-*) + basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c6x-*) + basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16 | cr16-*) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + microblaze*) + basic_machine=microblaze-xilinx + ;; + mingw64) + basic_machine=x86_64-pc + os=-mingw64 + ;; + mingw32) + basic_machine=i686-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + msys) + basic_machine=i686-pc + os=-msys + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + nacl) + basic_machine=le32-unknown + os=-nacl + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + neo-tandem) + basic_machine=neo-tandem + ;; + nse-tandem) + basic_machine=nse-tandem + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc | ppcbe) basic_machine=powerpc-unknown + ;; + ppc-* | ppcbe-*) + basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + os=-rdos + ;; + rdos32) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + strongarm-* | thumb-*) + basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tile*) + basic_machine=$basic_machine-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + xscale-* | xscalee[bl]-*) + basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + z80-*-coff) + basic_machine=z80-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -auroraux) + os=-auroraux + ;; + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* | -plan9* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -bitrig* | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* \ + | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ + | -linux-newlib* | -linux-musl* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -nacl*) + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + c8051-*) + os=-elf + ;; + hexagon-*) + os=-elf + ;; + tic54x-*) + os=-coff + ;; + tic55x-*) + os=-coff + ;; + tic6x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or1k-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -cnk*|-aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/coinhsl/configure b/coinhsl/configure new file mode 100755 index 0000000..047225b --- /dev/null +++ b/coinhsl/configure @@ -0,0 +1,22805 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.69 for coinhsl 2015.06.23. +# +# Report bugs to . +# +# +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 + + test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ + || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and hsl@stfc.ac.uk +$0: about your system, including any error possibly output +$0: before this message. Then install a modern shell, or +$0: manually run the script under such a shell if you do +$0: have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + +SHELL=${CONFIG_SHELL-/bin/sh} + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='coinhsl' +PACKAGE_TARNAME='coinhsl' +PACKAGE_VERSION='2015.06.23' +PACKAGE_STRING='coinhsl 2015.06.23' +PACKAGE_BUGREPORT='hsl@stfc.ac.uk' +PACKAGE_URL='' + +ac_unique_file="hsl_ma86/hsl_ma86d.f90" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +BLAS_LIBS +FLIBS +TARGET_DLL_FALSE +TARGET_DLL_TRUE +HAVE_METIS_FALSE +HAVE_METIS_TRUE +HAVE_MC68_FALSE +HAVE_MC68_TRUE +HAVE_MA97_FALSE +HAVE_MA97_TRUE +HAVE_MA86_FALSE +HAVE_MA86_TRUE +HAVE_MA77_FALSE +HAVE_MA77_TRUE +HAVE_MA57_FALSE +HAVE_MA57_TRUE +HAVE_MA28_FALSE +HAVE_MA28_TRUE +HAVE_MA27_FALSE +HAVE_MA27_TRUE +HAVE_MC19_FALSE +HAVE_MC19_TRUE +CPP +OTOOL64 +OTOOL +LIPO +NMEDIT +DSYMUTIL +MANIFEST_TOOL +RANLIB +ac_ct_AR +AR +DLLTOOL +OBJDUMP +LN_S +NM +ac_ct_DUMPBIN +DUMPBIN +LD +FGREP +EGREP +GREP +SED +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +LIBTOOL +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +ac_ct_CC +CPPFLAGS +CFLAGS +CC +ac_ct_F77 +FFLAGS +F77 +OBJEXT +EXEEXT +ac_ct_FC +LDFLAGS +FCFLAGS +FC +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +runstatedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_silent_rules +enable_dependency_tracking +enable_shared +enable_static +with_pic +enable_fast_install +with_gnu_ld +with_sysroot +enable_libtool_lock +with_blas +' + ac_precious_vars='build_alias +host_alias +target_alias +FC +FCFLAGS +LDFLAGS +LIBS +F77 +FFLAGS +CC +CFLAGS +CPPFLAGS +CPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir runstatedir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures coinhsl 2015.06.23 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/coinhsl] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of coinhsl 2015.06.23:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --enable-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build + --enable-shared[=PKGS] build shared libraries [default=yes] + --enable-static[=PKGS] build static libraries [default=yes] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --disable-libtool-lock avoid locking (might break parallel builds) + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use + both] + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-sysroot=DIR Search for dependent libraries within DIR + (or the compiler's sysroot if not specified). + --with-blas= use BLAS library + +Some influential environment variables: + FC Fortran compiler command + FCFLAGS Fortran compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + F77 Fortran 77 compiler command + FFLAGS Fortran 77 compiler flags + CC C compiler command + CFLAGS C compiler flags + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +coinhsl configure 2015.06.23 +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_fc_try_compile LINENO +# --------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_fc_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_fc_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_fc_try_compile + +# ac_fn_f77_try_compile LINENO +# ---------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_f77_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_f77_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_f77_try_compile + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# ac_fn_f77_try_link LINENO +# ------------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_f77_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_f77_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_f77_try_link + +# ac_fn_fc_try_link LINENO +# ------------------------ +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_fc_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_fc_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_fc_try_link + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +( $as_echo "## ----------------------------- ## +## Report this to hsl@stfc.ac.uk ## +## ----------------------------- ##" + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by coinhsl $as_me 2015.06.23, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + +am__api_version='1.15' + +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if ${ac_cv_path_mkdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='coinhsl' + VERSION='2015.06.23' + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +mkdir_p='$(MKDIR_P)' + +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar pax cpio none' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + + + + + + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 + fi +fi + + +# check for required programs +ac_ext=${ac_fc_srcext-f} +ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' +ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_fc_compiler_gnu +if test -n "$ac_tool_prefix"; then + for ac_prog in gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor xlf90 f90 pgf90 pghpf epcf90 g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_FC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$FC"; then + ac_cv_prog_FC="$FC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_FC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +FC=$ac_cv_prog_FC +if test -n "$FC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FC" >&5 +$as_echo "$FC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$FC" && break + done +fi +if test -z "$FC"; then + ac_ct_FC=$FC + for ac_prog in gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor xlf90 f90 pgf90 pghpf epcf90 g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_FC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_FC"; then + ac_cv_prog_ac_ct_FC="$ac_ct_FC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_FC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_FC=$ac_cv_prog_ac_ct_FC +if test -n "$ac_ct_FC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_FC" >&5 +$as_echo "$ac_ct_FC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_FC" && break +done + + if test "x$ac_ct_FC" = x; then + FC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + FC=$ac_ct_FC + fi +fi + + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done +rm -f a.out + +cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the Fortran compiler works" >&5 +$as_echo_n "checking whether the Fortran compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "Fortran compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran compiler default output file name" >&5 +$as_echo_n "checking for Fortran compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat > conftest.$ac_ext <<_ACEOF + program main + open(unit=9,file='conftest.out') + close(unit=9) + + end +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run Fortran compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +# If we don't use `.F' as extension, the preprocessor is not run on the +# input file. (Note that this only needs to work for GNU compilers.) +ac_save_ext=$ac_ext +ac_ext=F +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU Fortran compiler" >&5 +$as_echo_n "checking whether we are using the GNU Fortran compiler... " >&6; } +if ${ac_cv_fc_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat > conftest.$ac_ext <<_ACEOF + program main +#ifndef __GNUC__ + choke me +#endif + + end +_ACEOF +if ac_fn_fc_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_fc_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_compiler_gnu" >&5 +$as_echo "$ac_cv_fc_compiler_gnu" >&6; } +ac_ext=$ac_save_ext +ac_test_FCFLAGS=${FCFLAGS+set} +ac_save_FCFLAGS=$FCFLAGS +FCFLAGS= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $FC accepts -g" >&5 +$as_echo_n "checking whether $FC accepts -g... " >&6; } +if ${ac_cv_prog_fc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + FCFLAGS=-g +cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +if ac_fn_fc_try_compile "$LINENO"; then : + ac_cv_prog_fc_g=yes +else + ac_cv_prog_fc_g=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_fc_g" >&5 +$as_echo "$ac_cv_prog_fc_g" >&6; } +if test "$ac_test_FCFLAGS" = set; then + FCFLAGS=$ac_save_FCFLAGS +elif test $ac_cv_prog_fc_g = yes; then + if test "x$ac_cv_fc_compiler_gnu" = xyes; then + FCFLAGS="-g -O2" + else + FCFLAGS="-g" + fi +else + if test "x$ac_cv_fc_compiler_gnu" = xyes; then + FCFLAGS="-O2" + else + FCFLAGS= + fi +fi + +if test $ac_compiler_gnu = yes; then + GFC=yes +else + GFC= +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +# Set f77 compiler to be same as f90 compiler unless explcitly told otherwise +if test "x$F77" = "x"; then + F77="$FC" +fi +if test "x$FFLAGS" = "x"; then + FFLAGS="$FCFLAGS" +fi +ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu +if test -n "$ac_tool_prefix"; then + for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$F77"; then + ac_cv_prog_F77="$F77" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_F77="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +F77=$ac_cv_prog_F77 +if test -n "$F77"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $F77" >&5 +$as_echo "$F77" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$F77" && break + done +fi +if test -z "$F77"; then + ac_ct_F77=$F77 + for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_F77"; then + ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_F77="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_F77=$ac_cv_prog_ac_ct_F77 +if test -n "$ac_ct_F77"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_F77" >&5 +$as_echo "$ac_ct_F77" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_F77" && break +done + + if test "x$ac_ct_F77" = x; then + F77="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + F77=$ac_ct_F77 + fi +fi + + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran 77 compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done +rm -f a.out + +# If we don't use `.F' as extension, the preprocessor is not run on the +# input file. (Note that this only needs to work for GNU compilers.) +ac_save_ext=$ac_ext +ac_ext=F +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU Fortran 77 compiler" >&5 +$as_echo_n "checking whether we are using the GNU Fortran 77 compiler... " >&6; } +if ${ac_cv_f77_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat > conftest.$ac_ext <<_ACEOF + program main +#ifndef __GNUC__ + choke me +#endif + + end +_ACEOF +if ac_fn_f77_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_f77_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_f77_compiler_gnu" >&5 +$as_echo "$ac_cv_f77_compiler_gnu" >&6; } +ac_ext=$ac_save_ext +ac_test_FFLAGS=${FFLAGS+set} +ac_save_FFLAGS=$FFLAGS +FFLAGS= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $F77 accepts -g" >&5 +$as_echo_n "checking whether $F77 accepts -g... " >&6; } +if ${ac_cv_prog_f77_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + FFLAGS=-g +cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +if ac_fn_f77_try_compile "$LINENO"; then : + ac_cv_prog_f77_g=yes +else + ac_cv_prog_f77_g=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_f77_g" >&5 +$as_echo "$ac_cv_prog_f77_g" >&6; } +if test "$ac_test_FFLAGS" = set; then + FFLAGS=$ac_save_FFLAGS +elif test $ac_cv_prog_f77_g = yes; then + if test "x$ac_cv_f77_compiler_gnu" = xyes; then + FFLAGS="-g -O2" + else + FFLAGS="-g" + fi +else + if test "x$ac_cv_f77_compiler_gnu" = xyes; then + FFLAGS="-O2" + else + FFLAGS= + fi +fi + +if test $ac_compiler_gnu = yes; then + G77=yes +else + G77= +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + +case `pwd` in + *\ * | *\ *) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac + + + +macro_version='2.4.2' +macro_revision='1.3337' + + + + + + + + + + + + + +ltmain="$ac_aux_dir/ltmain.sh" + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +$as_echo_n "checking how to print strings... " >&6; } +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "" +} + +case "$ECHO" in + printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +$as_echo "printf" >&6; } ;; + print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +$as_echo "print -r" >&6; } ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +$as_echo "cat" >&6; } ;; +esac + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${ac_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_SED" || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +$as_echo_n "checking for fgrep... " >&6; } +if ${ac_cv_path_FGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in fgrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_FGREP" || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_FGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_FGREP=$FGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +$as_echo "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +test -z "$GREP" && GREP=grep + + + + + + + + + + + + + + + + + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if ${lt_cv_path_NM+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +$as_echo "$lt_cv_path_NM" >&6; } +if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + if test -n "$ac_tool_prefix"; then + for ac_prog in dumpbin "link -dump" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DUMPBIN"; then + ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DUMPBIN=$ac_cv_prog_DUMPBIN +if test -n "$DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +$as_echo "$DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$DUMPBIN" && break + done +fi +if test -z "$DUMPBIN"; then + ac_ct_DUMPBIN=$DUMPBIN + for ac_prog in dumpbin "link -dump" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DUMPBIN"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +if test -n "$ac_ct_DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +$as_echo "$ac_ct_DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_DUMPBIN" && break +done + + if test "x$ac_ct_DUMPBIN" = x; then + DUMPBIN=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DUMPBIN=$ac_ct_DUMPBIN + fi +fi + + case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols" + ;; + *) + DUMPBIN=: + ;; + esac + fi + + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +$as_echo_n "checking the name lister ($NM) interface... " >&6; } +if ${lt_cv_nm_interface+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: output\"" >&5) + cat conftest.out >&5 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +$as_echo "$lt_cv_nm_interface" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + +# find the maximum length of command line arguments +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if ${lt_cv_sys_max_cmd_len+:} false; then : + $as_echo_n "(cached) " >&6 +else + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac + +fi + +if test -n $lt_cv_sys_max_cmd_len ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } +fi +max_cmd_len=$lt_cv_sys_max_cmd_len + + + + + + +: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 +$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } +# Try some XSI features +xsi_shell=no +( _lt_dummy="a/b/c" + test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ + = c,a/b,b/c, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 +$as_echo "$xsi_shell" >&6; } + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 +$as_echo_n "checking whether the shell understands \"+=\"... " >&6; } +lt_shell_append=no +( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ + >/dev/null 2>&1 \ + && lt_shell_append=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 +$as_echo "$lt_shell_append" >&6; } + + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi + + + + + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +$as_echo_n "checking how to convert $build file names to $host format... " >&6; } +if ${lt_cv_to_host_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac + +fi + +to_host_file_cmd=$lt_cv_to_host_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +$as_echo "$lt_cv_to_host_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } +if ${lt_cv_to_tool_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + #assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac + +fi + +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +$as_echo "$lt_cv_to_tool_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if ${lt_cv_ld_reload_flag+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +$as_echo "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + if test "$GCC" != yes; then + reload_cmds=false + fi + ;; + darwin*) + if test "$GCC" = yes; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +$as_echo_n "checking how to recognize dependent libraries... " >&6; } +if ${lt_cv_deplibs_check_method+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given extended regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[4-9]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. + if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + + + + + + + + + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +$as_echo_n "checking how to associate runtime and link libraries... " >&6; } +if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh + # decide which to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd="$ECHO" + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + + + + + + + + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} +: ${AR_FLAGS=cru} + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +$as_echo_n "checking for archiver @FILE support... " >&6; } +if ${lt_cv_ar_at_file+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ar_at_file=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -eq 0; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -ne 0; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +$as_echo "$lt_cv_ar_at_file" >&6; } + +if test "x$lt_cv_ar_at_file" = xno; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +test -z "$STRIP" && STRIP=: + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +test -z "$RANLIB" && RANLIB=: + + + + + + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +if ${lt_cv_sys_global_symbol_pipe+:} false; then : + $as_echo_n "(cached) " >&6 +else + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[ABCDGISTW]' + ;; +hpux*) + if test "$host_cpu" = ia64; then + symcode='[ABCDEGRST]' + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function + # and D for any global variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK '"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 + (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +$as_echo "failed" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +$as_echo_n "checking for sysroot... " >&6; } + +# Check whether --with-sysroot was given. +if test "${with_sysroot+set}" = set; then : + withval=$with_sysroot; +else + with_sysroot=no +fi + + +lt_sysroot= +case ${with_sysroot} in #( + yes) + if test "$GCC" = yes; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 +$as_echo "${with_sysroot}" >&6; } + as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 + ;; +esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +$as_echo "${lt_sysroot:-no}" >&6; } + + + + + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +fi + +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + powerpcle-*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if ${lt_cv_cc_needs_belf+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_cc_needs_belf=yes +else + lt_cv_cc_needs_belf=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD="${LD-ld}_sol2" + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks="$enable_libtool_lock" + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. +set dummy ${ac_tool_prefix}mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MANIFEST_TOOL"; then + ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL +if test -n "$MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +$as_echo "$MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_MANIFEST_TOOL"; then + ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL + # Extract the first word of "mt", so it can be a program name with args. +set dummy mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_MANIFEST_TOOL"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL +if test -n "$ac_ct_MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_MANIFEST_TOOL" = x; then + MANIFEST_TOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + fi +else + MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" +fi + +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if ${lt_cv_path_mainfest_tool+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&5 + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +$as_echo "$lt_cv_path_mainfest_tool" >&6; } +if test "x$lt_cv_path_mainfest_tool" != xyes; then + MANIFEST_TOOL=: +fi + + + + + + + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +$as_echo "$DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +$as_echo "$ac_ct_DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +$as_echo "$NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +$as_echo "$ac_ct_NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +set dummy ${ac_tool_prefix}lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$LIPO"; then + ac_cv_prog_LIPO="$LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +LIPO=$ac_cv_prog_LIPO +if test -n "$LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +$as_echo "$LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_LIPO"; then + ac_ct_LIPO=$LIPO + # Extract the first word of "lipo", so it can be a program name with args. +set dummy lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_LIPO"; then + ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_LIPO="lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO +if test -n "$ac_ct_LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +$as_echo "$ac_ct_LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_LIPO" = x; then + LIPO=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + LIPO=$ac_ct_LIPO + fi +else + LIPO="$ac_cv_prog_LIPO" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL"; then + ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL=$ac_cv_prog_OTOOL +if test -n "$OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +$as_echo "$OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL"; then + ac_ct_OTOOL=$OTOOL + # Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL"; then + ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL="otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL +if test -n "$ac_ct_OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +$as_echo "$ac_ct_OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL" = x; then + OTOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL=$ac_ct_OTOOL + fi +else + OTOOL="$ac_cv_prog_OTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL64"; then + ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL64=$ac_cv_prog_OTOOL64 +if test -n "$OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +$as_echo "$OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL64"; then + ac_ct_OTOOL64=$OTOOL64 + # Extract the first word of "otool64", so it can be a program name with args. +set dummy otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL64"; then + ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +if test -n "$ac_ct_OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +$as_echo "$ac_ct_OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL64" = x; then + OTOOL64=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL64=$ac_ct_OTOOL64 + fi +else + OTOOL64="$ac_cv_prog_OTOOL64" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +$as_echo_n "checking for -single_module linker flag... " >&6; } +if ${lt_cv_apple_cc_single_mod+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&5 + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test $_lt_result -eq 0; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +$as_echo "$lt_cv_apple_cc_single_mod" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +if ${lt_cv_ld_exported_symbols_list+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_ld_exported_symbols_list=yes +else + lt_cv_ld_exported_symbols_list=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +$as_echo_n "checking for -force_load linker flag... " >&6; } +if ${lt_cv_ld_force_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 + echo "$AR cru libconftest.a conftest.o" >&5 + $AR cru libconftest.a conftest.o 2>&5 + echo "$RANLIB libconftest.a" >&5 + $RANLIB libconftest.a 2>&5 + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&5 + elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&5 + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +$as_echo "$lt_cv_ld_force_load" >&6; } + case $host_os in + rhapsody* | darwin1.[012]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[91]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[012]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_header in dlfcn.h +do : + ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +" +if test "x$ac_cv_header_dlfcn_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_DLFCN_H 1 +_ACEOF + +fi + +done + + + + +func_stripname_cnf () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + esac +} # func_stripname_cnf + + + + + + +# Set options + + + + enable_dlopen=no + + + enable_win32_dll=no + + + # Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then : + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_shared=yes +fi + + + + + + + + + + # Check whether --enable-static was given. +if test "${enable_static+set}" = set; then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_static=yes +fi + + + + + + + + + + +# Check whether --with-pic was given. +if test "${with_pic+set}" = set; then : + withval=$with_pic; lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for lt_pkg in $withval; do + IFS="$lt_save_ifs" + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + pic_mode=default +fi + + +test -z "$pic_mode" && pic_mode=default + + + + + + + + # Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then : + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_fast_install=yes +fi + + + + + + + + + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ltmain" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +test -z "$LN_S" && LN_S="ln -s" + + + + + + + + + + + + + + +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if ${lt_cv_objdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +$as_echo "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +cat >>confdefs.h <<_ACEOF +#define LT_OBJDIR "$lt_cv_objdir/" +_ACEOF + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld="$lt_cv_prog_gnu_ld" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` + + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/${ac_tool_prefix}file; then + lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/file; then + lt_cv_path_MAGIC_CMD="$ac_dir/file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +# Use C for the default configuration in the libtool script + +lt_save_CC="$CC" +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + +lt_prog_compiler_no_builtin_flag= + +if test "$GCC" = yes; then + case $cc_basename in + nvcc*) + lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; + *) + lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + + + + + + + lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + + + if test "$GCC" = yes; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl='-Xlinker ' + if test -n "$lt_prog_compiler_pic"; then + lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='--shared' + lt_prog_compiler_static='--static' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + *Sun\ F* | *Sun*Fortran*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Intel*\ [CF]*Compiler*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + *Portland\ Group*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +$as_echo "$lt_cv_prog_compiler_pic" >&6; } +lt_prog_compiler_pic=$lt_cv_prog_compiler_pic + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if ${lt_cv_prog_compiler_pic_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works" = xyes; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi + + + + + + + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +$as_echo "$lt_cv_prog_compiler_static_works" >&6; } + +if test x"$lt_cv_prog_compiler_static_works" = xyes; then + : +else + lt_prog_compiler_static= +fi + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag= + always_export_symbols=no + archive_cmds= + archive_expsym_cmds= + compiler_needs_object=no + enable_shared_with_static_runtimes=no + export_dynamic_flag_spec= + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic=no + hardcode_direct=no + hardcode_direct_absolute=no + hardcode_libdir_flag_spec= + hardcode_libdir_separator= + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + inherit_rpath=no + link_all_deplibs=unknown + module_cmds= + module_expsym_cmds= + old_archive_from_new_cmds= + old_archive_from_expsyms_cmds= + thread_safe_flag_spec= + whole_archive_flag_spec= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu | gnu*) + link_all_deplibs=no + ;; + esac + + ld_shlibs=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test "$with_gnu_ld" = yes; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test "$lt_use_gnu_ld_interface" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + export_dynamic_flag_spec='${wl}--export-all-symbols' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + haiku*) + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + link_all_deplibs=yes + ;; + + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = no; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global + # defined symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_direct_absolute=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + file_list_spec='${wl}-f,' + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + link_all_deplibs=no + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + export_dynamic_flag_spec='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' ${wl}-bernotok' + allow_undefined_flag=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + fi + archive_cmds_need_lc=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + always_export_symbols=yes + file_list_spec='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, )='true' + enable_shared_with_static_runtimes=yes + exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds='chmod 644 $oldlib' + postlink_cmds='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + enable_shared_with_static_runtimes=yes + ;; + esac + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + if test "$lt_cv_ld_force_load" = "yes"; then + whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec='' + fi + link_all_deplibs=yes + allow_undefined_flag="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=func_echo_all + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + + else + ld_shlibs=no + fi + + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +$as_echo_n "checking if $CC understands -b... " >&6; } +if ${lt_cv_prog_compiler__b+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler__b=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -b" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler__b=yes + fi + else + lt_cv_prog_compiler__b=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +$as_echo "$lt_cv_prog_compiler__b" >&6; } + +if test x"$lt_cv_prog_compiler__b" = xyes; then + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' +fi + + ;; + esac + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if ${lt_cv_irix_exported_symbol+:} false; then : + $as_echo_n "(cached) " >&6 +else + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int foo (void) { return 0; } +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_irix_exported_symbol=yes +else + lt_cv_irix_exported_symbol=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +$as_echo "$lt_cv_irix_exported_symbol" >&6; } + if test "$lt_cv_irix_exported_symbol" = yes; then + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + fi + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + inherit_rpath=yes + link_all_deplibs=yes + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + hardcode_shlibpath_var=no + hardcode_direct_absolute=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + else + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + archive_cmds_need_lc='no' + hardcode_libdir_separator=: + ;; + + solaris*) + no_undefined_flag=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' + archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='${wl}' + archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag='${wl}-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='${wl}-z,text' + allow_undefined_flag='${wl}-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-R,$libdir' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + + if test x$host_vendor = xsni; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec='${wl}-Blargedynsym' + ;; + esac + fi + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +$as_echo "$ld_shlibs" >&6; } +test "$ld_shlibs" = no && can_build_shared=no + +with_gnu_ld=$with_gnu_ld + + + + + + + + + + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } + archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; + *) lt_sed_strip_eq="s,=/,/,g" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's,/\([A-Za-z]:\),\1,g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test "X$hardcode_automatic" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$hardcode_direct" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && + test "$hardcode_minus_L" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +$as_echo "$hardcode_action" >&6; } + +if test "$hardcode_action" = relink || + test "$inherit_rpath" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if ${ac_cv_lib_dld_shl_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_shl_load=yes +else + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" +else + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if ${ac_cv_lib_svld_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_svld_dlopen=yes +else + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if ${ac_cv_lib_dld_dld_link+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (); +int +main () +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_dld_link=yes +else + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes; then : + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self_static+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + + + + + + + + + + + + + + + + +striplib= +old_striplib= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + + + + + + + + + + + + + # Report which library types will actually be built + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[4-9]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + + + + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + + + ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu + +if test -z "$F77" || test "X$F77" = "Xno"; then + _lt_disable_F77=yes +fi + +archive_cmds_need_lc_F77=no +allow_undefined_flag_F77= +always_export_symbols_F77=no +archive_expsym_cmds_F77= +export_dynamic_flag_spec_F77= +hardcode_direct_F77=no +hardcode_direct_absolute_F77=no +hardcode_libdir_flag_spec_F77= +hardcode_libdir_separator_F77= +hardcode_minus_L_F77=no +hardcode_automatic_F77=no +inherit_rpath_F77=no +module_cmds_F77= +module_expsym_cmds_F77= +link_all_deplibs_F77=unknown +old_archive_cmds_F77=$old_archive_cmds +reload_flag_F77=$reload_flag +reload_cmds_F77=$reload_cmds +no_undefined_flag_F77= +whole_archive_flag_spec_F77= +enable_shared_with_static_runtimes_F77=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +objext_F77=$objext + +# No sense in running all these tests if we already determined that +# the F77 compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_F77" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + + # save warnings/boilerplate of simple test code + ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + + ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${F77-"f77"} + CFLAGS=$FFLAGS + compiler=$CC + compiler_F77=$CC + for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` + + GCC=$G77 + if test -n "$compiler"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[4-9]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + + GCC_F77="$G77" + LD_F77="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + lt_prog_compiler_wl_F77= +lt_prog_compiler_pic_F77= +lt_prog_compiler_static_F77= + + + if test "$GCC" = yes; then + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_static_F77='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_F77='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic_F77='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic_F77='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_F77='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static_F77= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_F77='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared_F77=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_F77='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_F77=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic_F77='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl_F77='-Xlinker ' + if test -n "$lt_prog_compiler_pic_F77"; then + lt_prog_compiler_pic_F77="-Xcompiler $lt_prog_compiler_pic_F77" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl_F77='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_F77='-Bstatic' + else + lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_F77='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl_F77='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_F77='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static_F77='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl_F77='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static_F77='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-fPIC' + lt_prog_compiler_static_F77='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='--shared' + lt_prog_compiler_static_F77='--static' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl_F77='-Wl,-Wl,,' + lt_prog_compiler_pic_F77='-PIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-fpic' + lt_prog_compiler_static_F77='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl_F77='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static_F77='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-qpic' + lt_prog_compiler_static_F77='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + lt_prog_compiler_wl_F77='' + ;; + *Sun\ F* | *Sun*Fortran*) + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + lt_prog_compiler_wl_F77='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + lt_prog_compiler_wl_F77='-Wl,' + ;; + *Intel*\ [CF]*Compiler*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-fPIC' + lt_prog_compiler_static_F77='-static' + ;; + *Portland\ Group*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-fpic' + lt_prog_compiler_static_F77='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_F77='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl_F77='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static_F77='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static_F77='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + lt_prog_compiler_wl_F77='-Qoption ld ';; + *) + lt_prog_compiler_wl_F77='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl_F77='-Qoption ld ' + lt_prog_compiler_pic_F77='-PIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic_F77='-Kconform_pic' + lt_prog_compiler_static_F77='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_can_build_shared_F77=no + ;; + + uts4*) + lt_prog_compiler_pic_F77='-pic' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared_F77=no + ;; + esac + fi + +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_F77= + ;; + *) + lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic_F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_F77=$lt_prog_compiler_pic_F77 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_F77" >&5 +$as_echo "$lt_cv_prog_compiler_pic_F77" >&6; } +lt_prog_compiler_pic_F77=$lt_cv_prog_compiler_pic_F77 + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_F77"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... " >&6; } +if ${lt_cv_prog_compiler_pic_works_F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works_F77=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_F77" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_F77=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_F77" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works_F77" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works_F77" = xyes; then + case $lt_prog_compiler_pic_F77 in + "" | " "*) ;; + *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;; + esac +else + lt_prog_compiler_pic_F77= + lt_prog_compiler_can_build_shared_F77=no +fi + +fi + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_F77 eval lt_tmp_static_flag=\"$lt_prog_compiler_static_F77\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works_F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works_F77=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_F77=yes + fi + else + lt_cv_prog_compiler_static_works_F77=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_F77" >&5 +$as_echo "$lt_cv_prog_compiler_static_works_F77" >&6; } + +if test x"$lt_cv_prog_compiler_static_works_F77" = xyes; then + : +else + lt_prog_compiler_static_F77= +fi + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_F77=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_F77=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_F77" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_F77" >&6; } + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_F77=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_F77=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_F77" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_F77" >&6; } + + + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag_F77= + always_export_symbols_F77=no + archive_cmds_F77= + archive_expsym_cmds_F77= + compiler_needs_object_F77=no + enable_shared_with_static_runtimes_F77=no + export_dynamic_flag_spec_F77= + export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic_F77=no + hardcode_direct_F77=no + hardcode_direct_absolute_F77=no + hardcode_libdir_flag_spec_F77= + hardcode_libdir_separator_F77= + hardcode_minus_L_F77=no + hardcode_shlibpath_var_F77=unsupported + inherit_rpath_F77=no + link_all_deplibs_F77=unknown + module_cmds_F77= + module_expsym_cmds_F77= + old_archive_from_new_cmds_F77= + old_archive_from_expsyms_cmds_F77= + thread_safe_flag_spec_F77= + whole_archive_flag_spec_F77= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms_F77= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms_F77='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu | gnu*) + link_all_deplibs_F77=no + ;; + esac + + ld_shlibs_F77=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test "$with_gnu_ld" = yes; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test "$lt_use_gnu_ld_interface" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec_F77='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_F77= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs_F77=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='' + ;; + m68k) + archive_cmds_F77='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_F77=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_F77=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_F77='-L$libdir' + export_dynamic_flag_spec_F77='${wl}--export-all-symbols' + allow_undefined_flag_F77=unsupported + always_export_symbols_F77=no + enable_shared_with_static_runtimes_F77=yes + export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_F77='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_F77=no + fi + ;; + + haiku*) + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + link_all_deplibs_F77=yes + ;; + + interix[3-9]*) + hardcode_direct_F77=no + hardcode_shlibpath_var_F77=no + hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' + export_dynamic_flag_spec_F77='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_F77='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec_F77= + tmp_sharedflag='--shared' ;; + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object_F77=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec_F77='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object_F77=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds_F77='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds_F77='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec_F77='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds_F77='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs_F77=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs_F77=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_F77=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs_F77=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_F77=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_F77=no + fi + ;; + esac + + if test "$ld_shlibs_F77" = no; then + runpath_var= + hardcode_libdir_flag_spec_F77= + export_dynamic_flag_spec_F77= + whole_archive_flag_spec_F77= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag_F77=unsupported + always_export_symbols_F77=yes + archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L_F77=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct_F77=unsupported + fi + ;; + + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global + # defined symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_F77='' + hardcode_direct_F77=yes + hardcode_direct_absolute_F77=yes + hardcode_libdir_separator_F77=':' + link_all_deplibs_F77=yes + file_list_spec_F77='${wl}-f,' + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct_F77=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_F77=yes + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_libdir_separator_F77= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + link_all_deplibs_F77=no + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + export_dynamic_flag_spec_F77='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols_F77=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_F77='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +if ac_fn_f77_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__F77=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__F77"; then + lt_cv_aix_libpath__F77=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__F77"; then + lt_cv_aix_libpath__F77="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__F77 +fi + + hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds_F77='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_F77="-z nodefs" + archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +if ac_fn_f77_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__F77=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__F77"; then + lt_cv_aix_libpath__F77=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__F77"; then + lt_cv_aix_libpath__F77="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__F77 +fi + + hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_F77=' ${wl}-bernotok' + allow_undefined_flag_F77=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec_F77='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_F77='$convenience' + fi + archive_cmds_need_lc_F77=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='' + ;; + m68k) + archive_cmds_F77='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec_F77=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + hardcode_libdir_flag_spec_F77=' ' + allow_undefined_flag_F77=unsupported + always_export_symbols_F77=yes + file_list_spec_F77='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds_F77='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, F77)='true' + enable_shared_with_static_runtimes_F77=yes + exclude_expsyms_F77='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds_F77='chmod 644 $oldlib' + postlink_cmds_F77='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + hardcode_libdir_flag_spec_F77=' ' + allow_undefined_flag_F77=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds_F77='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds_F77='lib -OUT:$oldlib$oldobjs$old_deplibs' + enable_shared_with_static_runtimes_F77=yes + ;; + esac + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc_F77=no + hardcode_direct_F77=no + hardcode_automatic_F77=yes + hardcode_shlibpath_var_F77=unsupported + if test "$lt_cv_ld_force_load" = "yes"; then + whole_archive_flag_spec_F77='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + compiler_needs_object_F77=yes + else + whole_archive_flag_spec_F77='' + fi + link_all_deplibs_F77=yes + allow_undefined_flag_F77="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=func_echo_all + archive_cmds_F77="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds_F77="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds_F77="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds_F77="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + + else + ld_shlibs_F77=no + fi + + ;; + + dgux*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_shlibpath_var_F77=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes + hardcode_minus_L_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds_F77='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds_F77='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_F77=: + hardcode_direct_F77=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + export_dynamic_flag_spec_F77='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + archive_cmds_F77='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_F77=: + hardcode_direct_F77=yes + hardcode_direct_absolute_F77=yes + export_dynamic_flag_spec_F77='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds_F77='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_F77='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_F77=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct_F77=no + hardcode_shlibpath_var_F77=no + ;; + *) + hardcode_direct_F77=yes + hardcode_direct_absolute_F77=yes + export_dynamic_flag_spec_F77='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if ${lt_cv_irix_exported_symbol+:} false; then : + $as_echo_n "(cached) " >&6 +else + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + cat > conftest.$ac_ext <<_ACEOF + + subroutine foo + end +_ACEOF +if ac_fn_f77_try_link "$LINENO"; then : + lt_cv_irix_exported_symbol=yes +else + lt_cv_irix_exported_symbol=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +$as_echo "$lt_cv_irix_exported_symbol" >&6; } + if test "$lt_cv_irix_exported_symbol" = yes; then + archive_expsym_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + fi + else + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc_F77='no' + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_F77=: + inherit_rpath_F77=yes + link_all_deplibs_F77=yes + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + newsos6) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_F77=: + hardcode_shlibpath_var_F77=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + hardcode_direct_absolute_F77=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' + export_dynamic_flag_spec_F77='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-R$libdir' + ;; + *) + archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' + ;; + esac + fi + else + ld_shlibs_F77=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + allow_undefined_flag_F77=unsupported + archive_cmds_F77='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_from_new_cmds_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag_F77=' -expect_unresolved \*' + archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + fi + archive_cmds_need_lc_F77='no' + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_F77=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_F77='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag_F77=' -expect_unresolved \*' + archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec_F77='-rpath $libdir' + fi + archive_cmds_need_lc_F77='no' + hardcode_libdir_separator_F77=: + ;; + + solaris*) + no_undefined_flag_F77=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' + archive_cmds_F77='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_F77='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='${wl}' + archive_cmds_F77='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_shlibpath_var_F77=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + whole_archive_flag_spec_F77='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs_F77=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_direct_F77=yes + hardcode_minus_L_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds_F77='$CC -r -o $output$reload_objs' + hardcode_direct_F77=no + ;; + motorola) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_F77=no + ;; + + sysv4.3*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_F77=no + export_dynamic_flag_spec_F77='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_F77=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs_F77=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_F77='${wl}-z,text' + archive_cmds_need_lc_F77=no + hardcode_shlibpath_var_F77=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds_F77='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_F77='${wl}-z,text' + allow_undefined_flag_F77='${wl}-z,nodefs' + archive_cmds_need_lc_F77=no + hardcode_shlibpath_var_F77=no + hardcode_libdir_flag_spec_F77='${wl}-R,$libdir' + hardcode_libdir_separator_F77=':' + link_all_deplibs_F77=yes + export_dynamic_flag_spec_F77='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds_F77='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_shlibpath_var_F77=no + ;; + + *) + ld_shlibs_F77=no + ;; + esac + + if test x$host_vendor = xsni; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec_F77='${wl}-Blargedynsym' + ;; + esac + fi + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_F77" >&5 +$as_echo "$ld_shlibs_F77" >&6; } +test "$ld_shlibs_F77" = no && can_build_shared=no + +with_gnu_ld_F77=$with_gnu_ld + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_F77" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_F77=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_F77 in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc_F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_F77 + pic_flag=$lt_prog_compiler_pic_F77 + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_F77 + allow_undefined_flag_F77= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_F77 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds_F77 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc_F77=no + else + lt_cv_archive_cmds_need_lc_F77=yes + fi + allow_undefined_flag_F77=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_F77" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc_F77" >&6; } + archive_cmds_need_lc_F77=$lt_cv_archive_cmds_need_lc_F77 + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_F77\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_F77\"" + cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +if ac_fn_f77_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_F77= +if test -n "$hardcode_libdir_flag_spec_F77" || + test -n "$runpath_var_F77" || + test "X$hardcode_automatic_F77" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$hardcode_direct_F77" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, F77)" != no && + test "$hardcode_minus_L_F77" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_F77=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_F77=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_F77=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_F77" >&5 +$as_echo "$hardcode_action_F77" >&6; } + +if test "$hardcode_action_F77" = relink || + test "$inherit_rpath_F77" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC="$lt_save_CC" + CFLAGS="$lt_save_CFLAGS" +fi # test "$_lt_disable_F77" != yes + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + ac_ext=${ac_fc_srcext-f} +ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' +ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_fc_compiler_gnu + + +if test -z "$FC" || test "X$FC" = "Xno"; then + _lt_disable_FC=yes +fi + +archive_cmds_need_lc_FC=no +allow_undefined_flag_FC= +always_export_symbols_FC=no +archive_expsym_cmds_FC= +export_dynamic_flag_spec_FC= +hardcode_direct_FC=no +hardcode_direct_absolute_FC=no +hardcode_libdir_flag_spec_FC= +hardcode_libdir_separator_FC= +hardcode_minus_L_FC=no +hardcode_automatic_FC=no +inherit_rpath_FC=no +module_cmds_FC= +module_expsym_cmds_FC= +link_all_deplibs_FC=unknown +old_archive_cmds_FC=$old_archive_cmds +reload_flag_FC=$reload_flag +reload_cmds_FC=$reload_cmds +no_undefined_flag_FC= +whole_archive_flag_spec_FC= +enable_shared_with_static_runtimes_FC=no + +# Source file extension for fc test sources. +ac_ext=${ac_fc_srcext-f} + +# Object file extension for compiled fc test sources. +objext=o +objext_FC=$objext + +# No sense in running all these tests if we already determined that +# the FC compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_FC" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + + # save warnings/boilerplate of simple test code + ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + + ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${FC-"f95"} + CFLAGS=$FCFLAGS + compiler=$CC + GCC=$ac_cv_fc_compiler_gnu + + compiler_FC=$CC + for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` + + + if test -n "$compiler"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[4-9]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + + GCC_FC="$ac_cv_fc_compiler_gnu" + LD_FC="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + # Dependencies to place before and after the object being linked: +predep_objects_FC= +postdep_objects_FC= +predeps_FC= +postdeps_FC= +compiler_lib_search_path_FC= + +cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer a + a=0 + return + end +_LT_EOF + + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case ${prev}${p} in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" || + test $p = "-R"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test "$pre_test_object_deps_done" = no; then + case ${prev} in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_FC"; then + compiler_lib_search_path_FC="${prev}${p}" + else + compiler_lib_search_path_FC="${compiler_lib_search_path_FC} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_FC"; then + postdeps_FC="${prev}${p}" + else + postdeps_FC="${postdeps_FC} ${prev}${p}" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$predep_objects_FC"; then + predep_objects_FC="$p" + else + predep_objects_FC="$predep_objects_FC $p" + fi + else + if test -z "$postdep_objects_FC"; then + postdep_objects_FC="$p" + else + postdep_objects_FC="$postdep_objects_FC $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling FC test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken + + +case " $postdeps_FC " in +*" -lc "*) archive_cmds_need_lc_FC=no ;; +esac + compiler_lib_search_dirs_FC= +if test -n "${compiler_lib_search_path_FC}"; then + compiler_lib_search_dirs_FC=`echo " ${compiler_lib_search_path_FC}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + lt_prog_compiler_wl_FC= +lt_prog_compiler_pic_FC= +lt_prog_compiler_static_FC= + + + if test "$GCC" = yes; then + lt_prog_compiler_wl_FC='-Wl,' + lt_prog_compiler_static_FC='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_FC='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic_FC='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_FC='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic_FC='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_FC='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static_FC= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_FC='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared_FC=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_FC='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_FC=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic_FC='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl_FC='-Xlinker ' + if test -n "$lt_prog_compiler_pic_FC"; then + lt_prog_compiler_pic_FC="-Xcompiler $lt_prog_compiler_pic_FC" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl_FC='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_FC='-Bstatic' + else + lt_prog_compiler_static_FC='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_FC='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl_FC='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_FC='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static_FC='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl_FC='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static_FC='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + lt_prog_compiler_wl_FC='-Wl,' + lt_prog_compiler_pic_FC='-KPIC' + lt_prog_compiler_static_FC='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl_FC='-Wl,' + lt_prog_compiler_pic_FC='-fPIC' + lt_prog_compiler_static_FC='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl_FC='-Wl,' + lt_prog_compiler_pic_FC='--shared' + lt_prog_compiler_static_FC='--static' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl_FC='-Wl,-Wl,,' + lt_prog_compiler_pic_FC='-PIC' + lt_prog_compiler_static_FC='-Bstatic' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl_FC='-Wl,' + lt_prog_compiler_pic_FC='-fpic' + lt_prog_compiler_static_FC='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl_FC='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static_FC='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl_FC='-Wl,' + lt_prog_compiler_pic_FC='-qpic' + lt_prog_compiler_static_FC='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic_FC='-KPIC' + lt_prog_compiler_static_FC='-Bstatic' + lt_prog_compiler_wl_FC='' + ;; + *Sun\ F* | *Sun*Fortran*) + lt_prog_compiler_pic_FC='-KPIC' + lt_prog_compiler_static_FC='-Bstatic' + lt_prog_compiler_wl_FC='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic_FC='-KPIC' + lt_prog_compiler_static_FC='-Bstatic' + lt_prog_compiler_wl_FC='-Wl,' + ;; + *Intel*\ [CF]*Compiler*) + lt_prog_compiler_wl_FC='-Wl,' + lt_prog_compiler_pic_FC='-fPIC' + lt_prog_compiler_static_FC='-static' + ;; + *Portland\ Group*) + lt_prog_compiler_wl_FC='-Wl,' + lt_prog_compiler_pic_FC='-fpic' + lt_prog_compiler_static_FC='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic_FC='-KPIC' + lt_prog_compiler_static_FC='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_FC='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl_FC='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static_FC='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static_FC='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic_FC='-KPIC' + lt_prog_compiler_static_FC='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + lt_prog_compiler_wl_FC='-Qoption ld ';; + *) + lt_prog_compiler_wl_FC='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl_FC='-Qoption ld ' + lt_prog_compiler_pic_FC='-PIC' + lt_prog_compiler_static_FC='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl_FC='-Wl,' + lt_prog_compiler_pic_FC='-KPIC' + lt_prog_compiler_static_FC='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic_FC='-Kconform_pic' + lt_prog_compiler_static_FC='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl_FC='-Wl,' + lt_prog_compiler_pic_FC='-KPIC' + lt_prog_compiler_static_FC='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl_FC='-Wl,' + lt_prog_compiler_can_build_shared_FC=no + ;; + + uts4*) + lt_prog_compiler_pic_FC='-pic' + lt_prog_compiler_static_FC='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared_FC=no + ;; + esac + fi + +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_FC= + ;; + *) + lt_prog_compiler_pic_FC="$lt_prog_compiler_pic_FC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic_FC+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_FC=$lt_prog_compiler_pic_FC +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_FC" >&5 +$as_echo "$lt_cv_prog_compiler_pic_FC" >&6; } +lt_prog_compiler_pic_FC=$lt_cv_prog_compiler_pic_FC + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_FC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_FC works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_FC works... " >&6; } +if ${lt_cv_prog_compiler_pic_works_FC+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works_FC=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_FC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_FC=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_FC" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works_FC" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works_FC" = xyes; then + case $lt_prog_compiler_pic_FC in + "" | " "*) ;; + *) lt_prog_compiler_pic_FC=" $lt_prog_compiler_pic_FC" ;; + esac +else + lt_prog_compiler_pic_FC= + lt_prog_compiler_can_build_shared_FC=no +fi + +fi + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_FC eval lt_tmp_static_flag=\"$lt_prog_compiler_static_FC\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works_FC+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works_FC=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_FC=yes + fi + else + lt_cv_prog_compiler_static_works_FC=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_FC" >&5 +$as_echo "$lt_cv_prog_compiler_static_works_FC" >&6; } + +if test x"$lt_cv_prog_compiler_static_works_FC" = xyes; then + : +else + lt_prog_compiler_static_FC= +fi + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_FC+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_FC=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_FC=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_FC" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_FC" >&6; } + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_FC+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_FC=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_FC=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_FC" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_FC" >&6; } + + + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_FC" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag_FC= + always_export_symbols_FC=no + archive_cmds_FC= + archive_expsym_cmds_FC= + compiler_needs_object_FC=no + enable_shared_with_static_runtimes_FC=no + export_dynamic_flag_spec_FC= + export_symbols_cmds_FC='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic_FC=no + hardcode_direct_FC=no + hardcode_direct_absolute_FC=no + hardcode_libdir_flag_spec_FC= + hardcode_libdir_separator_FC= + hardcode_minus_L_FC=no + hardcode_shlibpath_var_FC=unsupported + inherit_rpath_FC=no + link_all_deplibs_FC=unknown + module_cmds_FC= + module_expsym_cmds_FC= + old_archive_from_new_cmds_FC= + old_archive_from_expsyms_cmds_FC= + thread_safe_flag_spec_FC= + whole_archive_flag_spec_FC= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms_FC= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms_FC='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu | gnu*) + link_all_deplibs_FC=no + ;; + esac + + ld_shlibs_FC=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test "$with_gnu_ld" = yes; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test "$lt_use_gnu_ld_interface" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec_FC='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_FC="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_FC= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs_FC=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_FC='' + ;; + m68k) + archive_cmds_FC='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_FC='-L$libdir' + hardcode_minus_L_FC=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_FC=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_FC='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_FC=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, FC) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_FC='-L$libdir' + export_dynamic_flag_spec_FC='${wl}--export-all-symbols' + allow_undefined_flag_FC=unsupported + always_export_symbols_FC=no + enable_shared_with_static_runtimes_FC=yes + export_symbols_cmds_FC='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_FC='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_FC='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_FC=no + fi + ;; + + haiku*) + archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + link_all_deplibs_FC=yes + ;; + + interix[3-9]*) + hardcode_direct_FC=no + hardcode_shlibpath_var_FC=no + hardcode_libdir_flag_spec_FC='${wl}-rpath,$libdir' + export_dynamic_flag_spec_FC='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_FC='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec_FC='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + whole_archive_flag_spec_FC='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec_FC= + tmp_sharedflag='--shared' ;; + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec_FC='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object_FC=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec_FC='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object_FC=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds_FC='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds_FC='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec_FC='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir' + archive_cmds_FC='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds_FC='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs_FC=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds_FC='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs_FC=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_FC=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs_FC=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir' + archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_FC=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds_FC='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct_FC=yes + hardcode_shlibpath_var_FC=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_FC=no + fi + ;; + esac + + if test "$ld_shlibs_FC" = no; then + runpath_var= + hardcode_libdir_flag_spec_FC= + export_dynamic_flag_spec_FC= + whole_archive_flag_spec_FC= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag_FC=unsupported + always_export_symbols_FC=yes + archive_expsym_cmds_FC='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L_FC=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct_FC=unsupported + fi + ;; + + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global + # defined symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds_FC='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_FC='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_FC='' + hardcode_direct_FC=yes + hardcode_direct_absolute_FC=yes + hardcode_libdir_separator_FC=':' + link_all_deplibs_FC=yes + file_list_spec_FC='${wl}-f,' + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct_FC=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_FC=yes + hardcode_libdir_flag_spec_FC='-L$libdir' + hardcode_libdir_separator_FC= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + link_all_deplibs_FC=no + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + export_dynamic_flag_spec_FC='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols_FC=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_FC='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__FC+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +if ac_fn_fc_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__FC=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__FC"; then + lt_cv_aix_libpath__FC=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__FC"; then + lt_cv_aix_libpath__FC="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__FC +fi + + hardcode_libdir_flag_spec_FC='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds_FC='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_FC='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_FC="-z nodefs" + archive_expsym_cmds_FC="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__FC+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +if ac_fn_fc_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__FC=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__FC"; then + lt_cv_aix_libpath__FC=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__FC"; then + lt_cv_aix_libpath__FC="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__FC +fi + + hardcode_libdir_flag_spec_FC='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_FC=' ${wl}-bernotok' + allow_undefined_flag_FC=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec_FC='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_FC='$convenience' + fi + archive_cmds_need_lc_FC=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds_FC="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_FC='' + ;; + m68k) + archive_cmds_FC='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_FC='-L$libdir' + hardcode_minus_L_FC=yes + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec_FC=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + hardcode_libdir_flag_spec_FC=' ' + allow_undefined_flag_FC=unsupported + always_export_symbols_FC=yes + file_list_spec_FC='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds_FC='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + archive_expsym_cmds_FC='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, FC)='true' + enable_shared_with_static_runtimes_FC=yes + exclude_expsyms_FC='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + export_symbols_cmds_FC='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds_FC='chmod 644 $oldlib' + postlink_cmds_FC='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + hardcode_libdir_flag_spec_FC=' ' + allow_undefined_flag_FC=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds_FC='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds_FC='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds_FC='lib -OUT:$oldlib$oldobjs$old_deplibs' + enable_shared_with_static_runtimes_FC=yes + ;; + esac + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc_FC=no + hardcode_direct_FC=no + hardcode_automatic_FC=yes + hardcode_shlibpath_var_FC=unsupported + if test "$lt_cv_ld_force_load" = "yes"; then + whole_archive_flag_spec_FC='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + compiler_needs_object_FC=yes + else + whole_archive_flag_spec_FC='' + fi + link_all_deplibs_FC=yes + allow_undefined_flag_FC="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=func_echo_all + archive_cmds_FC="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds_FC="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds_FC="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds_FC="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + + else + ld_shlibs_FC=no + fi + + ;; + + dgux*) + archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_FC='-L$libdir' + hardcode_shlibpath_var_FC=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds_FC='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec_FC='-R$libdir' + hardcode_direct_FC=yes + hardcode_shlibpath_var_FC=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + archive_cmds_FC='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_FC=yes + hardcode_minus_L_FC=yes + hardcode_shlibpath_var_FC=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_FC='-R$libdir' + hardcode_direct_FC=yes + hardcode_shlibpath_var_FC=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds_FC='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds_FC='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec_FC='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_FC=: + hardcode_direct_FC=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_FC=yes + export_dynamic_flag_spec_FC='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + archive_cmds_FC='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_FC='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec_FC='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_FC=: + hardcode_direct_FC=yes + hardcode_direct_absolute_FC=yes + export_dynamic_flag_spec_FC='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_FC=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + archive_cmds_FC='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds_FC='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_FC='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds_FC='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds_FC='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_FC='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec_FC='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_FC=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct_FC=no + hardcode_shlibpath_var_FC=no + ;; + *) + hardcode_direct_FC=yes + hardcode_direct_absolute_FC=yes + export_dynamic_flag_spec_FC='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_FC=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if ${lt_cv_irix_exported_symbol+:} false; then : + $as_echo_n "(cached) " >&6 +else + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + cat > conftest.$ac_ext <<_ACEOF + + subroutine foo + end +_ACEOF +if ac_fn_fc_try_link "$LINENO"; then : + lt_cv_irix_exported_symbol=yes +else + lt_cv_irix_exported_symbol=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +$as_echo "$lt_cv_irix_exported_symbol" >&6; } + if test "$lt_cv_irix_exported_symbol" = yes; then + archive_expsym_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + fi + else + archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc_FC='no' + hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_FC=: + inherit_rpath_FC=yes + link_all_deplibs_FC=yes + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds_FC='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds_FC='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec_FC='-R$libdir' + hardcode_direct_FC=yes + hardcode_shlibpath_var_FC=no + ;; + + newsos6) + archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_FC=yes + hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_FC=: + hardcode_shlibpath_var_FC=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_FC=yes + hardcode_shlibpath_var_FC=no + hardcode_direct_absolute_FC=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec_FC='${wl}-rpath,$libdir' + export_dynamic_flag_spec_FC='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds_FC='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_FC='-R$libdir' + ;; + *) + archive_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_FC='${wl}-rpath,$libdir' + ;; + esac + fi + else + ld_shlibs_FC=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec_FC='-L$libdir' + hardcode_minus_L_FC=yes + allow_undefined_flag_FC=unsupported + archive_cmds_FC='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_from_new_cmds_FC='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag_FC=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_FC='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag_FC=' -expect_unresolved \*' + archive_cmds_FC='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + fi + archive_cmds_need_lc_FC='no' + hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_FC=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag_FC=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_FC='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag_FC=' -expect_unresolved \*' + archive_cmds_FC='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_FC='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec_FC='-rpath $libdir' + fi + archive_cmds_need_lc_FC='no' + hardcode_libdir_separator_FC=: + ;; + + solaris*) + no_undefined_flag_FC=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' + archive_cmds_FC='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_FC='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds_FC='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_FC='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='${wl}' + archive_cmds_FC='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_FC='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec_FC='-R$libdir' + hardcode_shlibpath_var_FC=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + whole_archive_flag_spec_FC='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + whole_archive_flag_spec_FC='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs_FC=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds_FC='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_FC='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec_FC='-L$libdir' + hardcode_direct_FC=yes + hardcode_minus_L_FC=yes + hardcode_shlibpath_var_FC=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_FC=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds_FC='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds_FC='$CC -r -o $output$reload_objs' + hardcode_direct_FC=no + ;; + motorola) + archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_FC=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_FC=no + ;; + + sysv4.3*) + archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_FC=no + export_dynamic_flag_spec_FC='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_FC=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs_FC=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_FC='${wl}-z,text' + archive_cmds_need_lc_FC=no + hardcode_shlibpath_var_FC=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds_FC='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_FC='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_FC='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_FC='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_FC='${wl}-z,text' + allow_undefined_flag_FC='${wl}-z,nodefs' + archive_cmds_need_lc_FC=no + hardcode_shlibpath_var_FC=no + hardcode_libdir_flag_spec_FC='${wl}-R,$libdir' + hardcode_libdir_separator_FC=':' + link_all_deplibs_FC=yes + export_dynamic_flag_spec_FC='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds_FC='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_FC='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_FC='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_FC='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_FC='-L$libdir' + hardcode_shlibpath_var_FC=no + ;; + + *) + ld_shlibs_FC=no + ;; + esac + + if test x$host_vendor = xsni; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec_FC='${wl}-Blargedynsym' + ;; + esac + fi + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_FC" >&5 +$as_echo "$ld_shlibs_FC" >&6; } +test "$ld_shlibs_FC" = no && can_build_shared=no + +with_gnu_ld_FC=$with_gnu_ld + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_FC" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_FC=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_FC in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc_FC+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_FC + pic_flag=$lt_prog_compiler_pic_FC + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_FC + allow_undefined_flag_FC= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_FC 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds_FC 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc_FC=no + else + lt_cv_archive_cmds_need_lc_FC=yes + fi + allow_undefined_flag_FC=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_FC" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc_FC" >&6; } + archive_cmds_need_lc_FC=$lt_cv_archive_cmds_need_lc_FC + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_FC\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_FC\"" + cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +if ac_fn_fc_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_FC= +if test -n "$hardcode_libdir_flag_spec_FC" || + test -n "$runpath_var_FC" || + test "X$hardcode_automatic_FC" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$hardcode_direct_FC" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, FC)" != no && + test "$hardcode_minus_L_FC" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_FC=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_FC=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_FC=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_FC" >&5 +$as_echo "$hardcode_action_FC" >&6; } + +if test "$hardcode_action_FC" = relink || + test "$inherit_rpath_FC" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test "$_lt_disable_FC" != yes + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + + + + + + + ac_config_commands="$ac_config_commands libtool" + + + + +# Only expand once: + + + +# Define a macros to state availability, as per coin expectations + + + + + pkg=mc19 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MC19" >&5 +$as_echo_n "checking for MC19... " >&6; } + if test -r "$srcdir/$pkg/${pkg}d.f"; then + +$as_echo "#define COINHSL_HAS_MC19 1" >>confdefs.h + + coin_has_mc19=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + coin_has_mc19=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + if test x$coin_has_mc19 = xyes; then + HAVE_MC19_TRUE= + HAVE_MC19_FALSE='#' +else + HAVE_MC19_TRUE='#' + HAVE_MC19_FALSE= +fi + + + + pkg=ma27 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MA27" >&5 +$as_echo_n "checking for MA27... " >&6; } + if test -r "$srcdir/$pkg/${pkg}d.f"; then + +$as_echo "#define COINHSL_HAS_MA27 1" >>confdefs.h + + coin_has_ma27=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + coin_has_ma27=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + if test x$coin_has_ma27 = xyes; then + HAVE_MA27_TRUE= + HAVE_MA27_FALSE='#' +else + HAVE_MA27_TRUE='#' + HAVE_MA27_FALSE= +fi + + + + pkg=ma28 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MA28" >&5 +$as_echo_n "checking for MA28... " >&6; } + if test -r "$srcdir/$pkg/${pkg}d.f"; then + +$as_echo "#define COINHSL_HAS_MA28 1" >>confdefs.h + + coin_has_ma28=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + coin_has_ma28=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + if test x$coin_has_ma28 = xyes; then + HAVE_MA28_TRUE= + HAVE_MA28_FALSE='#' +else + HAVE_MA28_TRUE='#' + HAVE_MA28_FALSE= +fi + + + + pkg=ma57 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MA57" >&5 +$as_echo_n "checking for MA57... " >&6; } + if test -r "$srcdir/$pkg/${pkg}d.f"; then + +$as_echo "#define COINHSL_HAS_MA57 1" >>confdefs.h + + coin_has_ma57=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + coin_has_ma57=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + if test x$coin_has_ma57 = xyes; then + HAVE_MA57_TRUE= + HAVE_MA57_FALSE='#' +else + HAVE_MA57_TRUE='#' + HAVE_MA57_FALSE= +fi + + + + pkg=hsl_ma77 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MA77" >&5 +$as_echo_n "checking for MA77... " >&6; } + if test -r "$srcdir/$pkg/${pkg}d.f90"; then + +$as_echo "#define COINHSL_HAS_MA77 1" >>confdefs.h + + coin_has_hsl_ma77=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + coin_has_hsl_ma77=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + if test x$coin_has_hsl_ma77 = xyes; then + HAVE_MA77_TRUE= + HAVE_MA77_FALSE='#' +else + HAVE_MA77_TRUE='#' + HAVE_MA77_FALSE= +fi + + + + pkg=hsl_ma86 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MA86" >&5 +$as_echo_n "checking for MA86... " >&6; } + if test -r "$srcdir/$pkg/${pkg}d.f90"; then + +$as_echo "#define COINHSL_HAS_MA86 1" >>confdefs.h + + coin_has_hsl_ma86=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + coin_has_hsl_ma86=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + if test x$coin_has_hsl_ma86 = xyes; then + HAVE_MA86_TRUE= + HAVE_MA86_FALSE='#' +else + HAVE_MA86_TRUE='#' + HAVE_MA86_FALSE= +fi + + + + pkg=hsl_ma97 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MA97" >&5 +$as_echo_n "checking for MA97... " >&6; } + if test -r "$srcdir/$pkg/${pkg}d.f90"; then + +$as_echo "#define COINHSL_HAS_MA97 1" >>confdefs.h + + coin_has_hsl_ma97=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + coin_has_hsl_ma97=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + if test x$coin_has_hsl_ma97 = xyes; then + HAVE_MA97_TRUE= + HAVE_MA97_FALSE='#' +else + HAVE_MA97_TRUE='#' + HAVE_MA97_FALSE= +fi + + + +# HSL_MC68 is an i.f90 not a d.f90 so can't use HSL_CHECK_PKG_F90 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for MC68" >&5 +$as_echo_n "checking for MC68... " >&6; } +if test -r "$srcdir/hsl_mc68/C/hsl_mc68i_ciface.f90"; then + +$as_echo "#define COINHSL_HAS_MC68 1" >>confdefs.h + + coin_has_hsl_mc68=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + coin_has_hsl_mc68=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + if test x$coin_has_hsl_mc68 = xyes; then + HAVE_MC68_TRUE= + HAVE_MC68_FALSE='#' +else + HAVE_MC68_TRUE='#' + HAVE_MC68_FALSE= +fi + + +# Look for a metis we can compile +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for metis to compile" >&5 +$as_echo_n "checking for metis to compile... " >&6; } +if test -r "$srcdir/metis-4.0.3/Lib/balance.c"; then + +$as_echo "#define COINHSL_HAS_METIS 1" >>confdefs.h + + coin_has_metis=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + coin_has_metis=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + if test x$coin_has_metis = xyes; then + HAVE_METIS_TRUE= + HAVE_METIS_FALSE='#' +else + HAVE_METIS_TRUE='#' + HAVE_METIS_FALSE= +fi + + +# Check if we're on Windows and have to do extra legwork for DLLs +for ac_header in windows.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "windows.h" "ac_cv_header_windows_h" "$ac_includes_default" +if test "x$ac_cv_header_windows_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_WINDOWS_H 1 +_ACEOF + +fi + +done + + if test x$ac_cv_header_windows_h = xyes; then + TARGET_DLL_TRUE= + TARGET_DLL_FALSE='#' +else + TARGET_DLL_TRUE='#' + TARGET_DLL_FALSE= +fi + + +# Check if we have BLAS (only used for windows as dep of dll) +ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to get verbose linking output from $F77" >&5 +$as_echo_n "checking how to get verbose linking output from $F77... " >&6; } +if ${ac_cv_prog_f77_v+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +if ac_fn_f77_try_compile "$LINENO"; then : + ac_cv_prog_f77_v= +# Try some options frequently used verbose output +for ac_verb in -v -verbose --verbose -V -\#\#\#; do + cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF + +# Compile and link our simple test program by passing a flag (argument +# 1 to this macro) to the Fortran compiler in order to get +# "verbose" output that we can then parse for the Fortran linker +# flags. +ac_save_FFLAGS=$FFLAGS +FFLAGS="$FFLAGS $ac_verb" +eval "set x $ac_link" +shift +$as_echo "$as_me:${as_lineno-$LINENO}: $*" >&5 +# gfortran 4.3 outputs lines setting COLLECT_GCC_OPTIONS, COMPILER_PATH, +# LIBRARY_PATH; skip all such settings. +ac_f77_v_output=`eval $ac_link 5>&1 2>&1 | + sed '/^Driving:/d; /^Configured with:/d; + '"/^[_$as_cr_Letters][_$as_cr_alnum]*=/d"` +$as_echo "$ac_f77_v_output" >&5 +FFLAGS=$ac_save_FFLAGS + +rm -rf conftest* + +# On HP/UX there is a line like: "LPATH is: /foo:/bar:/baz" where +# /foo, /bar, and /baz are search directories for the Fortran linker. +# Here, we change these into -L/foo -L/bar -L/baz (and put it first): +ac_f77_v_output="`echo $ac_f77_v_output | + grep 'LPATH is:' | + sed 's|.*LPATH is\(: *[^ ]*\).*|\1|;s|: */| -L/|g'` $ac_f77_v_output" + +# FIXME: we keep getting bitten by quoted arguments; a more general fix +# that detects unbalanced quotes in FLIBS should be implemented +# and (ugh) tested at some point. +case $ac_f77_v_output in + # With xlf replace commas with spaces, + # and remove "-link" and closing parenthesis. + *xlfentry*) + ac_f77_v_output=`echo $ac_f77_v_output | + sed ' + s/,/ /g + s/ -link / /g + s/) *$// + ' + ` ;; + + # With Intel ifc, ignore the quoted -mGLOB_options_string stuff (quoted + # $LIBS confuse us, and the libraries appear later in the output anyway). + *mGLOB_options_string*) + ac_f77_v_output=`echo $ac_f77_v_output | sed 's/"-mGLOB[^"]*"/ /g'` ;; + + # Portland Group compiler has singly- or doubly-quoted -cmdline argument + # Singly-quoted arguments were reported for versions 5.2-4 and 6.0-4. + # Doubly-quoted arguments were reported for "PGF90/x86 Linux/x86 5.0-2". + *-cmdline\ * | *-ignore\ * | *-def\ *) + ac_f77_v_output=`echo $ac_f77_v_output | sed "\ + s/-cmdline *'[^']*'/ /g; s/-cmdline *\"[^\"]*\"/ /g + s/-ignore *'[^']*'/ /g; s/-ignore *\"[^\"]*\"/ /g + s/-def *'[^']*'/ /g; s/-def *\"[^\"]*\"/ /g"` ;; + + # If we are using fort77 (the f2c wrapper) then filter output and delete quotes. + *fort77*f2c*gcc*) + ac_f77_v_output=`echo "$ac_f77_v_output" | sed -n ' + /:[ ]\+Running[ ]\{1,\}"gcc"/{ + /"-c"/d + /[.]c"*/d + s/^.*"gcc"/"gcc"/ + s/"//gp + }'` ;; + + # If we are using Cray Fortran then delete quotes. + *cft90*) + ac_f77_v_output=`echo $ac_f77_v_output | sed 's/"//g'` ;; +esac + + + # look for -l* and *.a constructs in the output + for ac_arg in $ac_f77_v_output; do + case $ac_arg in + [\\/]*.a | ?:[\\/]*.a | -[lLRu]*) + ac_cv_prog_f77_v=$ac_verb + break 2 ;; + esac + done +done +if test -z "$ac_cv_prog_f77_v"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot determine how to obtain linking information from $F77" >&5 +$as_echo "$as_me: WARNING: cannot determine how to obtain linking information from $F77" >&2;} +fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: compilation failed" >&5 +$as_echo "$as_me: WARNING: compilation failed" >&2;} +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_f77_v" >&5 +$as_echo "$ac_cv_prog_f77_v" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran 77 libraries of $F77" >&5 +$as_echo_n "checking for Fortran 77 libraries of $F77... " >&6; } +if ${ac_cv_f77_libs+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$FLIBS" != "x"; then + ac_cv_f77_libs="$FLIBS" # Let the user override the test. +else + +cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF + +# Compile and link our simple test program by passing a flag (argument +# 1 to this macro) to the Fortran compiler in order to get +# "verbose" output that we can then parse for the Fortran linker +# flags. +ac_save_FFLAGS=$FFLAGS +FFLAGS="$FFLAGS $ac_cv_prog_f77_v" +eval "set x $ac_link" +shift +$as_echo "$as_me:${as_lineno-$LINENO}: $*" >&5 +# gfortran 4.3 outputs lines setting COLLECT_GCC_OPTIONS, COMPILER_PATH, +# LIBRARY_PATH; skip all such settings. +ac_f77_v_output=`eval $ac_link 5>&1 2>&1 | + sed '/^Driving:/d; /^Configured with:/d; + '"/^[_$as_cr_Letters][_$as_cr_alnum]*=/d"` +$as_echo "$ac_f77_v_output" >&5 +FFLAGS=$ac_save_FFLAGS + +rm -rf conftest* + +# On HP/UX there is a line like: "LPATH is: /foo:/bar:/baz" where +# /foo, /bar, and /baz are search directories for the Fortran linker. +# Here, we change these into -L/foo -L/bar -L/baz (and put it first): +ac_f77_v_output="`echo $ac_f77_v_output | + grep 'LPATH is:' | + sed 's|.*LPATH is\(: *[^ ]*\).*|\1|;s|: */| -L/|g'` $ac_f77_v_output" + +# FIXME: we keep getting bitten by quoted arguments; a more general fix +# that detects unbalanced quotes in FLIBS should be implemented +# and (ugh) tested at some point. +case $ac_f77_v_output in + # With xlf replace commas with spaces, + # and remove "-link" and closing parenthesis. + *xlfentry*) + ac_f77_v_output=`echo $ac_f77_v_output | + sed ' + s/,/ /g + s/ -link / /g + s/) *$// + ' + ` ;; + + # With Intel ifc, ignore the quoted -mGLOB_options_string stuff (quoted + # $LIBS confuse us, and the libraries appear later in the output anyway). + *mGLOB_options_string*) + ac_f77_v_output=`echo $ac_f77_v_output | sed 's/"-mGLOB[^"]*"/ /g'` ;; + + # Portland Group compiler has singly- or doubly-quoted -cmdline argument + # Singly-quoted arguments were reported for versions 5.2-4 and 6.0-4. + # Doubly-quoted arguments were reported for "PGF90/x86 Linux/x86 5.0-2". + *-cmdline\ * | *-ignore\ * | *-def\ *) + ac_f77_v_output=`echo $ac_f77_v_output | sed "\ + s/-cmdline *'[^']*'/ /g; s/-cmdline *\"[^\"]*\"/ /g + s/-ignore *'[^']*'/ /g; s/-ignore *\"[^\"]*\"/ /g + s/-def *'[^']*'/ /g; s/-def *\"[^\"]*\"/ /g"` ;; + + # If we are using fort77 (the f2c wrapper) then filter output and delete quotes. + *fort77*f2c*gcc*) + ac_f77_v_output=`echo "$ac_f77_v_output" | sed -n ' + /:[ ]\+Running[ ]\{1,\}"gcc"/{ + /"-c"/d + /[.]c"*/d + s/^.*"gcc"/"gcc"/ + s/"//gp + }'` ;; + + # If we are using Cray Fortran then delete quotes. + *cft90*) + ac_f77_v_output=`echo $ac_f77_v_output | sed 's/"//g'` ;; +esac + + + +ac_cv_f77_libs= + +# Save positional arguments (if any) +ac_save_positional="$@" + +set X $ac_f77_v_output +while test $# != 1; do + shift + ac_arg=$1 + case $ac_arg in + [\\/]*.a | ?:[\\/]*.a) + ac_exists=false + for ac_i in $ac_cv_f77_libs; do + if test x"$ac_arg" = x"$ac_i"; then + ac_exists=true + break + fi + done + + if test x"$ac_exists" = xtrue; then : + +else + ac_cv_f77_libs="$ac_cv_f77_libs $ac_arg" +fi + ;; + -bI:*) + ac_exists=false + for ac_i in $ac_cv_f77_libs; do + if test x"$ac_arg" = x"$ac_i"; then + ac_exists=true + break + fi + done + + if test x"$ac_exists" = xtrue; then : + +else + if test "$ac_compiler_gnu" = yes; then + for ac_link_opt in $ac_arg; do + ac_cv_f77_libs="$ac_cv_f77_libs -Xlinker $ac_link_opt" + done +else + ac_cv_f77_libs="$ac_cv_f77_libs $ac_arg" +fi +fi + ;; + # Ignore these flags. + -lang* | -lcrt*.o | -lc | -lgcc* | -lSystem | -libmil | -little \ + |-LANG:=* | -LIST:* | -LNO:* | -link) + ;; + -lkernel32) + case $host_os in + *cygwin*) ;; + *) ac_cv_f77_libs="$ac_cv_f77_libs $ac_arg" + ;; + esac + ;; + -[LRuYz]) + # These flags, when seen by themselves, take an argument. + # We remove the space between option and argument and re-iterate + # unless we find an empty arg or a new option (starting with -) + case $2 in + "" | -*);; + *) + ac_arg="$ac_arg$2" + shift; shift + set X $ac_arg "$@" + ;; + esac + ;; + -YP,*) + for ac_j in `$as_echo "$ac_arg" | sed -e 's/-YP,/-L/;s/:/ -L/g'`; do + ac_exists=false + for ac_i in $ac_cv_f77_libs; do + if test x"$ac_j" = x"$ac_i"; then + ac_exists=true + break + fi + done + + if test x"$ac_exists" = xtrue; then : + +else + ac_arg="$ac_arg $ac_j" + ac_cv_f77_libs="$ac_cv_f77_libs $ac_j" +fi + done + ;; + -[lLR]*) + ac_exists=false + for ac_i in $ac_cv_f77_libs; do + if test x"$ac_arg" = x"$ac_i"; then + ac_exists=true + break + fi + done + + if test x"$ac_exists" = xtrue; then : + +else + ac_cv_f77_libs="$ac_cv_f77_libs $ac_arg" +fi + ;; + -zallextract*| -zdefaultextract) + ac_cv_f77_libs="$ac_cv_f77_libs $ac_arg" + ;; + # Ignore everything else. + esac +done +# restore positional arguments +set X $ac_save_positional; shift + +# We only consider "LD_RUN_PATH" on Solaris systems. If this is seen, +# then we insist that the "run path" must be an absolute path (i.e. it +# must begin with a "/"). +case `(uname -sr) 2>/dev/null` in + "SunOS 5"*) + ac_ld_run_path=`$as_echo "$ac_f77_v_output" | + sed -n 's,^.*LD_RUN_PATH *= *\(/[^ ]*\).*$,-R\1,p'` + test "x$ac_ld_run_path" != x && + if test "$ac_compiler_gnu" = yes; then + for ac_link_opt in $ac_ld_run_path; do + ac_cv_f77_libs="$ac_cv_f77_libs -Xlinker $ac_link_opt" + done +else + ac_cv_f77_libs="$ac_cv_f77_libs $ac_ld_run_path" +fi + ;; +esac +fi # test "x$[]_AC_LANG_PREFIX[]LIBS" = "x" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_f77_libs" >&5 +$as_echo "$ac_cv_f77_libs" >&6; } +FLIBS="$ac_cv_f77_libs" + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dummy main to link with Fortran 77 libraries" >&5 +$as_echo_n "checking for dummy main to link with Fortran 77 libraries... " >&6; } +if ${ac_cv_f77_dummy_main+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_f77_dm_save_LIBS=$LIBS + LIBS="$LIBS $FLIBS" + ac_fortran_dm_var=F77_DUMMY_MAIN + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + # First, try linking without a dummy main: + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_fortran_dummy_main=none +else + ac_cv_fortran_dummy_main=unknown +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + if test $ac_cv_fortran_dummy_main = unknown; then + for ac_func in MAIN__ MAIN_ __main MAIN _MAIN __MAIN main_ main__ _main; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define $ac_fortran_dm_var $ac_func +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_fortran_dummy_main=$ac_func; break +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + done + fi + ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu + ac_cv_f77_dummy_main=$ac_cv_fortran_dummy_main + rm -rf conftest* + LIBS=$ac_f77_dm_save_LIBS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_f77_dummy_main" >&5 +$as_echo "$ac_cv_f77_dummy_main" >&6; } +F77_DUMMY_MAIN=$ac_cv_f77_dummy_main +if test "$F77_DUMMY_MAIN" != unknown; then : + if test $F77_DUMMY_MAIN != none; then + +cat >>confdefs.h <<_ACEOF +#define F77_DUMMY_MAIN $F77_DUMMY_MAIN +_ACEOF + + if test "x$ac_cv_fc_dummy_main" = "x$ac_cv_f77_dummy_main"; then + +$as_echo "#define FC_DUMMY_MAIN_EQ_F77 1" >>confdefs.h + + fi +fi +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "linking to Fortran libraries from C fails +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran 77 name-mangling scheme" >&5 +$as_echo_n "checking for Fortran 77 name-mangling scheme... " >&6; } +if ${ac_cv_f77_mangling+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat > conftest.$ac_ext <<_ACEOF + subroutine foobar() + return + end + subroutine foo_bar() + return + end +_ACEOF +if ac_fn_f77_try_compile "$LINENO"; then : + mv conftest.$ac_objext cfortran_test.$ac_objext + + ac_save_LIBS=$LIBS + LIBS="cfortran_test.$ac_objext $LIBS $FLIBS" + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + ac_success=no + for ac_foobar in foobar FOOBAR; do + for ac_underscore in "" "_"; do + ac_func="$ac_foobar$ac_underscore" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_success=yes; break 2 +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + done + done + ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu + + if test "$ac_success" = "yes"; then + case $ac_foobar in + foobar) + ac_case=lower + ac_foo_bar=foo_bar + ;; + FOOBAR) + ac_case=upper + ac_foo_bar=FOO_BAR + ;; + esac + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + ac_success_extra=no + for ac_extra in "" "_"; do + ac_func="$ac_foo_bar$ac_underscore$ac_extra" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_success_extra=yes; break +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + done + ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu + + if test "$ac_success_extra" = "yes"; then + ac_cv_f77_mangling="$ac_case case" + if test -z "$ac_underscore"; then + ac_cv_f77_mangling="$ac_cv_f77_mangling, no underscore" + else + ac_cv_f77_mangling="$ac_cv_f77_mangling, underscore" + fi + if test -z "$ac_extra"; then + ac_cv_f77_mangling="$ac_cv_f77_mangling, no extra underscore" + else + ac_cv_f77_mangling="$ac_cv_f77_mangling, extra underscore" + fi + else + ac_cv_f77_mangling="unknown" + fi + else + ac_cv_f77_mangling="unknown" + fi + + LIBS=$ac_save_LIBS + rm -rf conftest* + rm -f cfortran_test* +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compile a simple Fortran program +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_f77_mangling" >&5 +$as_echo "$ac_cv_f77_mangling" >&6; } + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + +ax_blas_ok=no + + +# Check whether --with-blas was given. +if test "${with_blas+set}" = set; then : + withval=$with_blas; +fi + +case $with_blas in + yes | "") ;; + no) ax_blas_ok=disable ;; + -* | */* | *.a | *.so | *.so.* | *.o) BLAS_LIBS="$with_blas" ;; + *) BLAS_LIBS="-l$with_blas" ;; +esac + +# Get fortran linker names of BLAS functions to check for. +ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu +case $ac_cv_f77_mangling in + upper*) ac_val="SGEMM" ;; + lower*) ac_val="sgemm" ;; + *) ac_val="unknown" ;; +esac +case $ac_cv_f77_mangling in *," underscore"*) ac_val="$ac_val"_ ;; esac + +sgemm="$ac_val" + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu +case $ac_cv_f77_mangling in + upper*) ac_val="DGEMM" ;; + lower*) ac_val="dgemm" ;; + *) ac_val="unknown" ;; +esac +case $ac_cv_f77_mangling in *," underscore"*) ac_val="$ac_val"_ ;; esac + +dgemm="$ac_val" + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +ax_blas_save_LIBS="$LIBS" +LIBS="$LIBS $FLIBS" + +# First, check BLAS_LIBS environment variable +if test $ax_blas_ok = no; then +if test "x$BLAS_LIBS" != x; then + save_LIBS="$LIBS"; LIBS="$BLAS_LIBS $LIBS" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $sgemm in $BLAS_LIBS" >&5 +$as_echo_n "checking for $sgemm in $BLAS_LIBS... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $sgemm (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return $sgemm (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_blas_ok=yes +else + BLAS_LIBS="" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_blas_ok" >&5 +$as_echo "$ax_blas_ok" >&6; } + LIBS="$save_LIBS" +fi +fi + +# BLAS linked to by default? (happens on some supercomputers) +if test $ax_blas_ok = no; then + save_LIBS="$LIBS"; LIBS="$LIBS" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $sgemm is being linked in already" >&5 +$as_echo_n "checking if $sgemm is being linked in already... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $sgemm (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return $sgemm (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_blas_ok=yes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_blas_ok" >&5 +$as_echo "$ax_blas_ok" >&6; } + LIBS="$save_LIBS" +fi + +# BLAS in OpenBLAS library? (http://xianyi.github.com/OpenBLAS/) +if test $ax_blas_ok = no; then + as_ac_Lib=`$as_echo "ac_cv_lib_openblas_$sgemm" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $sgemm in -lopenblas" >&5 +$as_echo_n "checking for $sgemm in -lopenblas... " >&6; } +if eval \${$as_ac_Lib+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lopenblas $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $sgemm (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return $sgemm (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$as_ac_Lib=yes" +else + eval "$as_ac_Lib=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : + ax_blas_ok=yes + BLAS_LIBS="-lopenblas" +fi + +fi + +# BLAS in ATLAS library? (http://math-atlas.sourceforge.net/) +if test $ax_blas_ok = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ATL_xerbla in -latlas" >&5 +$as_echo_n "checking for ATL_xerbla in -latlas... " >&6; } +if ${ac_cv_lib_atlas_ATL_xerbla+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-latlas $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char ATL_xerbla (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return ATL_xerbla (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_atlas_ATL_xerbla=yes +else + ac_cv_lib_atlas_ATL_xerbla=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_atlas_ATL_xerbla" >&5 +$as_echo "$ac_cv_lib_atlas_ATL_xerbla" >&6; } +if test "x$ac_cv_lib_atlas_ATL_xerbla" = xyes; then : + as_ac_Lib=`$as_echo "ac_cv_lib_f77blas_$sgemm" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $sgemm in -lf77blas" >&5 +$as_echo_n "checking for $sgemm in -lf77blas... " >&6; } +if eval \${$as_ac_Lib+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lf77blas -latlas $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $sgemm (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return $sgemm (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$as_ac_Lib=yes" +else + eval "$as_ac_Lib=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cblas_dgemm in -lcblas" >&5 +$as_echo_n "checking for cblas_dgemm in -lcblas... " >&6; } +if ${ac_cv_lib_cblas_cblas_dgemm+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lcblas -lf77blas -latlas $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char cblas_dgemm (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return cblas_dgemm (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_cblas_cblas_dgemm=yes +else + ac_cv_lib_cblas_cblas_dgemm=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cblas_cblas_dgemm" >&5 +$as_echo "$ac_cv_lib_cblas_cblas_dgemm" >&6; } +if test "x$ac_cv_lib_cblas_cblas_dgemm" = xyes; then : + ax_blas_ok=yes + BLAS_LIBS="-lcblas -lf77blas -latlas" +fi + +fi + +fi + +fi + +# BLAS in PhiPACK libraries? (requires generic BLAS lib, too) +if test $ax_blas_ok = no; then + as_ac_Lib=`$as_echo "ac_cv_lib_blas_$sgemm" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $sgemm in -lblas" >&5 +$as_echo_n "checking for $sgemm in -lblas... " >&6; } +if eval \${$as_ac_Lib+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lblas $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $sgemm (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return $sgemm (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$as_ac_Lib=yes" +else + eval "$as_ac_Lib=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : + as_ac_Lib=`$as_echo "ac_cv_lib_dgemm_$dgemm" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $dgemm in -ldgemm" >&5 +$as_echo_n "checking for $dgemm in -ldgemm... " >&6; } +if eval \${$as_ac_Lib+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldgemm -lblas $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $dgemm (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return $dgemm (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$as_ac_Lib=yes" +else + eval "$as_ac_Lib=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : + as_ac_Lib=`$as_echo "ac_cv_lib_sgemm_$sgemm" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $sgemm in -lsgemm" >&5 +$as_echo_n "checking for $sgemm in -lsgemm... " >&6; } +if eval \${$as_ac_Lib+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsgemm -lblas $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $sgemm (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return $sgemm (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$as_ac_Lib=yes" +else + eval "$as_ac_Lib=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : + ax_blas_ok=yes; BLAS_LIBS="-lsgemm -ldgemm -lblas" +fi + +fi + +fi + +fi + +# BLAS in Intel MKL library? +if test $ax_blas_ok = no; then + # MKL for gfortran + if test x"$ac_cv_fc_compiler_gnu" = xyes; then + # 64 bit + if test $host_cpu = x86_64; then + as_ac_Lib=`$as_echo "ac_cv_lib_mkl_gf_lp64_$sgemm" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $sgemm in -lmkl_gf_lp64" >&5 +$as_echo_n "checking for $sgemm in -lmkl_gf_lp64... " >&6; } +if eval \${$as_ac_Lib+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lmkl_gf_lp64 -lmkl_gf_lp64 -lmkl_sequential -lmkl_core -lpthread $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $sgemm (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return $sgemm (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$as_ac_Lib=yes" +else + eval "$as_ac_Lib=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : + ax_blas_ok=yes;BLAS_LIBS="-lmkl_gf_lp64 -lmkl_sequential -lmkl_core -lpthread" +fi + + # 32 bit + elif test $host_cpu = i686; then + as_ac_Lib=`$as_echo "ac_cv_lib_mkl_gf_$sgemm" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $sgemm in -lmkl_gf" >&5 +$as_echo_n "checking for $sgemm in -lmkl_gf... " >&6; } +if eval \${$as_ac_Lib+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lmkl_gf -lmkl_gf -lmkl_sequential -lmkl_core -lpthread $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $sgemm (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return $sgemm (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$as_ac_Lib=yes" +else + eval "$as_ac_Lib=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : + ax_blas_ok=yes;BLAS_LIBS="-lmkl_gf -lmkl_sequential -lmkl_core -lpthread" +fi + + fi + # MKL for other compilers (Intel, PGI, ...?) + else + # 64-bit + if test $host_cpu = x86_64; then + as_ac_Lib=`$as_echo "ac_cv_lib_mkl_intel_lp64_$sgemm" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $sgemm in -lmkl_intel_lp64" >&5 +$as_echo_n "checking for $sgemm in -lmkl_intel_lp64... " >&6; } +if eval \${$as_ac_Lib+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lmkl_intel_lp64 -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lpthread $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $sgemm (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return $sgemm (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$as_ac_Lib=yes" +else + eval "$as_ac_Lib=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : + ax_blas_ok=yes;BLAS_LIBS="-lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lpthread" +fi + + # 32-bit + elif test $host_cpu = i686; then + as_ac_Lib=`$as_echo "ac_cv_lib_mkl_intel_$sgemm" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $sgemm in -lmkl_intel" >&5 +$as_echo_n "checking for $sgemm in -lmkl_intel... " >&6; } +if eval \${$as_ac_Lib+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lmkl_intel -lmkl_intel -lmkl_sequential -lmkl_core -lpthread $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $sgemm (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return $sgemm (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$as_ac_Lib=yes" +else + eval "$as_ac_Lib=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : + ax_blas_ok=yes;BLAS_LIBS="-lmkl_intel -lmkl_sequential -lmkl_core -lpthread" +fi + + fi + fi +fi +# Old versions of MKL +if test $ax_blas_ok = no; then + as_ac_Lib=`$as_echo "ac_cv_lib_mkl_$sgemm" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $sgemm in -lmkl" >&5 +$as_echo_n "checking for $sgemm in -lmkl... " >&6; } +if eval \${$as_ac_Lib+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lmkl -lguide -lpthread $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $sgemm (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return $sgemm (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$as_ac_Lib=yes" +else + eval "$as_ac_Lib=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : + ax_blas_ok=yes;BLAS_LIBS="-lmkl -lguide -lpthread" +fi + +fi + +# BLAS in Apple vecLib library? +if test $ax_blas_ok = no; then + save_LIBS="$LIBS"; LIBS="-framework vecLib $LIBS" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $sgemm in -framework vecLib" >&5 +$as_echo_n "checking for $sgemm in -framework vecLib... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $sgemm (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return $sgemm (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_blas_ok=yes;BLAS_LIBS="-framework vecLib" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_blas_ok" >&5 +$as_echo "$ax_blas_ok" >&6; } + LIBS="$save_LIBS" +fi + +# BLAS in Alpha CXML library? +if test $ax_blas_ok = no; then + as_ac_Lib=`$as_echo "ac_cv_lib_cxml_$sgemm" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $sgemm in -lcxml" >&5 +$as_echo_n "checking for $sgemm in -lcxml... " >&6; } +if eval \${$as_ac_Lib+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lcxml $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $sgemm (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return $sgemm (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$as_ac_Lib=yes" +else + eval "$as_ac_Lib=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : + ax_blas_ok=yes;BLAS_LIBS="-lcxml" +fi + +fi + +# BLAS in Alpha DXML library? (now called CXML, see above) +if test $ax_blas_ok = no; then + as_ac_Lib=`$as_echo "ac_cv_lib_dxml_$sgemm" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $sgemm in -ldxml" >&5 +$as_echo_n "checking for $sgemm in -ldxml... " >&6; } +if eval \${$as_ac_Lib+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldxml $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $sgemm (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return $sgemm (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$as_ac_Lib=yes" +else + eval "$as_ac_Lib=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : + ax_blas_ok=yes;BLAS_LIBS="-ldxml" +fi + +fi + +# BLAS in Sun Performance library? +if test $ax_blas_ok = no; then + if test "x$GCC" != xyes; then # only works with Sun CC + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for acosp in -lsunmath" >&5 +$as_echo_n "checking for acosp in -lsunmath... " >&6; } +if ${ac_cv_lib_sunmath_acosp+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsunmath $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char acosp (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return acosp (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_sunmath_acosp=yes +else + ac_cv_lib_sunmath_acosp=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sunmath_acosp" >&5 +$as_echo "$ac_cv_lib_sunmath_acosp" >&6; } +if test "x$ac_cv_lib_sunmath_acosp" = xyes; then : + as_ac_Lib=`$as_echo "ac_cv_lib_sunperf_$sgemm" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $sgemm in -lsunperf" >&5 +$as_echo_n "checking for $sgemm in -lsunperf... " >&6; } +if eval \${$as_ac_Lib+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsunperf -lsunmath $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $sgemm (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return $sgemm (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$as_ac_Lib=yes" +else + eval "$as_ac_Lib=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : + BLAS_LIBS="-xlic_lib=sunperf -lsunmath" + ax_blas_ok=yes +fi + +fi + + fi +fi + +# BLAS in SCSL library? (SGI/Cray Scientific Library) +if test $ax_blas_ok = no; then + as_ac_Lib=`$as_echo "ac_cv_lib_scs_$sgemm" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $sgemm in -lscs" >&5 +$as_echo_n "checking for $sgemm in -lscs... " >&6; } +if eval \${$as_ac_Lib+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lscs $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $sgemm (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return $sgemm (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$as_ac_Lib=yes" +else + eval "$as_ac_Lib=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : + ax_blas_ok=yes; BLAS_LIBS="-lscs" +fi + +fi + +# BLAS in SGIMATH library? +if test $ax_blas_ok = no; then + as_ac_Lib=`$as_echo "ac_cv_lib_complib.sgimath_$sgemm" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $sgemm in -lcomplib.sgimath" >&5 +$as_echo_n "checking for $sgemm in -lcomplib.sgimath... " >&6; } +if eval \${$as_ac_Lib+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lcomplib.sgimath $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $sgemm (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return $sgemm (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$as_ac_Lib=yes" +else + eval "$as_ac_Lib=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : + ax_blas_ok=yes; BLAS_LIBS="-lcomplib.sgimath" +fi + +fi + +# BLAS in IBM ESSL library? (requires generic BLAS lib, too) +if test $ax_blas_ok = no; then + as_ac_Lib=`$as_echo "ac_cv_lib_blas_$sgemm" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $sgemm in -lblas" >&5 +$as_echo_n "checking for $sgemm in -lblas... " >&6; } +if eval \${$as_ac_Lib+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lblas $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $sgemm (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return $sgemm (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$as_ac_Lib=yes" +else + eval "$as_ac_Lib=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : + as_ac_Lib=`$as_echo "ac_cv_lib_essl_$sgemm" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $sgemm in -lessl" >&5 +$as_echo_n "checking for $sgemm in -lessl... " >&6; } +if eval \${$as_ac_Lib+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lessl -lblas $FLIBS $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $sgemm (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return $sgemm (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$as_ac_Lib=yes" +else + eval "$as_ac_Lib=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : + ax_blas_ok=yes; BLAS_LIBS="-lessl -lblas" +fi + +fi + +fi + +# Generic BLAS library? +if test $ax_blas_ok = no; then + as_ac_Lib=`$as_echo "ac_cv_lib_blas_$sgemm" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $sgemm in -lblas" >&5 +$as_echo_n "checking for $sgemm in -lblas... " >&6; } +if eval \${$as_ac_Lib+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lblas $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $sgemm (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return $sgemm (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$as_ac_Lib=yes" +else + eval "$as_ac_Lib=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : + ax_blas_ok=yes; BLAS_LIBS="-lblas" +fi + +fi + + + +LIBS="$ax_blas_save_LIBS" + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x"$ax_blas_ok" = xyes; then + +$as_echo "#define HAVE_BLAS 1" >>confdefs.h + + : +else + ax_blas_ok=no + +fi + + +# output data +ac_config_files="$ac_config_files Makefile coinhsl.pc" + +ac_config_headers="$ac_config_headers config.h CoinHslConfig.h" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +$as_echo_n "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 +$as_echo "done" >&6; } + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_MC19_TRUE}" && test -z "${HAVE_MC19_FALSE}"; then + as_fn_error $? "conditional \"HAVE_MC19\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_MA27_TRUE}" && test -z "${HAVE_MA27_FALSE}"; then + as_fn_error $? "conditional \"HAVE_MA27\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_MA28_TRUE}" && test -z "${HAVE_MA28_FALSE}"; then + as_fn_error $? "conditional \"HAVE_MA28\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_MA57_TRUE}" && test -z "${HAVE_MA57_FALSE}"; then + as_fn_error $? "conditional \"HAVE_MA57\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_MA77_TRUE}" && test -z "${HAVE_MA77_FALSE}"; then + as_fn_error $? "conditional \"HAVE_MA77\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_MA86_TRUE}" && test -z "${HAVE_MA86_FALSE}"; then + as_fn_error $? "conditional \"HAVE_MA86\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_MA97_TRUE}" && test -z "${HAVE_MA97_FALSE}"; then + as_fn_error $? "conditional \"HAVE_MA97\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_MC68_TRUE}" && test -z "${HAVE_MC68_FALSE}"; then + as_fn_error $? "conditional \"HAVE_MC68\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_METIS_TRUE}" && test -z "${HAVE_METIS_FALSE}"; then + as_fn_error $? "conditional \"HAVE_METIS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${TARGET_DLL_TRUE}" && test -z "${TARGET_DLL_FALSE}"; then + as_fn_error $? "conditional \"TARGET_DLL\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by coinhsl $as_me 2015.06.23, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +coinhsl config.status 2015.06.23 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' +macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' +enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' +enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' +pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' +SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' +ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' +PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' +host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' +host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' +host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' +build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' +build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' +build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' +SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' +Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' +GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' +EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' +FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' +LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' +NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' +LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' +ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' +exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' +lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' +lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' +lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' +reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' +file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' +want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' +DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' +sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' +AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' +archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' +STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' +RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' +lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' +CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' +compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' +GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' +nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' +lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' +objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' +need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' +MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' +LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' +OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' +libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' +module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' +postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' +need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' +version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' +runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' +libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' +soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' +install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' +finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' +sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' +old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' +striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' +predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' +postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' +predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' +postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' +LD_F77='`$ECHO "$LD_F77" | $SED "$delay_single_quote_subst"`' +LD_FC='`$ECHO "$LD_FC" | $SED "$delay_single_quote_subst"`' +reload_flag_F77='`$ECHO "$reload_flag_F77" | $SED "$delay_single_quote_subst"`' +reload_flag_FC='`$ECHO "$reload_flag_FC" | $SED "$delay_single_quote_subst"`' +reload_cmds_F77='`$ECHO "$reload_cmds_F77" | $SED "$delay_single_quote_subst"`' +reload_cmds_FC='`$ECHO "$reload_cmds_FC" | $SED "$delay_single_quote_subst"`' +old_archive_cmds_F77='`$ECHO "$old_archive_cmds_F77" | $SED "$delay_single_quote_subst"`' +old_archive_cmds_FC='`$ECHO "$old_archive_cmds_FC" | $SED "$delay_single_quote_subst"`' +compiler_F77='`$ECHO "$compiler_F77" | $SED "$delay_single_quote_subst"`' +compiler_FC='`$ECHO "$compiler_FC" | $SED "$delay_single_quote_subst"`' +GCC_F77='`$ECHO "$GCC_F77" | $SED "$delay_single_quote_subst"`' +GCC_FC='`$ECHO "$GCC_FC" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag_F77='`$ECHO "$lt_prog_compiler_no_builtin_flag_F77" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag_FC='`$ECHO "$lt_prog_compiler_no_builtin_flag_FC" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic_F77='`$ECHO "$lt_prog_compiler_pic_F77" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic_FC='`$ECHO "$lt_prog_compiler_pic_FC" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl_F77='`$ECHO "$lt_prog_compiler_wl_F77" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl_FC='`$ECHO "$lt_prog_compiler_wl_FC" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static_F77='`$ECHO "$lt_prog_compiler_static_F77" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static_FC='`$ECHO "$lt_prog_compiler_static_FC" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o_F77='`$ECHO "$lt_cv_prog_compiler_c_o_F77" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o_FC='`$ECHO "$lt_cv_prog_compiler_c_o_FC" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc_F77='`$ECHO "$archive_cmds_need_lc_F77" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc_FC='`$ECHO "$archive_cmds_need_lc_FC" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes_F77='`$ECHO "$enable_shared_with_static_runtimes_F77" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes_FC='`$ECHO "$enable_shared_with_static_runtimes_FC" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec_F77='`$ECHO "$export_dynamic_flag_spec_F77" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec_FC='`$ECHO "$export_dynamic_flag_spec_FC" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec_F77='`$ECHO "$whole_archive_flag_spec_F77" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec_FC='`$ECHO "$whole_archive_flag_spec_FC" | $SED "$delay_single_quote_subst"`' +compiler_needs_object_F77='`$ECHO "$compiler_needs_object_F77" | $SED "$delay_single_quote_subst"`' +compiler_needs_object_FC='`$ECHO "$compiler_needs_object_FC" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds_F77='`$ECHO "$old_archive_from_new_cmds_F77" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds_FC='`$ECHO "$old_archive_from_new_cmds_FC" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds_F77='`$ECHO "$old_archive_from_expsyms_cmds_F77" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds_FC='`$ECHO "$old_archive_from_expsyms_cmds_FC" | $SED "$delay_single_quote_subst"`' +archive_cmds_F77='`$ECHO "$archive_cmds_F77" | $SED "$delay_single_quote_subst"`' +archive_cmds_FC='`$ECHO "$archive_cmds_FC" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds_F77='`$ECHO "$archive_expsym_cmds_F77" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds_FC='`$ECHO "$archive_expsym_cmds_FC" | $SED "$delay_single_quote_subst"`' +module_cmds_F77='`$ECHO "$module_cmds_F77" | $SED "$delay_single_quote_subst"`' +module_cmds_FC='`$ECHO "$module_cmds_FC" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds_F77='`$ECHO "$module_expsym_cmds_F77" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds_FC='`$ECHO "$module_expsym_cmds_FC" | $SED "$delay_single_quote_subst"`' +with_gnu_ld_F77='`$ECHO "$with_gnu_ld_F77" | $SED "$delay_single_quote_subst"`' +with_gnu_ld_FC='`$ECHO "$with_gnu_ld_FC" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag_F77='`$ECHO "$allow_undefined_flag_F77" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag_FC='`$ECHO "$allow_undefined_flag_FC" | $SED "$delay_single_quote_subst"`' +no_undefined_flag_F77='`$ECHO "$no_undefined_flag_F77" | $SED "$delay_single_quote_subst"`' +no_undefined_flag_FC='`$ECHO "$no_undefined_flag_FC" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_F77='`$ECHO "$hardcode_libdir_flag_spec_F77" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_FC='`$ECHO "$hardcode_libdir_flag_spec_FC" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator_F77='`$ECHO "$hardcode_libdir_separator_F77" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator_FC='`$ECHO "$hardcode_libdir_separator_FC" | $SED "$delay_single_quote_subst"`' +hardcode_direct_F77='`$ECHO "$hardcode_direct_F77" | $SED "$delay_single_quote_subst"`' +hardcode_direct_FC='`$ECHO "$hardcode_direct_FC" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute_F77='`$ECHO "$hardcode_direct_absolute_F77" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute_FC='`$ECHO "$hardcode_direct_absolute_FC" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L_F77='`$ECHO "$hardcode_minus_L_F77" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L_FC='`$ECHO "$hardcode_minus_L_FC" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var_F77='`$ECHO "$hardcode_shlibpath_var_F77" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var_FC='`$ECHO "$hardcode_shlibpath_var_FC" | $SED "$delay_single_quote_subst"`' +hardcode_automatic_F77='`$ECHO "$hardcode_automatic_F77" | $SED "$delay_single_quote_subst"`' +hardcode_automatic_FC='`$ECHO "$hardcode_automatic_FC" | $SED "$delay_single_quote_subst"`' +inherit_rpath_F77='`$ECHO "$inherit_rpath_F77" | $SED "$delay_single_quote_subst"`' +inherit_rpath_FC='`$ECHO "$inherit_rpath_FC" | $SED "$delay_single_quote_subst"`' +link_all_deplibs_F77='`$ECHO "$link_all_deplibs_F77" | $SED "$delay_single_quote_subst"`' +link_all_deplibs_FC='`$ECHO "$link_all_deplibs_FC" | $SED "$delay_single_quote_subst"`' +always_export_symbols_F77='`$ECHO "$always_export_symbols_F77" | $SED "$delay_single_quote_subst"`' +always_export_symbols_FC='`$ECHO "$always_export_symbols_FC" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds_F77='`$ECHO "$export_symbols_cmds_F77" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds_FC='`$ECHO "$export_symbols_cmds_FC" | $SED "$delay_single_quote_subst"`' +exclude_expsyms_F77='`$ECHO "$exclude_expsyms_F77" | $SED "$delay_single_quote_subst"`' +exclude_expsyms_FC='`$ECHO "$exclude_expsyms_FC" | $SED "$delay_single_quote_subst"`' +include_expsyms_F77='`$ECHO "$include_expsyms_F77" | $SED "$delay_single_quote_subst"`' +include_expsyms_FC='`$ECHO "$include_expsyms_FC" | $SED "$delay_single_quote_subst"`' +prelink_cmds_F77='`$ECHO "$prelink_cmds_F77" | $SED "$delay_single_quote_subst"`' +prelink_cmds_FC='`$ECHO "$prelink_cmds_FC" | $SED "$delay_single_quote_subst"`' +postlink_cmds_F77='`$ECHO "$postlink_cmds_F77" | $SED "$delay_single_quote_subst"`' +postlink_cmds_FC='`$ECHO "$postlink_cmds_FC" | $SED "$delay_single_quote_subst"`' +file_list_spec_F77='`$ECHO "$file_list_spec_F77" | $SED "$delay_single_quote_subst"`' +file_list_spec_FC='`$ECHO "$file_list_spec_FC" | $SED "$delay_single_quote_subst"`' +hardcode_action_F77='`$ECHO "$hardcode_action_F77" | $SED "$delay_single_quote_subst"`' +hardcode_action_FC='`$ECHO "$hardcode_action_FC" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs_F77='`$ECHO "$compiler_lib_search_dirs_F77" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs_FC='`$ECHO "$compiler_lib_search_dirs_FC" | $SED "$delay_single_quote_subst"`' +predep_objects_F77='`$ECHO "$predep_objects_F77" | $SED "$delay_single_quote_subst"`' +predep_objects_FC='`$ECHO "$predep_objects_FC" | $SED "$delay_single_quote_subst"`' +postdep_objects_F77='`$ECHO "$postdep_objects_F77" | $SED "$delay_single_quote_subst"`' +postdep_objects_FC='`$ECHO "$postdep_objects_FC" | $SED "$delay_single_quote_subst"`' +predeps_F77='`$ECHO "$predeps_F77" | $SED "$delay_single_quote_subst"`' +predeps_FC='`$ECHO "$predeps_FC" | $SED "$delay_single_quote_subst"`' +postdeps_F77='`$ECHO "$postdeps_F77" | $SED "$delay_single_quote_subst"`' +postdeps_FC='`$ECHO "$postdeps_FC" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path_F77='`$ECHO "$compiler_lib_search_path_F77" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path_FC='`$ECHO "$compiler_lib_search_path_FC" | $SED "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in SHELL \ +ECHO \ +PATH_SEPARATOR \ +SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +OBJDUMP \ +deplibs_check_method \ +file_magic_cmd \ +file_magic_glob \ +want_nocaseglob \ +DLLTOOL \ +sharedlib_from_linklib_cmd \ +AR \ +AR_FLAGS \ +archiver_list_spec \ +STRIP \ +RANLIB \ +CC \ +CFLAGS \ +compiler \ +lt_cv_sys_global_symbol_pipe \ +lt_cv_sys_global_symbol_to_cdecl \ +lt_cv_sys_global_symbol_to_c_name_address \ +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +nm_file_list_spec \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_pic \ +lt_prog_compiler_wl \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +MANIFEST_TOOL \ +DSYMUTIL \ +NMEDIT \ +LIPO \ +OTOOL \ +OTOOL64 \ +shrext_cmds \ +export_dynamic_flag_spec \ +whole_archive_flag_spec \ +compiler_needs_object \ +with_gnu_ld \ +allow_undefined_flag \ +no_undefined_flag \ +hardcode_libdir_flag_spec \ +hardcode_libdir_separator \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +install_override_mode \ +finish_eval \ +old_striplib \ +striplib \ +compiler_lib_search_dirs \ +predep_objects \ +postdep_objects \ +predeps \ +postdeps \ +compiler_lib_search_path \ +LD_F77 \ +LD_FC \ +reload_flag_F77 \ +reload_flag_FC \ +compiler_F77 \ +compiler_FC \ +lt_prog_compiler_no_builtin_flag_F77 \ +lt_prog_compiler_no_builtin_flag_FC \ +lt_prog_compiler_pic_F77 \ +lt_prog_compiler_pic_FC \ +lt_prog_compiler_wl_F77 \ +lt_prog_compiler_wl_FC \ +lt_prog_compiler_static_F77 \ +lt_prog_compiler_static_FC \ +lt_cv_prog_compiler_c_o_F77 \ +lt_cv_prog_compiler_c_o_FC \ +export_dynamic_flag_spec_F77 \ +export_dynamic_flag_spec_FC \ +whole_archive_flag_spec_F77 \ +whole_archive_flag_spec_FC \ +compiler_needs_object_F77 \ +compiler_needs_object_FC \ +with_gnu_ld_F77 \ +with_gnu_ld_FC \ +allow_undefined_flag_F77 \ +allow_undefined_flag_FC \ +no_undefined_flag_F77 \ +no_undefined_flag_FC \ +hardcode_libdir_flag_spec_F77 \ +hardcode_libdir_flag_spec_FC \ +hardcode_libdir_separator_F77 \ +hardcode_libdir_separator_FC \ +exclude_expsyms_F77 \ +exclude_expsyms_FC \ +include_expsyms_F77 \ +include_expsyms_FC \ +file_list_spec_F77 \ +file_list_spec_FC \ +compiler_lib_search_dirs_F77 \ +compiler_lib_search_dirs_FC \ +predep_objects_F77 \ +predep_objects_FC \ +postdep_objects_F77 \ +postdep_objects_FC \ +predeps_F77 \ +predeps_FC \ +postdeps_F77 \ +postdeps_FC \ +compiler_lib_search_path_F77 \ +compiler_lib_search_path_FC; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in reload_cmds \ +old_postinstall_cmds \ +old_postuninstall_cmds \ +old_archive_cmds \ +extract_expsyms_cmds \ +old_archive_from_new_cmds \ +old_archive_from_expsyms_cmds \ +archive_cmds \ +archive_expsym_cmds \ +module_cmds \ +module_expsym_cmds \ +export_symbols_cmds \ +prelink_cmds \ +postlink_cmds \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +sys_lib_dlsearch_path_spec \ +reload_cmds_F77 \ +reload_cmds_FC \ +old_archive_cmds_F77 \ +old_archive_cmds_FC \ +old_archive_from_new_cmds_F77 \ +old_archive_from_new_cmds_FC \ +old_archive_from_expsyms_cmds_F77 \ +old_archive_from_expsyms_cmds_FC \ +archive_cmds_F77 \ +archive_cmds_FC \ +archive_expsym_cmds_F77 \ +archive_expsym_cmds_FC \ +module_cmds_F77 \ +module_cmds_FC \ +module_expsym_cmds_F77 \ +module_expsym_cmds_FC \ +export_symbols_cmds_F77 \ +export_symbols_cmds_FC \ +prelink_cmds_F77 \ +prelink_cmds_FC \ +postlink_cmds_F77 \ +postlink_cmds_FC; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +ac_aux_dir='$ac_aux_dir' +xsi_shell='$xsi_shell' +lt_shell_append='$lt_shell_append' + +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + + + PACKAGE='$PACKAGE' + VERSION='$VERSION' + TIMESTAMP='$TIMESTAMP' + RM='$RM' + ofile='$ofile' + + + + + + + + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "coinhsl.pc") CONFIG_FILES="$CONFIG_FILES coinhsl.pc" ;; + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "CoinHslConfig.h") CONFIG_HEADERS="$CONFIG_HEADERS CoinHslConfig.h" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "$am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + "libtool":C) + + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +# The names of the tagged configurations supported by this script. +available_tags="F77 FC " + +# ### BEGIN LIBTOOL CONFIG + +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that protects backslashes. +ECHO=$lt_ECHO + +# The PATH separator for the build system. +PATH_SEPARATOR=$lt_PATH_SEPARATOR + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="\$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP=$lt_GREP + +# An ERE matcher. +EGREP=$lt_EGREP + +# A literal string matcher. +FGREP=$lt_FGREP + +# A BSD- or MS-compatible name lister. +NM=$lt_NM + +# Whether we need soft or hard links. +LN_S=$lt_LN_S + +# What is the maximum length of a command? +max_cmd_len=$max_cmd_len + +# Object file suffix (normally "o"). +objext=$ac_objext + +# Executable file suffix (normally ""). +exeext=$exeext + +# whether the shell understands "unset". +lt_unset=$lt_unset + +# turn spaces into newlines. +SP2NL=$lt_lt_SP2NL + +# turn newlines into spaces. +NL2SP=$lt_lt_NL2SP + +# convert \$build file names to \$host format. +to_host_file_cmd=$lt_cv_to_host_file_cmd + +# convert \$build files to toolchain format. +to_tool_file_cmd=$lt_cv_to_tool_file_cmd + +# An object symbol dumper. +OBJDUMP=$lt_OBJDUMP + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method = "file_magic". +file_magic_cmd=$lt_file_magic_cmd + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob=$lt_file_magic_glob + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob=$lt_want_nocaseglob + +# DLL creation program. +DLLTOOL=$lt_DLLTOOL + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd + +# The archiver. +AR=$lt_AR + +# Flags to create an archive. +AR_FLAGS=$lt_AR_FLAGS + +# How to feed a file listing to the archiver. +archiver_list_spec=$lt_archiver_list_spec + +# A symbol stripping program. +STRIP=$lt_STRIP + +# Commands used to install an old-style archive. +RANLIB=$lt_RANLIB +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=$lock_old_archive_extraction + +# A C compiler. +LTCC=$lt_CC + +# LTCC compiler flags. +LTCFLAGS=$lt_CFLAGS + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + +# Specify filename containing input files for \$NM. +nm_file_list_spec=$lt_nm_file_list_spec + +# The root where to search for dependent libraries,and in which our libraries should be installed. +lt_sysroot=$lt_sysroot + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=$MAGIC_CMD + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Manifest tool. +MANIFEST_TOOL=$lt_MANIFEST_TOOL + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL=$lt_DSYMUTIL + +# Tool to change global to local symbols on Mac OS X. +NMEDIT=$lt_NMEDIT + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO=$lt_LIPO + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL=$lt_OTOOL + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=$lt_OTOOL64 + +# Old archive suffix (normally "a"). +libext=$libext + +# Shared library suffix (normally ".so"). +shrext_cmds=$lt_shrext_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink=$lt_variables_saved_for_relink + +# Do we need the "lib" prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Library versioning type. +version_type=$version_type + +# Shared library runtime path variable. +runpath_var=$runpath_var + +# Shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Permission mode override for installation of shared libraries. +install_override_mode=$lt_install_override_mode + +# Command to use after installation of a shared archive. +postinstall_cmds=$lt_postinstall_cmds + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval=$lt_finish_eval + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Compile-time system search path for libraries. +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + + +# The linker used to build libraries. +LD=$lt_LD + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds + +# A language specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU compiler? +with_gcc=$GCC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects +postdep_objects=$lt_postdep_objects +predeps=$lt_predeps +postdeps=$lt_postdeps + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + +ltmain="$ac_aux_dir/ltmain.sh" + + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + if test x"$xsi_shell" = xyes; then + sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ +func_dirname ()\ +{\ +\ case ${1} in\ +\ */*) func_dirname_result="${1%/*}${2}" ;;\ +\ * ) func_dirname_result="${3}" ;;\ +\ esac\ +} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_basename ()$/,/^} # func_basename /c\ +func_basename ()\ +{\ +\ func_basename_result="${1##*/}"\ +} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ +func_dirname_and_basename ()\ +{\ +\ case ${1} in\ +\ */*) func_dirname_result="${1%/*}${2}" ;;\ +\ * ) func_dirname_result="${3}" ;;\ +\ esac\ +\ func_basename_result="${1##*/}"\ +} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ +func_stripname ()\ +{\ +\ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ +\ # positional parameters, so assign one to ordinary parameter first.\ +\ func_stripname_result=${3}\ +\ func_stripname_result=${func_stripname_result#"${1}"}\ +\ func_stripname_result=${func_stripname_result%"${2}"}\ +} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ +func_split_long_opt ()\ +{\ +\ func_split_long_opt_name=${1%%=*}\ +\ func_split_long_opt_arg=${1#*=}\ +} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ +func_split_short_opt ()\ +{\ +\ func_split_short_opt_arg=${1#??}\ +\ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ +} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ +func_lo2o ()\ +{\ +\ case ${1} in\ +\ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ +\ *) func_lo2o_result=${1} ;;\ +\ esac\ +} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_xform ()$/,/^} # func_xform /c\ +func_xform ()\ +{\ + func_xform_result=${1%.*}.lo\ +} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_arith ()$/,/^} # func_arith /c\ +func_arith ()\ +{\ + func_arith_result=$(( $* ))\ +} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_len ()$/,/^} # func_len /c\ +func_len ()\ +{\ + func_len_result=${#1}\ +} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + +fi + +if test x"$lt_shell_append" = xyes; then + sed -e '/^func_append ()$/,/^} # func_append /c\ +func_append ()\ +{\ + eval "${1}+=\\${2}"\ +} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ +func_append_quoted ()\ +{\ +\ func_quote_for_eval "${2}"\ +\ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ +} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + # Save a `func_append' function call where possible by direct use of '+=' + sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +else + # Save a `func_append' function call even when '+=' is not available + sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +fi + +if test x"$_lt_function_replace_fail" = x":"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 +$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} +fi + + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + + cat <<_LT_EOF >> "$ofile" + +# ### BEGIN LIBTOOL TAG CONFIG: F77 + +# The linker used to build libraries. +LD=$lt_LD_F77 + +# How to create reloadable object files. +reload_flag=$lt_reload_flag_F77 +reload_cmds=$lt_reload_cmds_F77 + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds_F77 + +# A language specific compiler. +CC=$lt_compiler_F77 + +# Is the compiler the GNU compiler? +with_gcc=$GCC_F77 + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77 + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_F77 + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_F77 + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_F77 + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77 + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_F77 + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77 + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77 + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77 + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object_F77 + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77 + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77 + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds_F77 +archive_expsym_cmds=$lt_archive_expsym_cmds_F77 + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds_F77 +module_expsym_cmds=$lt_module_expsym_cmds_F77 + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld_F77 + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_F77 + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_F77 + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77 + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77 + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct_F77 + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute_F77 + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L_F77 + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_F77 + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic_F77 + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath_F77 + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_F77 + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols_F77 + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_F77 + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_F77 + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_F77 + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds_F77 + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds_F77 + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec_F77 + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_F77 + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_F77 + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects_F77 +postdep_objects=$lt_postdep_objects_F77 +predeps=$lt_predeps_F77 +postdeps=$lt_postdeps_F77 + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_F77 + +# ### END LIBTOOL TAG CONFIG: F77 +_LT_EOF + + + cat <<_LT_EOF >> "$ofile" + +# ### BEGIN LIBTOOL TAG CONFIG: FC + +# The linker used to build libraries. +LD=$lt_LD_FC + +# How to create reloadable object files. +reload_flag=$lt_reload_flag_FC +reload_cmds=$lt_reload_cmds_FC + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds_FC + +# A language specific compiler. +CC=$lt_compiler_FC + +# Is the compiler the GNU compiler? +with_gcc=$GCC_FC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_FC + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_FC + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_FC + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_FC + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_FC + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_FC + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_FC + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_FC + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_FC + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object_FC + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_FC + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_FC + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds_FC +archive_expsym_cmds=$lt_archive_expsym_cmds_FC + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds_FC +module_expsym_cmds=$lt_module_expsym_cmds_FC + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld_FC + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_FC + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_FC + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_FC + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_FC + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct_FC + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute_FC + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L_FC + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_FC + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic_FC + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath_FC + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_FC + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols_FC + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_FC + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_FC + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_FC + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds_FC + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds_FC + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec_FC + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_FC + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_FC + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects_FC +postdep_objects=$lt_postdep_objects_FC +predeps=$lt_predeps_FC +postdeps=$lt_postdeps_FC + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_FC + +# ### END LIBTOOL TAG CONFIG: FC +_LT_EOF + + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/coinhsl/configure.ac b/coinhsl/configure.ac new file mode 100644 index 0000000..216dede --- /dev/null +++ b/coinhsl/configure.ac @@ -0,0 +1,96 @@ +# Copyright (C) 2011 Science and Technology Facilities Council. + +# Author: Jonathan Hogg STFC 2011-09-20 + +#################################################################### + +# initialise automake +AC_INIT(coinhsl, 2015.06.23, hsl@stfc.ac.uk) +AC_CONFIG_SRCDIR([hsl_ma86/hsl_ma86d.f90]) +AC_CONFIG_MACRO_DIR([m4]) +AM_INIT_AUTOMAKE([subdir-objects]) + +# check for required programs +AC_PROG_FC +# Set f77 compiler to be same as f90 compiler unless explcitly told otherwise +if test "x$F77" = "x"; then + F77="$FC" +fi +if test "x$FFLAGS" = "x"; then + FFLAGS="$FCFLAGS" +fi +AC_PROG_F77 +AC_PROG_CC +AC_PROG_LIBTOOL + +# Define a macros to state availability, as per coin expectations +AC_DEFUN([HSL_CHECK_PKG],[ + pkg=$1 + AC_MSG_CHECKING([for $2]) + if test -r "$srcdir/$pkg/${pkg}d.f"; then + AC_DEFINE(COINHSL_HAS_$2, [1], [Define to 1 if $2 is available.]) + coin_has_$1=yes + AC_MSG_RESULT([yes]) + else + coin_has_$1=no + AC_MSG_RESULT([no]) + fi + AM_CONDITIONAL(HAVE_$2, test x$coin_has_$1 = xyes) + ]) +AC_DEFUN([HSL_CHECK_PKG_F90],[ + pkg=$1 + AC_MSG_CHECKING([for $2]) + if test -r "$srcdir/$pkg/${pkg}d.f90"; then + AC_DEFINE(COINHSL_HAS_$2, [1], [Define to 1 if $2 is available.]) + coin_has_$1=yes + AC_MSG_RESULT([yes]) + else + coin_has_$1=no + AC_MSG_RESULT([no]) + fi + AM_CONDITIONAL(HAVE_$2, test x$coin_has_$1 = xyes) + ]) + +HSL_CHECK_PKG(mc19,MC19) +HSL_CHECK_PKG(ma27,MA27) +HSL_CHECK_PKG(ma28,MA28) +HSL_CHECK_PKG(ma57,MA57) +HSL_CHECK_PKG_F90(hsl_ma77,MA77) +HSL_CHECK_PKG_F90(hsl_ma86,MA86) +HSL_CHECK_PKG_F90(hsl_ma97,MA97) + +# HSL_MC68 is an i.f90 not a d.f90 so can't use HSL_CHECK_PKG_F90 +AC_MSG_CHECKING([for MC68]) +if test -r "$srcdir/hsl_mc68/C/hsl_mc68i_ciface.f90"; then + AC_DEFINE(COINHSL_HAS_MC68, [1], [Define to 1 if MC68 is available.]) + coin_has_hsl_mc68=yes + AC_MSG_RESULT([yes]) +else + coin_has_hsl_mc68=no + AC_MSG_RESULT([no]) +fi +AM_CONDITIONAL(HAVE_MC68, test x$coin_has_hsl_mc68 = xyes) + +# Look for a metis we can compile +AC_MSG_CHECKING([for metis to compile]) +if test -r "$srcdir/metis-4.0.3/Lib/balance.c"; then + AC_DEFINE(COINHSL_HAS_METIS, [1], [Define to 1 if METIS is available to compile.]) + coin_has_metis=yes + AC_MSG_RESULT([yes]) +else + coin_has_metis=no + AC_MSG_RESULT([no]) +fi +AM_CONDITIONAL(HAVE_METIS, test x$coin_has_metis = xyes) + +# Check if we're on Windows and have to do extra legwork for DLLs +AC_CHECK_HEADERS(windows.h) +AM_CONDITIONAL(TARGET_DLL, test x$ac_cv_header_windows_h = xyes) + +# Check if we have BLAS (only used for windows as dep of dll) +AX_BLAS + +# output data +AC_CONFIG_FILES([Makefile coinhsl.pc]) +AC_CONFIG_HEADER(config.h CoinHslConfig.h) +AC_OUTPUT diff --git a/coinhsl/depcomp b/coinhsl/depcomp new file mode 100755 index 0000000..4ebd5b3 --- /dev/null +++ b/coinhsl/depcomp @@ -0,0 +1,791 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2013-05-30.07; # UTC + +# Copyright (C) 1999-2013 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by 'PROGRAMS ARGS'. + object Object file output by 'PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputting dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +# Get the directory component of the given path, and save it in the +# global variables '$dir'. Note that this directory component will +# be either empty or ending with a '/' character. This is deliberate. +set_dir_from () +{ + case $1 in + */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; + *) dir=;; + esac +} + +# Get the suffix-stripped basename of the given path, and save it the +# global variable '$base'. +set_base_from () +{ + base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` +} + +# If no dependency file was actually created by the compiler invocation, +# we still have to create a dummy depfile, to avoid errors with the +# Makefile "include basename.Plo" scheme. +make_dummy_depfile () +{ + echo "#dummy" > "$depfile" +} + +# Factor out some common post-processing of the generated depfile. +# Requires the auxiliary global variable '$tmpdepfile' to be set. +aix_post_process_depfile () +{ + # If the compiler actually managed to produce a dependency file, + # post-process it. + if test -f "$tmpdepfile"; then + # Each line is of the form 'foo.o: dependency.h'. + # Do two passes, one to just change these to + # $object: dependency.h + # and one to simply output + # dependency.h: + # which is needed to avoid the deleted-header problem. + { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" + sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" + } > "$depfile" + rm -f "$tmpdepfile" + else + make_dummy_depfile + fi +} + +# A tabulation character. +tab=' ' +# A newline character. +nl=' +' +# Character ranges might be problematic outside the C locale. +# These definitions help. +upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ +lower=abcdefghijklmnopqrstuvwxyz +digits=0123456789 +alpha=${upper}${lower} + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Avoid interferences from the environment. +gccflag= dashmflag= + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvisualcpp +fi + +if test "$depmode" = msvc7msys; then + # This is just like msvc7 but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvc7 +fi + +if test "$depmode" = xlc; then + # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. + gccflag=-qmakedep=gcc,-MF + depmode=gcc +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. +## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. +## (see the conditional assignment to $gccflag above). +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). Also, it might not be +## supported by the other compilers which use the 'gcc' depmode. +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The second -e expression handles DOS-style file names with drive + # letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the "deleted header file" problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. +## Some versions of gcc put a space before the ':'. On the theory +## that the space means something, we add a space to the output as +## well. hp depmode also adds that space, but also prefixes the VPATH +## to the object. Take care to not repeat it in the output. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like '#:fec' to the end of the + # dependency line. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ + | tr "$nl" ' ' >> "$depfile" + echo >> "$depfile" + # The second pass generates a dummy entry for each header file. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" + ;; + +xlc) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts '$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + aix_post_process_depfile + ;; + +tcc) + # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 + # FIXME: That version still under development at the moment of writing. + # Make that this statement remains true also for stable, released + # versions. + # It will wrap lines (doesn't matter whether long or short) with a + # trailing '\', as in: + # + # foo.o : \ + # foo.c \ + # foo.h \ + # + # It will put a trailing '\' even on the last line, and will use leading + # spaces rather than leading tabs (at least since its commit 0394caf7 + # "Emit spaces for -MD"). + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. + # We have to change lines of the first kind to '$object: \'. + sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" + # And for each line of the second kind, we have to emit a 'dep.h:' + # dummy dependency, to avoid the deleted-header problem. + sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" + rm -f "$tmpdepfile" + ;; + +## The order of this option in the case statement is important, since the +## shell code in configure will try each of these formats in the order +## listed in this file. A plain '-MD' option would be understood by many +## compilers, so we must ensure this comes after the gcc and icc options. +pgcc) + # Portland's C compiler understands '-MD'. + # Will always output deps to 'file.d' where file is the root name of the + # source file under compilation, even if file resides in a subdirectory. + # The object file name does not affect the name of the '.d' file. + # pgcc 10.2 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using '\' : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + set_dir_from "$object" + # Use the source, not the object, to determine the base name, since + # that's sadly what pgcc will do too. + set_base_from "$source" + tmpdepfile=$base.d + + # For projects that build the same source file twice into different object + # files, the pgcc approach of using the *source* file root name can cause + # problems in parallel builds. Use a locking strategy to avoid stomping on + # the same $tmpdepfile. + lockdir=$base.d-lock + trap " + echo '$0: caught signal, cleaning up...' >&2 + rmdir '$lockdir' + exit 1 + " 1 2 13 15 + numtries=100 + i=$numtries + while test $i -gt 0; do + # mkdir is a portable test-and-set. + if mkdir "$lockdir" 2>/dev/null; then + # This process acquired the lock. + "$@" -MD + stat=$? + # Release the lock. + rmdir "$lockdir" + break + else + # If the lock is being held by a different process, wait + # until the winning process is done or we timeout. + while test -d "$lockdir" && test $i -gt 0; do + sleep 1 + i=`expr $i - 1` + done + fi + i=`expr $i - 1` + done + trap - 1 2 13 15 + if test $i -le 0; then + echo "$0: failed to acquire lock after $numtries attempts" >&2 + echo "$0: check lockdir '$lockdir'" >&2 + exit 1 + fi + + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" + # Add 'dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in 'foo.d' instead, so we check for that too. + # Subdirectories are respected. + set_dir_from "$object" + set_base_from "$object" + + if test "$libtool" = yes; then + # Libtool generates 2 separate objects for the 2 libraries. These + # two compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir$base.o.d # libtool 1.5 + tmpdepfile2=$dir.libs/$base.o.d # Likewise. + tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + # Same post-processing that is required for AIX mode. + aix_post_process_depfile + ;; + +msvc7) + if test "$libtool" = yes; then + showIncludes=-Wc,-showIncludes + else + showIncludes=-showIncludes + fi + "$@" $showIncludes > "$tmpdepfile" + stat=$? + grep -v '^Note: including file: ' "$tmpdepfile" + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The first sed program below extracts the file names and escapes + # backslashes for cygpath. The second sed program outputs the file + # name when reading, but also accumulates all include files in the + # hold buffer in order to output them again at the end. This only + # works with sed implementations that can handle large buffers. + sed < "$tmpdepfile" -n ' +/^Note: including file: *\(.*\)/ { + s//\1/ + s/\\/\\\\/g + p +}' | $cygpath_u | sort -u | sed -n ' +s/ /\\ /g +s/\(.*\)/'"$tab"'\1 \\/p +s/.\(.*\) \\/\1:/ +H +$ { + s/.*/'"$tab"'/ + G + p +}' >> "$depfile" + echo >> "$depfile" # make sure the fragment doesn't end with a backslash + rm -f "$tmpdepfile" + ;; + +msvc7msys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for ':' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. + "$@" $dashmflag | + sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this sed invocation + # correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no eat=no + for arg + do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + if test $eat = yes; then + eat=no + continue + fi + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix=`echo "$object" | sed 's/^.*\././'` + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + # makedepend may prepend the VPATH from the source file name to the object. + # No need to regex-escape $object, excess matching of '.' is harmless. + sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process the last invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed '1,2d' "$tmpdepfile" \ + | tr ' ' "$nl" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E \ + | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + | sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + IFS=" " + for arg + do + case "$arg" in + -o) + shift + ;; + $object) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" + echo "$tab" >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/coinhsl/hsl_ma77/.deps/.dirstamp b/coinhsl/hsl_ma77/.deps/.dirstamp new file mode 100644 index 0000000..e69de29 diff --git a/coinhsl/hsl_ma77/.dirstamp b/coinhsl/hsl_ma77/.dirstamp new file mode 100644 index 0000000..e69de29 diff --git a/coinhsl/hsl_ma77/.libs/hsl_ma77d.o b/coinhsl/hsl_ma77/.libs/hsl_ma77d.o new file mode 100644 index 0000000000000000000000000000000000000000..3b572e0dd82b8a4370394389c2618c4720ad373d GIT binary patch literal 313088 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 UxbS*?>Q*Q57uBoWU*_xoA4Ppi1poj5 literal 0 HcmV?d00001 diff --git a/coinhsl/hsl_ma77/C/.deps/.dirstamp b/coinhsl/hsl_ma77/C/.deps/.dirstamp new file mode 100644 index 0000000..e69de29 diff --git a/coinhsl/hsl_ma77/C/.dirstamp b/coinhsl/hsl_ma77/C/.dirstamp new file mode 100644 index 0000000..e69de29 diff --git a/coinhsl/hsl_ma77/C/.libs/hsl_ma77d_ciface.o b/coinhsl/hsl_ma77/C/.libs/hsl_ma77d_ciface.o new file mode 100644 index 0000000000000000000000000000000000000000..1cb47b8c2a99f674fed8a79051ceffe609b3b3e8 GIT binary patch literal 37864 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 F|1V&?R5}0v literal 0 HcmV?d00001 diff --git a/coinhsl/hsl_ma77/C/hsl_ma77d.h b/coinhsl/hsl_ma77/C/hsl_ma77d.h new file mode 100644 index 0000000..df1880b --- /dev/null +++ b/coinhsl/hsl_ma77/C/hsl_ma77d.h @@ -0,0 +1,220 @@ +/* + * COPYRIGHT (c) 2011 Science and Technology Facilities Council (STFC) + * Original date 18 May 2011 + * All rights reserved + * + * Written by: Jonathan Hogg + * + * THIS FILE ONLY may be redistributed under the below modified BSD licence. + * All other files distributed as part of the HSL_MA77 package + * require a licence to be obtained from STFC and may NOT be redistributed + * without permission. Please refer to your licence for HSL_MA77 for full terms + * and conditions. STFC may be contacted via hsl(at)stfc.ac.uk. + * + * Modified BSD licence (this header file only): + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of STFC nor the names of its contributors may be used + * to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL STFC BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef HSL_MA77D_H +#define HSL_MA77D_H + +#ifndef ma77_default_control +#define ma77_control ma77_control_d +#define ma77_info ma77_info_d +#define ma77_default_control ma77_default_control_d +#define ma77_open_nelt ma77_open_nelt_d +#define ma77_open ma77_open_d +#define ma77_input_vars ma77_input_vars_d +#define ma77_input_reals ma77_input_reals_d +#define ma77_analyse ma77_analyse_d +#define ma77_factor ma77_factor_d +#define ma77_factor_solve ma77_factor_solve_d +#define ma77_solve ma77_solve_d +#define ma77_resid ma77_resid_d +#define ma77_scale ma77_scale_d +#define ma77_enquire_posdef ma77_enquire_posdef_d +#define ma77_enquire_indef ma77_enquire_indef_d +#define ma77_alter ma77_alter_d +#define ma77_restart ma77_restart_d +#define ma77_finalise ma77_finalise_d +#define ma77_solve_fredholm ma77_solve_fredholm_d +#define ma77_lmultiply ma77_lmultiply_d +#endif + +typedef double ma77pkgtype_d_; + +/* Data type for user controls */ +struct ma77_control_d { + /* Note: 0 is false, non-zero is true */ + + /* C/Fortran interface related controls */ + int f_arrays; /* Treat arrays as 1-based (Fortran) if true or 0-based (C) if + false. */ + + /* Printing controls */ + int print_level; + int unit_diagnostics; /* unit for diagnostic messages + Printing is suppressed if unit_diagnostics < 0. */ + int unit_error; /* unit for error messages + Printing is suppressed if unit_error < 0. */ + int unit_warning; /* unit for warning messages + Printing is suppressed if unit_warning < 0. */ + + /* Controls used by MA77_open */ + int bits; + int buffer_lpage[2]; + int buffer_npage[2]; + long int file_size; + long int maxstore; + long int storage[3]; + + /* Controls used by MA77_analyse */ + int nemin; /* Node amalgamation parameter. A child node is merged with its + parent if they both involve fewer than nemin eliminations.*/ + + /* Controls used by MA77_scale */ + int maxit; + int infnorm; + ma77pkgtype_d_ thresh; + + /* Controls used by MA77_factor with posdef true */ + int nb54; + + /* Controls used by MA77_factor with posdef false */ + int action; /* Keep going even if matrix is singular if true, or abort + if false */ + ma77pkgtype_d_ multiplier; + int nb64; + int nbi; + ma77pkgtype_d_ small; + ma77pkgtype_d_ static_; + long int storage_indef; + ma77pkgtype_d_ u; /* Pivot tolerance*/ + ma77pkgtype_d_ umin; /* Minimum pivot tolerance*/ + + /* Controls used by ma77_solve_fredholm */ + ma77pkgtype_d_ consist_tol; /* Tolerance for consistent singular system */ + + /* Pad data structure to allow for future growth */ + int ispare[5]; long int lspare[5]; ma77pkgtype_d_ rspare[5]; +}; + +/***************************************************/ + +/* data type for returning information to user.*/ +struct ma77_info_d { + ma77pkgtype_d_ detlog; + int detsign; + int flag; + int iostat; + int matrix_dup; + int matrix_rank; + int matrix_outrange; + int maxdepth; + int maxfront; + long int minstore; + int ndelay; + long int nfactor; + long int nflops; + int niter; + int nsup; + int num_neg; + int num_nothresh; + int num_perturbed; + int ntwo; + int stat; + int index[4]; + long int nio_read[2]; + long int nio_write[2]; + long int nwd_read[2]; + long int nwd_write[2]; + int num_file[4]; + long int storage[4]; + int tree_nodes; + int unit_restart; + int unused; + ma77pkgtype_d_ usmall; + + /* Pad data structure to allow for future growth */ + int ispare[5]; long int lspare[5]; ma77pkgtype_d_ rspare[5]; +}; + +/* Initialise control with default values */ +void ma77_default_control_d(struct ma77_control_d *control); +void ma77_open_nelt(const int n, const char* fname1, const char* fname2, + const char *fname3, const char *fname4, void **keep, + const struct ma77_control_d *control, struct ma77_info_d *info, + const int nelt); +void ma77_open_d(const int n, const char* fname1, const char* fname2, + const char *fname3, const char *fname4, void **keep, + const struct ma77_control_d *control, struct ma77_info_d *info); +void ma77_input_vars(const int idx, const int nvar, const int list[], + void **keep, const struct ma77_control_d *control, struct ma77_info_d *info); +void ma77_input_reals_d(const int idx, const int length, + const ma77pkgtype_d_ reals[], void **keep, const struct ma77_control_d *control, + struct ma77_info_d *info); +/* Analyse the sparsity pattern and prepare for factorization */ +void ma77_analyse(const int order[], void **keep, + const struct ma77_control_d *control, struct ma77_info_d *info); +/* To factorize the matrix */ +void ma77_factor_d(const int posdef, void **keep, + const struct ma77_control_d *control, struct ma77_info_d *info, + const ma77pkgtype_d_ *scale); +/* To factorize the matrix AND solve AX = B */ +void ma77_factor_solve_d(const int posdef, void **keep, + const struct ma77_control_d *control, struct ma77_info_d *info, + const ma77pkgtype_d_ *scale, const int nrhs, const int lx, + ma77pkgtype_d_ rhs[]); +/* To solve AX = B using the computed factors */ +void ma77_solve_d(const int job, const int nrhs, const int lx, ma77pkgtype_d_ x[], + void **keep, const struct ma77_control_d *control, struct ma77_info_d *info, + const ma77pkgtype_d_ *scale); +void ma77_resid_d(const int nrhs, const int lx, const ma77pkgtype_d_ x[], + const int lresid, ma77pkgtype_d_ resid[], void **keep, + const struct ma77_control_d *control, struct ma77_info_d *info, + ma77pkgtype_d_ *anorm_bnd); +void ma77_scale_d(ma77pkgtype_d_ scale[], void **keep, + const struct ma77_control_d *control, struct ma77_info_d *info, + ma77pkgtype_d_ *anorm); +void ma77_enquire_posdef_d(ma77pkgtype_d_ d[], void **keep, + const struct ma77_control_d *control, struct ma77_info_d *info); +void ma77_enquire_indef_d(int piv_order[], ma77pkgtype_d_ d[], void **keep, + const struct ma77_control_d *control, struct ma77_info_d *info); +void ma77_alter_d(const ma77pkgtype_d_ d[], void **keep, + const struct ma77_control_d *control, struct ma77_info_d *info); +void ma77_restart_d(const char *restart_file, const char *fname1, + const char *fname2, const char *fname3, const char *fname4, void **keep, + const struct ma77_control_d *control, struct ma77_info_d *info); +void ma77_solve_fredholm_d(int nrhs, int flag_out[], int lx, ma77pkgtype_d_ x[], + void **keep, const struct ma77_control_d *control, + struct ma77_info_d *info, const ma77pkgtype_d_ *scale); +void ma77_lmultiply_d(int trans, int k, int lx, ma77pkgtype_d_ x[], int ly, + ma77pkgtype_d_ y[], void **keep, const struct ma77_control_d *control, + struct ma77_info_d *info, const ma77pkgtype_d_ *scale); +/* To clean up memory in keep */ +void ma77_finalise_d(void **keep, const struct ma77_control_d *control, + struct ma77_info_d *info); + +#endif diff --git a/coinhsl/hsl_ma77/C/hsl_ma77d_ciface.f90 b/coinhsl/hsl_ma77/C/hsl_ma77d_ciface.f90 new file mode 100644 index 0000000..716adc3 --- /dev/null +++ b/coinhsl/hsl_ma77/C/hsl_ma77d_ciface.f90 @@ -0,0 +1,914 @@ +! +! COPYRIGHT (c) 2011 Science and Technology Facilities Council +! Original date 18 May 2011 +! +! Written by: Jonathan Hogg and Jennifer Scott +! + +module hsl_ma77_double_iface + use iso_c_binding + use hsl_ma77_double, only : & + f_ma77_keep => ma77_keep, & + f_ma77_control => ma77_control, & + f_ma77_info => ma77_info, & + f_ma77_open => ma77_open, & + f_ma77_input_vars => ma77_input_vars, & + f_ma77_input_reals => ma77_input_reals, & + f_ma77_analyse => ma77_analyse, & + f_ma77_factor => ma77_factor, & + f_ma77_factor_solve => ma77_factor_solve, & + f_ma77_solve => ma77_solve, & + f_ma77_resid => ma77_resid, & + f_ma77_scale => ma77_scale, & + f_ma77_enquire_posdef=> ma77_enquire_posdef, & + f_ma77_enquire_indef => ma77_enquire_indef, & + f_ma77_alter => ma77_alter, & + f_ma77_restart => ma77_restart, & + f_ma77_finalise => ma77_finalise, & + f_ma77_solve_fredholm=> ma77_solve_fredholm, & + f_ma77_lmultiply => ma77_lmultiply + implicit none + + ! Data type for user controls + type, bind(C) :: ma77_control + ! C/Fortran interface related controls + integer(C_INT) :: f_arrays ! 0 is false, otherwise is true + + ! Printing controls + integer(C_INT) :: print_level + integer(C_INT) :: unit_diagnostics + integer(C_INT) :: unit_error + integer(C_INT) :: unit_warning + + ! Controls used by MA77_open + integer(C_INT) :: bits + integer(C_INT) :: buffer_lpage(2) + integer(C_INT) :: buffer_npage(2) + integer(C_LONG) :: file_size + integer(C_LONG) :: maxstore + integer(C_LONG) :: storage(3) + + ! Controls used by MA77_analyse + integer(C_INT) :: nemin + + ! Controls used by MA77_scale + integer(C_INT) :: maxit + integer(C_INT) :: infnorm + real(C_DOUBLE) :: thresh + + ! Controls used by MA77_factor with posdef true + integer(C_INT) :: nb54 + + ! Controls used by MA77_factor with posdef false + integer(C_INT) :: action ! 0 is false, otherwise is true + real(C_DOUBLE) :: multiplier + integer(C_INT) :: nb64 + integer(C_INT) :: nbi + real(C_DOUBLE) :: small + real(C_DOUBLE) :: static + integer(C_LONG) :: storage_indef + real(C_DOUBLE) :: u + real(C_DOUBLE) :: umin + + ! Controls used by ma77_solve_fredholm + real(C_DOUBLE) :: consist_tol + + ! Padding for future growth + integer(C_INT) :: ispare(5) + integer(C_LONG) :: lspare(5) + real(C_DOUBLE) :: rspare(5) + end type ma77_control + + !************************************************* + + ! data type for returning information to user. + type, bind(C) :: ma77_info + real(C_DOUBLE) :: detlog + integer(C_INT) :: detsign + integer(C_INT) :: flag + integer(C_INT) :: iostat + integer(C_INT) :: matrix_dup + integer(C_INT) :: matrix_rank + integer(C_INT) :: matrix_outrange + integer(C_INT) :: maxdepth + integer(C_INT) :: maxfront + integer(C_LONG) :: minstore + integer(C_INT) :: ndelay + integer(C_LONG) :: nfactor + integer(C_LONG) :: nflops + integer(C_INT) :: niter + integer(C_INT) :: nsup + integer(C_INT) :: num_neg + integer(C_INT) :: num_nothresh + integer(C_INT) :: num_perturbed + integer(C_INT) :: ntwo + integer(C_INT) :: stat + integer(C_INT) :: index(4) + integer(C_LONG) :: nio_read(2) + integer(C_LONG) :: nio_write(2) + integer(C_LONG) :: nwd_read(2) + integer(C_LONG) :: nwd_write(2) + integer(C_INT) :: num_file(4) + integer(C_LONG) :: storage(4) + integer(C_INT) :: tree_nodes + integer(C_INT) :: unit_restart + integer(C_INT) :: unused + real(C_DOUBLE) :: usmall + + ! Padding for future growth + integer(C_INT) :: ispare(5) + integer(C_LONG) :: lspare(5) + real(C_DOUBLE) :: rspare(5) + end type ma77_info + + interface + integer(C_INT) pure function strlen(cstr) bind(C) + use iso_c_binding + implicit none + type(C_PTR), value, intent(in) :: cstr + end function strlen + end interface +contains + function cstr_to_fchar(cstr) result(fchar) + type(C_PTR) :: cstr + character(kind=C_CHAR,len=strlen(cstr)) :: fchar + + integer :: i + character(C_CHAR), dimension(:), pointer :: temp + + call C_F_POINTER(cstr, temp, shape = (/ strlen(cstr) /) ) + + do i = 1, size(temp) + fchar(i:i) = temp(i) + end do + end function cstr_to_fchar + + subroutine copy_control_in(ccontrol, fcontrol, f_arrays) + type(ma77_control), intent(in) :: ccontrol + type(f_ma77_control), intent(out) :: fcontrol + logical, intent(out) :: f_arrays + + f_arrays = (ccontrol%f_arrays .ne. 0) + fcontrol%action = (ccontrol%action .ne. 0) + fcontrol%bits = ccontrol%bits + fcontrol%buffer_lpage(1:2) = ccontrol%buffer_lpage(1:2) + fcontrol%buffer_npage(1:2) = ccontrol%buffer_npage(1:2) + fcontrol%consist_tol = ccontrol%consist_tol + fcontrol%file_size = ccontrol%file_size + fcontrol%infnorm = ccontrol%infnorm + fcontrol%maxit = ccontrol%maxit + fcontrol%maxstore = ccontrol%maxstore + fcontrol%multiplier = ccontrol%multiplier + fcontrol%nb54 = ccontrol%nb54 + fcontrol%nb64 = ccontrol%nb64 + fcontrol%nbi = ccontrol%nbi + fcontrol%nemin = ccontrol%nemin + fcontrol%print_level = ccontrol%print_level + fcontrol%small = ccontrol%small + fcontrol%static = ccontrol%static + fcontrol%storage(1:3) = ccontrol%storage(1:3) + fcontrol%storage_indef = ccontrol%storage_indef + fcontrol%thresh = ccontrol%thresh + fcontrol%unit_diagnostics = ccontrol%unit_diagnostics + fcontrol%unit_error = ccontrol%unit_error + fcontrol%unit_warning = ccontrol%unit_warning + fcontrol%u = ccontrol%u + fcontrol%umin = ccontrol%umin + end subroutine copy_control_in + + subroutine copy_info_out(finfo, cinfo) + type(f_ma77_info), intent(in) :: finfo + type(ma77_info), intent(out) :: cinfo + + cinfo%detlog = finfo%detlog + cinfo%detsign = finfo%detsign + cinfo%flag = finfo%flag + cinfo%iostat = finfo%iostat + cinfo%matrix_dup = finfo%matrix_dup + cinfo%matrix_rank = finfo%matrix_rank + cinfo%matrix_outrange= finfo%matrix_outrange + cinfo%maxdepth = finfo%maxdepth + cinfo%maxfront = finfo%maxfront + cinfo%minstore = finfo%minstore + cinfo%ndelay = finfo%ndelay + cinfo%nfactor = finfo%nfactor + cinfo%nflops = finfo%nflops + cinfo%niter = finfo%niter + cinfo%nsup = finfo%nsup + cinfo%num_neg = finfo%num_neg + cinfo%num_nothresh = finfo%num_nothresh + cinfo%num_perturbed = finfo%num_perturbed + cinfo%ntwo = finfo%ntwo + cinfo%stat = finfo%stat + cinfo%index(1:4) = finfo%index(1:4) + cinfo%nio_read(1:2) = finfo%nio_read(1:2) + cinfo%nio_write(1:2) = finfo%nio_write(1:2) + cinfo%nwd_read(1:2) = finfo%nwd_read(1:2) + cinfo%nwd_write(1:2) = finfo%nwd_write(1:2) + cinfo%num_file(1:4) = finfo%num_file(1:4) + cinfo%storage(1:4) = finfo%storage(1:4) + cinfo%tree_nodes = finfo%tree_nodes + cinfo%unit_restart = finfo%unit_restart + cinfo%unused = finfo%unused + cinfo%usmall = finfo%u + end subroutine copy_info_out + + subroutine ma77_open_main(n, cfname1, cfname2, cfname3, cfname4, ckeep, & + ccontrol, cinfo, nelt) + + integer(C_INT), intent(in) :: n + type(C_PTR), intent(in) :: cfname1 + type(C_PTR), intent(in) :: cfname2 + type(C_PTR), intent(in) :: cfname3 + type(C_PTR), intent(in) :: cfname4 + type(C_PTR), intent(out) :: ckeep + type(ma77_control), intent(in) :: ccontrol + type(ma77_info), intent(inout) :: cinfo + integer(C_INT), optional, intent(in) :: nelt + + type(f_ma77_keep), pointer :: fkeep + type(f_ma77_control) :: fcontrol + type(f_ma77_info) :: finfo + character( kind=C_CHAR, len = max( & + strlen(cfname1),strlen(cfname2),strlen(cfname3),strlen(cfname4) ) & + ), dimension(4) :: fname + logical :: f_arrays + + ! Copy data in and associate pointers correctly + call copy_control_in(ccontrol, fcontrol, f_arrays) + fname(1) = cstr_to_fchar(cfname1) + fname(2) = cstr_to_fchar(cfname2) + fname(3) = cstr_to_fchar(cfname3) + fname(4) = cstr_to_fchar(cfname4) + + ! Allocate space to store keep and arrange a C pointer to it + allocate(fkeep) + ckeep = c_loc(fkeep) + + ! Call the Fortran routine + call f_ma77_open(n, fname, fkeep, fcontrol, finfo, nelt=nelt) + + ! Copy information out to C structure + call copy_info_out(finfo, cinfo) + + end subroutine ma77_open_main + +end module + +subroutine ma77_default_control_d(ccontrol) bind(C) + use hsl_ma77_double_iface + implicit none + + type(ma77_control), intent(out) :: ccontrol + + type(f_ma77_control) :: fdefault + + ccontrol%f_arrays = 0 ! false + if( fdefault%action ) then + ccontrol%action = 1 ! true + else + ccontrol%action = 0 ! false + endif + ccontrol%bits = fdefault%bits + ccontrol%buffer_lpage(:) = fdefault%buffer_lpage(:) + ccontrol%buffer_npage(:) = fdefault%buffer_npage(:) + ccontrol%file_size = fdefault%file_size + ccontrol%infnorm = fdefault%infnorm + ccontrol%maxit = fdefault%maxit + ccontrol%maxstore = fdefault%maxstore + ccontrol%multiplier = fdefault%multiplier + ccontrol%nb54 = fdefault%nb54 + ccontrol%nb64 = fdefault%nb64 + ccontrol%nbi = fdefault%nbi + ccontrol%nemin = fdefault%nemin + ccontrol%print_level = fdefault%print_level + ccontrol%small = fdefault%small + ccontrol%static = fdefault%static + ccontrol%storage(:) = fdefault%storage(:) + ccontrol%storage_indef = fdefault%storage_indef + ccontrol%thresh = fdefault%thresh + ccontrol%unit_diagnostics = fdefault%unit_diagnostics + ccontrol%unit_error = fdefault%unit_error + ccontrol%unit_warning = fdefault%unit_warning + ccontrol%u = fdefault%u + ccontrol%umin = fdefault%umin +end subroutine ma77_default_control_d + +subroutine ma77_open_d(n, cfname1, cfname2, cfname3, cfname4, ckeep, & + ccontrol, cinfo) bind(c) + use hsl_ma77_double_iface + implicit none + + integer(C_INT), value, intent(in) :: n + type(C_PTR), value, intent(in) :: cfname1 + type(C_PTR), value, intent(in) :: cfname2 + type(C_PTR), value, intent(in) :: cfname3 + type(C_PTR), value, intent(in) :: cfname4 + type(C_PTR), intent(out) :: ckeep + type(ma77_control), intent(in) :: ccontrol + type(ma77_info), intent(inout) :: cinfo + + call ma77_open_main(n, cfname1, cfname2, cfname3, cfname4, ckeep, & + ccontrol, cinfo) +end subroutine ma77_open_d + +subroutine ma77_open_nelt_d(n, cfname1, cfname2, cfname3, cfname4, ckeep, & + ccontrol, cinfo, nelt) bind(c) + use hsl_ma77_double_iface + implicit none + + integer(C_INT), value, intent(in) :: n + type(C_PTR), value, intent(in) :: cfname1 + type(C_PTR), value, intent(in) :: cfname2 + type(C_PTR), value, intent(in) :: cfname3 + type(C_PTR), value, intent(in) :: cfname4 + type(C_PTR), intent(out) :: ckeep + type(ma77_control), intent(in) :: ccontrol + type(ma77_info), intent(inout) :: cinfo + integer(C_INT), value, intent(in) :: nelt + + call ma77_open_main(n, cfname1, cfname2, cfname3, cfname4, ckeep, & + ccontrol, cinfo, nelt=nelt) +end subroutine ma77_open_nelt_d + +subroutine ma77_input_vars_d(cindex, nvar, clist, ckeep, ccontrol, cinfo) & + bind(C) + use hsl_ma77_double_iface + implicit none + + integer(C_INT), value, intent(in) :: cindex + integer(C_INT), value, intent(in) :: nvar + type(C_PTR), value, intent(in) :: clist + type(C_PTR), intent(inout) :: ckeep + type(ma77_control), intent(in) :: ccontrol + type(ma77_info), intent(inout) :: cinfo + + integer :: findex + type(f_ma77_keep), pointer :: fkeep + integer(C_INT), dimension(:), pointer :: flist + integer, dimension(:), allocatable, target :: flist_alloc + type(f_ma77_info) :: finfo + type(f_ma77_control) :: fcontrol + logical :: f_arrays + + ! Copy data in and associate pointers correctly + call copy_control_in(ccontrol, fcontrol, f_arrays) + findex = cindex + if(.not.f_arrays) findex = findex+1 + call C_F_POINTER(ckeep, fkeep) + call C_F_POINTER(clist, flist, shape = (/ nvar /) ) + if(.not.f_arrays) then + allocate(flist_alloc(nvar)) + flist_alloc(:) = flist(:) + 1 + flist => flist_alloc + endif + + ! Call the Fortran routine + call f_ma77_input_vars(findex, nvar, flist, fkeep, fcontrol, finfo) + + ! Copy information out to C structure + call copy_info_out(finfo, cinfo) +end subroutine ma77_input_vars_d + +subroutine ma77_input_reals_d(cindex, length, creals, ckeep, ccontrol, cinfo) & + bind(C) + use hsl_ma77_double_iface + implicit none + + integer(C_INT), value, intent(in) :: cindex + integer(C_INT), value, intent(in) :: length + type(C_PTR), value, intent(in) :: creals + type(C_PTR), intent(inout) :: ckeep + type(ma77_control), intent(in) :: ccontrol + type(ma77_info), intent(inout) :: cinfo + + integer :: findex + type(f_ma77_keep), pointer :: fkeep + real(C_DOUBLE), dimension(:), pointer :: freals + type(f_ma77_info) :: finfo + type(f_ma77_control) :: fcontrol + logical :: f_arrays + + ! Copy data in and associate pointers correctly + call copy_control_in(ccontrol, fcontrol, f_arrays) + findex = cindex + if(.not.f_arrays) findex = findex+1 + call C_F_POINTER(ckeep, fkeep) + call C_F_POINTER(creals, freals, shape = (/ length /) ) + + ! Call the Fortran routine + call f_ma77_input_reals(findex, length, freals, fkeep, fcontrol, finfo) + + ! Copy information out to C structure + call copy_info_out(finfo, cinfo) +end subroutine ma77_input_reals_d + +subroutine ma77_analyse_d(corder, ckeep, ccontrol, cinfo) bind(C) + use hsl_ma77_double_iface + implicit none + + type(C_PTR), value, intent(in) :: corder + type(C_PTR), intent(inout) :: ckeep + type(ma77_control), intent(in) :: ccontrol + type(ma77_info), intent(inout) :: cinfo + + type(f_ma77_keep), pointer :: fkeep + integer(C_INT), dimension(:), pointer :: forder + integer, dimension(:), allocatable, target :: forder_alloc + type(f_ma77_info) :: finfo + type(f_ma77_control) :: fcontrol + logical :: f_arrays + + ! Copy data in and associate pointers correctly + call copy_control_in(ccontrol, fcontrol, f_arrays) + call C_F_POINTER(ckeep, fkeep) + call C_F_POINTER(corder, forder, shape = (/ fkeep%n /) ) + if(.not.f_arrays) then + allocate(forder_alloc(fkeep%n)) + forder_alloc(:) = forder(:) + 1 + forder => forder_alloc + endif + + ! Call the Fortran routine + call f_ma77_analyse(forder, fkeep, fcontrol, finfo) + + ! Copy information out to C structure + call copy_info_out(finfo, cinfo) +end subroutine ma77_analyse_d + +subroutine ma77_factor_d(cposdef, ckeep, ccontrol, cinfo, cscale) bind(C) + use hsl_ma77_double_iface + implicit none + + integer(C_INT), value, intent(in) :: cposdef + type(C_PTR), intent(inout) :: ckeep + type(ma77_control), intent(in) :: ccontrol + type(ma77_info), intent(inout) :: cinfo + type(C_PTR), value, intent(in) :: cscale + + logical :: fposdef + type(f_ma77_keep), pointer :: fkeep + type(f_ma77_info) :: finfo + type(f_ma77_control) :: fcontrol + logical :: f_arrays + real(C_DOUBLE), dimension(:), pointer :: fscale + + ! Copy data in and associate pointers correctly + call copy_control_in(ccontrol, fcontrol, f_arrays) + call C_F_POINTER(ckeep, fkeep) + fposdef = (cposdef.ne.0) + if(C_ASSOCIATED(cscale)) then + call C_F_POINTER(cscale, fscale, shape = (/ fkeep%n /) ) + else + nullify(fscale) + endif + + ! Call the Fortran routine + if(associated(fscale)) then + call f_ma77_factor(fposdef, fkeep, fcontrol, finfo, scale=fscale) + else + call f_ma77_factor(fposdef, fkeep, fcontrol, finfo) + endif + + ! Copy information out to C structure + call copy_info_out(finfo, cinfo) +end subroutine ma77_factor_d + +subroutine ma77_factor_solve_d(cposdef, ckeep, ccontrol, cinfo, cscale, & + nrhs, lx, cx) bind(C) + use hsl_ma77_double_iface + implicit none + + integer(C_INT), value, intent(in) :: cposdef + type(C_PTR), intent(inout) :: ckeep + type(ma77_control), intent(in) :: ccontrol + type(ma77_info), intent(inout) :: cinfo + type(C_PTR), value, intent(in) :: cscale + integer(C_INT), value, intent(in) :: nrhs + integer(C_INT), value, intent(in) :: lx + type(C_PTR), value :: cx + + logical :: fposdef + real(C_DOUBLE), dimension(:,:), pointer :: fx + type(f_ma77_keep), pointer :: fkeep + type(f_ma77_info) :: finfo + type(f_ma77_control) :: fcontrol + logical :: f_arrays + real(C_DOUBLE), dimension(:), pointer :: fscale + + ! Copy data in and associate pointers correctly + call copy_control_in(ccontrol, fcontrol, f_arrays) + call C_F_POINTER(ckeep, fkeep) + fposdef = (cposdef.ne.0) + call C_F_POINTER(cx, fx, shape = (/ lx, nrhs /) ) + if(C_ASSOCIATED(cscale)) then + call C_F_POINTER(cscale, fscale, shape = (/ fkeep%n /) ) + else + nullify(fscale) + endif + + ! Call the Fortran routine + if(associated(fscale)) then + call f_ma77_factor_solve(fposdef, fkeep, fcontrol, finfo, nrhs, lx, fx, & + scale=fscale) + else + call f_ma77_factor_solve(fposdef, fkeep, fcontrol, finfo, nrhs, lx, fx) + endif + + ! Copy information out to C structure + call copy_info_out(finfo, cinfo) +end subroutine ma77_factor_solve_d + +subroutine ma77_solve_d(job, nrhs, lx, cx, ckeep, ccontrol, cinfo, cscale) & + bind(C) + use hsl_ma77_double_iface + implicit none + + integer(C_INT), value, intent(in) :: job + integer(C_INT), value, intent(in) :: nrhs + integer(C_INT), value, intent(in) :: lx + type(C_PTR), value :: cx + type(C_PTR), intent(inout) :: ckeep + type(ma77_control), intent(in) :: ccontrol + type(ma77_info), intent(inout) :: cinfo + type(C_PTR), value, intent(in) :: cscale + + real(C_DOUBLE), dimension(:,:), pointer :: fx + type(f_ma77_keep), pointer :: fkeep + type(f_ma77_info) :: finfo + type(f_ma77_control) :: fcontrol + logical :: f_arrays + real(C_DOUBLE), dimension(:), pointer :: fscale + + ! Copy data in and associate pointers correctly + call copy_control_in(ccontrol, fcontrol, f_arrays) + call C_F_POINTER(ckeep, fkeep) + call C_F_POINTER(cx, fx, shape = (/ lx, nrhs /) ) + if(C_ASSOCIATED(cscale)) then + call C_F_POINTER(cscale, fscale, shape = (/ fkeep%n /) ) + else + nullify(fscale) + endif + + ! Copy data in and associate pointers correctly + if(job.eq.0) then + if(associated(fscale)) then + call f_ma77_solve(nrhs, lx, fx, fkeep, fcontrol, finfo, scale=fscale) + else + call f_ma77_solve(nrhs, lx, fx, fkeep, fcontrol, finfo) + endif + else + if(associated(fscale)) then + call f_ma77_solve(nrhs, lx, fx, fkeep, fcontrol, finfo, scale=fscale, & + job=job) + else + call f_ma77_solve(nrhs, lx, fx, fkeep, fcontrol, finfo, job=job) + endif + endif + + ! Call the Fortran routine + call copy_info_out(finfo, cinfo) +end subroutine ma77_solve_d + +subroutine ma77_resid_d(nrhs, lx, cx, lresid, cresid, ckeep, ccontrol, cinfo, & + canorm_bnd) bind(C) + use hsl_ma77_double_iface + implicit none + + integer(C_INT), value, intent(in) :: nrhs + integer(C_INT), value, intent(in) :: lx + type(C_PTR), value, intent(in) :: cx + integer(C_INT), value, intent(in) :: lresid + type(C_PTR), value :: cresid + type(C_PTR), intent(inout) :: ckeep + type(ma77_control), intent(in) :: ccontrol + type(ma77_info), intent(inout) :: cinfo + type(C_PTR), value, intent(in) :: canorm_bnd ! optional + + real(C_DOUBLE), dimension(:,:), pointer :: fx, fresid + type(f_ma77_keep), pointer :: fkeep + type(f_ma77_info) :: finfo + type(f_ma77_control) :: fcontrol + real(C_DOUBLE), pointer :: fanorm_bnd + logical :: f_arrays + + ! Copy data in and associate pointers correctly + call copy_control_in(ccontrol, fcontrol, f_arrays) + call C_F_POINTER(ckeep, fkeep) + call C_F_POINTER(cx, fx, shape = (/ lx, nrhs /) ) + call C_F_POINTER(cresid, fresid, shape = (/ lresid, nrhs /) ) + if(C_ASSOCIATED(canorm_bnd)) then + call C_F_POINTER(canorm_bnd, fanorm_bnd) + else + nullify(fanorm_bnd) + endif + + ! Call the Fortran routine + if(associated(fanorm_bnd) ) then + call f_ma77_resid(nrhs, lx, fx, lresid, fresid, fkeep, fcontrol, & + finfo, anorm_bnd=fanorm_bnd) + else + call f_ma77_resid(nrhs, lx, fx, lresid, fresid, fkeep, fcontrol, & + finfo) + endif + + ! Copy information out to C structure + call copy_info_out(finfo, cinfo) +end subroutine ma77_resid_d + +subroutine ma77_scale_d(cscale, ckeep, ccontrol, cinfo, canorm) bind(C) + use hsl_ma77_double_iface + implicit none + + type(C_PTR), value, intent(in) :: cscale + type(C_PTR), intent(inout) :: ckeep + type(ma77_control), intent(in) :: ccontrol + type(ma77_info), intent(inout) :: cinfo + type(C_PTR), value, intent(in) :: canorm ! optional + + real(C_DOUBLE), dimension(:), pointer :: fscale + type(f_ma77_keep), pointer :: fkeep + type(f_ma77_info) :: finfo + type(f_ma77_control) :: fcontrol + real(C_DOUBLE), pointer :: fanorm + logical :: f_arrays + + ! Copy data in and associate pointers correctly + call copy_control_in(ccontrol, fcontrol, f_arrays) + call C_F_POINTER(ckeep, fkeep) + call C_F_POINTER(cscale, fscale, shape = (/ fkeep%n /) ) + if(C_ASSOCIATED(canorm)) then + call C_F_POINTER(canorm, fanorm) + else + nullify(fanorm) + endif + + ! Copy data in and associate pointers correctly + if(associated(fanorm) ) then + call f_ma77_scale(fscale, fkeep, fcontrol, finfo, anorm=fanorm) + else + call f_ma77_scale(fscale, fkeep, fcontrol, finfo) + endif + + ! Call the Fortran routine + call copy_info_out(finfo, cinfo) +end subroutine ma77_scale_d + +subroutine ma77_enquire_posdef_d(cd, ckeep, ccontrol, cinfo) bind(C) + use hsl_ma77_double_iface + implicit none + + type(C_PTR), value, intent(in) :: cd + type(C_PTR), intent(inout) :: ckeep + type(ma77_control), intent(in) :: ccontrol + type(ma77_info), intent(inout) :: cinfo + + real(C_DOUBLE), dimension(:), pointer :: fd + type(f_ma77_keep), pointer :: fkeep + type(f_ma77_info) :: finfo + type(f_ma77_control) :: fcontrol + logical :: f_arrays + + ! Copy data in and associate pointers correctly + call copy_control_in(ccontrol, fcontrol, f_arrays) + call C_F_POINTER(ckeep, fkeep) + call C_F_POINTER(cd, fd, shape = (/ fkeep%n /) ) + + ! Copy data in and associate pointers correctly + call f_ma77_enquire_posdef(fd, fkeep, fcontrol, finfo) + + ! Call the Fortran routine + call copy_info_out(finfo, cinfo) +end subroutine ma77_enquire_posdef_d + +subroutine ma77_enquire_indef_d(cpiv_order, cd, ckeep, ccontrol, cinfo) bind(C) + use hsl_ma77_double_iface + implicit none + + type(C_PTR), value, intent(in) :: cpiv_order + type(C_PTR), value, intent(in) :: cd + type(C_PTR), intent(inout) :: ckeep + type(ma77_control), intent(in) :: ccontrol + type(ma77_info), intent(inout) :: cinfo + + integer(C_INT), dimension(:), pointer :: fpiv_order + real(C_DOUBLE), dimension(:,:), pointer :: fd + type(f_ma77_keep), pointer :: fkeep + type(f_ma77_info) :: finfo + type(f_ma77_control) :: fcontrol + logical :: f_arrays + + ! Copy data in and associate pointers correctly + call copy_control_in(ccontrol, fcontrol, f_arrays) + call C_F_POINTER(ckeep, fkeep) + call C_F_POINTER(cpiv_order, fpiv_order, shape = (/ fkeep%n /) ) + call C_F_POINTER(cd, fd, shape = (/ 2, fkeep%n /) ) + + ! Call the Fortran routine + call f_ma77_enquire_indef(fpiv_order, fd, fkeep, fcontrol, finfo) + + ! Copy information out to C structure + call copy_info_out(finfo, cinfo) + + ! Correct piv_order if using C indexing + if(.not.f_arrays) then + fpiv_order(:) = fpiv_order(:) - 1 + endif +end subroutine ma77_enquire_indef_d + +subroutine ma77_alter_d(cd, ckeep, ccontrol, cinfo) bind(C) + use hsl_ma77_double_iface + implicit none + + type(C_PTR), intent(inout) :: ckeep + type(C_PTR), value, intent(in) :: cd + type(ma77_control), intent(in) :: ccontrol + type(ma77_info), intent(inout) :: cinfo + + real(C_DOUBLE), dimension(:,:), pointer :: fd + type(f_ma77_keep), pointer :: fkeep + type(f_ma77_control) :: fcontrol + type(f_ma77_info) :: finfo + logical :: f_arrays + + ! Copy data in and associate pointers correctly + call copy_control_in(ccontrol, fcontrol, f_arrays) + call C_F_POINTER(ckeep, fkeep) + call C_F_POINTER(cd, fd, shape = (/ 2, fkeep%n /) ) + + ! Copy data in and associate pointers correctly + call f_ma77_alter(fd, fkeep, fcontrol, finfo) + + ! Call the Fortran routine + call copy_info_out(finfo, cinfo) +end subroutine ma77_alter_d + +subroutine ma77_restart_d(crestart_file, cfname1, cfname2, cfname3, cfname4, & + ckeep, ccontrol, cinfo) bind(c) + use hsl_ma77_double_iface + implicit none + + type(C_PTR), intent(in) :: crestart_file + type(C_PTR), intent(in) :: cfname1 + type(C_PTR), intent(in) :: cfname2 + type(C_PTR), intent(in) :: cfname3 + type(C_PTR), intent(in) :: cfname4 + type(C_PTR), intent(out) :: ckeep + type(ma77_control), intent(in) :: ccontrol + type(ma77_info), intent(inout) :: cinfo + + type(f_ma77_keep), pointer :: fkeep + type(f_ma77_control) :: fcontrol + type(f_ma77_info) :: finfo + character( kind=C_CHAR, len = strlen(crestart_file) ) :: frestart_file + character( kind=C_CHAR, len = max( & + strlen(cfname1),strlen(cfname2),strlen(cfname3),strlen(cfname4) ) & + ), dimension(4) :: fname + logical :: f_arrays + + ! Copy data in and associate pointers correctly + call copy_control_in(ccontrol, fcontrol, f_arrays) + call C_F_POINTER(ckeep, fkeep) + frestart_file = cstr_to_fchar(crestart_file) + fname(1) = cstr_to_fchar(cfname1) + fname(2) = cstr_to_fchar(cfname2) + fname(3) = cstr_to_fchar(cfname3) + fname(4) = cstr_to_fchar(cfname4) + + ! Copy data in and associate pointers correctly + call f_ma77_restart(frestart_file, fname, fkeep, fcontrol, finfo) + + ! Call the Fortran routine + call copy_info_out(finfo, cinfo) +end subroutine ma77_restart_d + +subroutine ma77_finalise_d(ckeep, ccontrol, cinfo) bind(C) + use hsl_ma77_double_iface + implicit none + + type(C_PTR), intent(inout) :: ckeep + type(ma77_control), intent(in) :: ccontrol + type(ma77_info), intent(inout) :: cinfo + + type(f_ma77_keep), pointer :: fkeep + type(f_ma77_info) :: finfo + type(f_ma77_control) :: fcontrol + logical :: f_arrays + + ! Copy data in and associate pointers correctly + call copy_control_in(ccontrol, fcontrol, f_arrays) + call C_F_POINTER(ckeep, fkeep) + + ! Call the Fortran routine + call f_ma77_finalise(fkeep, fcontrol, finfo) + + ! Free memory + deallocate(fkeep) + ckeep = C_NULL_PTR + + ! Copy information out to C structure + call copy_info_out(finfo, cinfo) +end subroutine ma77_finalise_d + +subroutine ma77_solve_fredholm_d(nrhs, cflag_out, lx, cx, ckeep, ccontrol, & + cinfo, cscale) bind(C) + use hsl_ma77_double_iface + implicit none + + integer(C_INT), value, intent(in) :: nrhs + type(C_PTR), value :: cflag_out + integer(C_INT), value, intent(in) :: lx + type(C_PTR), value :: cx + type(C_PTR), intent(inout) :: ckeep + type(ma77_control), intent(in) :: ccontrol + type(ma77_info), intent(inout) :: cinfo + type(C_PTR), value, intent(in) :: cscale + + integer(C_INT), dimension(:), pointer :: fiflag_out + logical, dimension(:), allocatable :: fflag_out + real(C_DOUBLE), dimension(:,:), pointer :: fx + type(f_ma77_keep), pointer :: fkeep + type(f_ma77_info) :: finfo + type(f_ma77_control) :: fcontrol + logical :: f_arrays + real(C_DOUBLE), dimension(:), pointer :: fscale + + ! Copy data in and associate pointers correctly + call copy_control_in(ccontrol, fcontrol, f_arrays) + call C_F_POINTER(cflag_out, fiflag_out, shape = (/ nrhs /) ) + allocate(fflag_out(nrhs)) + call C_F_POINTER(ckeep, fkeep) + call C_F_POINTER(cx, fx, shape = (/ lx, 2*nrhs /) ) + if(C_ASSOCIATED(cscale)) then + call C_F_POINTER(cscale, fscale, shape = (/ fkeep%n /) ) + else + nullify(fscale) + endif + + ! Call the Fortran routine + if(associated(fscale)) then + call f_ma77_solve_fredholm(nrhs, fflag_out, lx, fx, fkeep, fcontrol, & + finfo, scale=fscale) + else + call f_ma77_solve_fredholm(nrhs, fflag_out, lx, fx, fkeep, fcontrol, & + finfo) + endif + + ! Copy data out + call copy_info_out(finfo, cinfo) + where(fflag_out(:)) + fiflag_out(:) = 1 ! True + elsewhere + fiflag_out(:) = 0 ! False + endwhere +end subroutine ma77_solve_fredholm_d + +subroutine ma77_lmultiply_d(ctrans, k, lx, cx, ly, cy, ckeep, ccontrol, cinfo, & + cscale) bind(C) + use hsl_ma77_double_iface + implicit none + + integer(C_INT), value :: ctrans + integer(C_INT), value :: k + integer(C_INT), value, intent(in) :: lx + type(C_PTR), value :: cx + integer(C_INT), value, intent(in) :: ly + type(C_PTR), value :: cy + type(C_PTR), intent(inout) :: ckeep + type(ma77_control), intent(in) :: ccontrol + type(ma77_info), intent(inout) :: cinfo + type(C_PTR), value, intent(in) :: cscale + + logical :: ftrans + real(C_DOUBLE), dimension(:,:), pointer :: fx + real(C_DOUBLE), dimension(:,:), pointer :: fy + type(f_ma77_keep), pointer :: fkeep + type(f_ma77_info) :: finfo + type(f_ma77_control) :: fcontrol + logical :: f_arrays + real(C_DOUBLE), dimension(:), pointer :: fscale + + ! Copy data in and associate pointers correctly + call copy_control_in(ccontrol, fcontrol, f_arrays) + ftrans = (ctrans.ne.0) + call C_F_POINTER(ckeep, fkeep) + call C_F_POINTER(cx, fx, shape = (/ lx, k /) ) + call C_F_POINTER(cy, fy, shape = (/ ly, k /) ) + if(C_ASSOCIATED(cscale)) then + call C_F_POINTER(cscale, fscale, shape = (/ fkeep%n /) ) + else + nullify(fscale) + endif + + ! Call the Fortran routine + if(associated(fscale)) then + call f_ma77_lmultiply(ftrans, k, lx, fx, ly, fy, fkeep, fcontrol, & + finfo, scale=fscale) + else + call f_ma77_lmultiply(ftrans, k, lx, fx, ly, fy, fkeep, fcontrol, & + finfo) + endif + + ! Copy data out + call copy_info_out(finfo, cinfo) +end subroutine ma77_lmultiply_d diff --git a/coinhsl/hsl_ma77/C/hsl_ma77d_ciface.lo b/coinhsl/hsl_ma77/C/hsl_ma77d_ciface.lo new file mode 100644 index 0000000..92bba59 --- /dev/null +++ b/coinhsl/hsl_ma77/C/hsl_ma77d_ciface.lo @@ -0,0 +1,12 @@ +# coinhsl/hsl_ma77/C/hsl_ma77d_ciface.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4.6 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/hsl_ma77d_ciface.o' + +# Name of the non-PIC object +non_pic_object=none + diff --git a/coinhsl/hsl_ma77/hsl_ma77d.f90 b/coinhsl/hsl_ma77/hsl_ma77d.f90 new file mode 100644 index 0000000..03decb6 --- /dev/null +++ b/coinhsl/hsl_ma77/hsl_ma77d.f90 @@ -0,0 +1,12425 @@ +! COPYRIGHT (c) 2006 Council for the Central Laboratory +! of the Research Councils +! Original date 5 September 2006. Version 1.0.0. + +! Version 6.1.0 +! For full version history see ChangeLog + +! IMPORTANT : Version 1.0.0 for HSL 2007 was ONLY for the positive definite +! Version 2.0.0 for positive definite and indefinite matrices +! Version 3.0.0 allows for running on 64-bit architectures +! Version 4.0.0 option to scale added +! Version 5.0.0 static pivoting modified (following +! change to hsl_ma64) + +! Written by: John Reid and Jennifer Scott + + ! Some general remarks: +! Elements are linked by earliest variable in pivot sequence. +! Supervariables used so that when a variable is eliminated in +! the row-entry code, variables with identical patterns are too. +! The user decides on entry to ma77_factor whether the problem is to be +! treated as pos.def. or indefinite. +! We allow 2x2 pivots to be input in the indefinite version. +! Frontal matrix is held in main memory. +! + +!!!!! +! To generate the single precision version from the double version: +! (1) globally change _double to _single +! (2) change 0.0d0 to 0.0 +! (3) globally change dcopy, daxpy, dnrm2, dgemv, dtpmv +! to scopy, saxpy, snrm2, sgemv, stpmv respectively. +! (4) globally change huge(0_short)/8 to huge(0_short)/4 +! and huge(0_long)/8 to huge(0_long)/4. +!!!!! + +module hsl_MA77_double + + use hsl_ma54_double + use hsl_ma64_double + use hsl_of01_double, of01_rdata => of01_data + use hsl_of01_integer, of01_idata => of01_data + + implicit none + +!************************************************* +! Parameters (all private) +! All integers are declared to be either short or long + integer, parameter, private :: wp = kind(0.0d0) + integer, parameter, private :: long = selected_int_kind(18) + integer, parameter, private :: short = kind(0) + real (wp), parameter, private :: one = 1.0_wp + real (wp), parameter, private :: zero = 0.0_wp + integer(short), parameter, private :: nemin_default = 8 + integer(short), parameter, private :: lup1 = huge(0_short)/8 !(do NOT +! change this for 64-bit version) + integer(short), parameter, private :: nb54_default = 150 + integer(short), parameter, private :: nb64_default = 120 + integer(short), parameter, private :: nbi_default = 40 +!************************************************* + + interface MA77_open + module procedure MA77_open_double + end interface + + interface MA77_input_vars + module procedure MA77_input_vars_double + end interface + + interface MA77_input_reals + module procedure MA77_input_reals_double + end interface + + interface MA77_analyse + module procedure MA77_analyse_double + end interface + + interface MA77_factor + module procedure MA77_factor_double + end interface + + interface MA77_factor_solve + module procedure MA77_factor_solve_double + end interface + + interface MA77_solve + module procedure MA77_solve_double + end interface + + interface MA77_solve_fredholm + module procedure MA77_solve_fredholm_double + end interface + + interface MA77_resid + module procedure MA77_resid_double + end interface + + interface MA77_scale + module procedure MA77_scale_double + end interface + + interface MA77_enquire_posdef + module procedure MA77_enquire_posdef_double + end interface + + interface MA77_enquire_indef + module procedure MA77_enquire_indef_double + end interface + + interface MA77_alter + module procedure MA77_alter_double + end interface + + interface MA77_restart + module procedure MA77_restart_double + end interface + + interface MA77_lmultiply + module procedure MA77_lmultiply_double + end interface + + interface MA77_finalise + module procedure MA77_finalise_double + end interface + +!**************************************************************************** + + type MA77_control ! The scalar control of this type controls the action + + logical :: action = .true. ! pos_def = .false. only. +! If true and the matrix is found to be +! singular, computation continues with a warning. +! Otherwise, terminates with error -11. + + integer(short) :: bits = 32 ! set to 64 for 64-bit architecture + + integer(short) :: buffer_lpage(2) = 2**12 ! Number of scalars held in each +! page of the integer and real in-core buffers. + + integer(short) :: buffer_npage(2) = 1600 ! Number of pages in the integer +! and real in-core buffers. + + real(wp) :: consist_tol = epsilon(one) ! used on call to ma77_solve_fredholm +! to determine if system is consistent (singular case only) + + integer(long) :: file_size = 2**21 ! Target filesize for each of01 file. + + integer(short) :: infnorm = 0 ! controls norm used by scaling. Uses +! one norm if infnorm /= 0 and infinity norm if infnorm = 0. + + integer(short) :: maxit = 1 ! max number of iterations performed +! by scaling algorithm + + integer(long) :: maxstore = 0_long ! Max. amount of storage (in Fortran +! storage units) for in-core arrays that replace superfiles. + + real(wp) :: multiplier = 1.1 ! In the indefinite case, the predicted +! frontsize is increased by max(1,multipler) at start of +! factorize and whenever front found to be too small. + + integer(short) :: nb54 = 150 ! Block size for the hsl_ma54 kernel code. + + integer(short) :: nb64 = 120 ! Block size for the hsl_ma64 kernel code. + + integer(short) :: nbi = 40 ! Inner block size for the hsl_ma64 kernel code + + integer(short) :: nemin = nemin_default ! +! Min. number of eliminations at a tree +! node for amalgamation not to be considered. + + integer(short) :: p = 4 ! Controls choice of p: +! p=1: Split point at 1 +! p=2: Split point at 2 +! p=3: Split point at nc +! p=4: Split point chosen by G & L'E + + integer(short) :: print_level = 0 ! Controls diagnostic printing. +! Possible values are: +! < 0: no printing. +! 0: error and warning messages only. +! 1: as 0 plus basic diagnostic printing. +! > 1: as 1 plus some more detailed diagnostic messages. + + real(wp) :: small = 1e-20_wp ! Minimum pivot size (absolute value of a +! pivot must be of size at least small to be accepted). + + real (wp) :: static = zero ! Controls static pivoting. Only used +! in indefinite case. If static > 0, pivots that do not +! satisfy the threshold criteria may be selected and small +! pivots may be replaced by static. In this case, the +! factorization may be inaccurate. + + integer(long) :: storage(3) = 0_long ! If positive, numbers of scalars +! initially held in the arrays that replace superfiles. + + integer(long) :: storage_indef = 0 ! If positive, numbers of scalars +! initially held in the arrays that replace superfile +! that is used as workspace in indefinite case. + + real(wp) :: thresh = 0.5 ! Tolerance for stopping the iterations +! of the iterative scaling algorithm + + integer(short) :: unit_diagnostics = 6 ! unit number for +! diagnostic printing. +! Printing is suppressed if unit_diagnostics < 0. + + integer(short) :: unit_error = 6 ! unit number for error messages +! Printing is suppressed if unit_error < 0. + + integer(short) :: unit_warning = 6 ! unit number for warning messages +! Printing is suppressed if unit_warning < 0. + + real (wp) :: u = 0.01 ! Initial relative pivot threshold. Only used +! in indefinite case. +! This is a control parameter for HSL_MA64. + + real (wp) :: umin = 1.00 ! Minimum relative pivot threshold. Only used +! in indefinite case. If umin < u, the pivot test may +! be relaxed to prevent pivots from being delayed +! (that is u may be replaced by a smaller value, which is +! at least umin). +! This is a control parameter for HSL_MA64. + + end type MA77_control + +!**************************************************************************** + + type MA77_info ! The scalar info of this type returns information to user. + real (wp) :: detlog = 0.0 ! log. of absolute value of the determinant + integer(short) :: detsign = 1 ! Sign of the determinant of the matrix. + integer(short) :: flag = 0 ! Value zero after successful entry. +! Possible error returns: +! -1 Allocation error +! -3 Error in the sequence of calls +! -4 n < 0 +! -5 Error from of01 (error in Fortran inquire) +! -6 Error from of01 (error in Fortran read) +! -7 Error from of01 (error in Fortran open) +! -8 Deallocation error +! -9 MA77_input_vars has already been called for this element/row +! -10 MA77_input_vars was not called for this element/row +! -11 problem found to be singular or unexpectedly not pos. def +! -12 Error from of01 (a filename with same name already exists) +! -13 len(filename) (or len(restart_file)) is too large +! -14 data for previous element/row incomplete +! -15 Error from of01 (error in Fortran write) +! -16 len(path) is too large or +! open unsuccessful for all elements of path. +! -17 out-of-range and/or duplicated indices entered and +! user has not entered all the reals for the current elt/row +! in a single call to inelrs. +! -18 nelt < 0 +! -19 Length of array reals is < 0 +! -20 job is out of range +! -21 Error in user-supplied pivot order held in order. +! -22 For one or more elements/rows, MA77_input_vars was called +! but no corresponding call was made to MA77_input_reals. +! -23 control%buffer_lpage(:) < 1 or > control%file_size +! -24 Error in size of x. +! -25 Error in size of resid. +! -26 control%buffer_npage(:) < 1 +! -27 control%maxstore out of range +! -28 Files with names restart_file and/or filename(1:2) +! do not exist. +! -29 pos_def = .true. but 2x2 pivots supplied to MA77_analyse +! -30 Error return MA77_factor if front too large for allocation +! -31 All the variables in an element/row are out-of-range +! -32 too many reals input for current element/row +! -33 number of entries in variable list < 0 +! -34 Returned by MA77_enquire_indef or MA77_alter +! if the call does not follow a successful call to +! MA77_factor with pos_def = .false. +! -35 Returned by MA77_enquire_posdef +! if the call does not follow a successful call to +! MA77_factor with pos_def = .true. +! -36 Returned by MA77_enquire_posdef, +! MA77_enquire_indef, or MA77_alter +! if there is an error in the size of array piv_order. +! -37 Returned by MA77_enquire_posdef, +! MA77_enquire_indef, or MA77_alter +! if there is an error in the size of array d +! -38 static < small and static /= 0.0 +! -39 length array scale too small, or scale present when +! should not be or absent when expected on call to ma77_solve +! -40 IEEE infinities found in the reduced matrix +! -41 Error in Fortran close statement + +! Possible warnings: +! +1 Out-of-range variable indices +! +2 Duplicated variable indices +! +4 Problem singular (control%action = .true.) + integer(short) :: iostat = 0 ! iostat value on error +! return -5, -6, -7, -15. + integer(short) :: matrix_dup = 0 ! Number of duplicated entries. + integer(short) :: matrix_rank = 0 ! Rank of factorized matrix. + integer(short) :: matrix_outrange = 0 ! Number of out-of-range entries. + integer(short) :: maxdepth = 0 ! Maximum depth of the tree. + integer(short) :: maxfront = 0 ! Maximum front size. + integer(long) :: minstore = 0_long ! Amount of storage used in superfiles + integer(short) :: ndelay = 0 ! Number of delayed eliminations. + integer(long) :: nfactor = 0_long ! Number of entries in the factor. + integer(long) :: nflops = 0_long ! Number of flops needed to calculate L. + integer(short) :: niter = 0 ! Number of iterations of scaling algorithm. + integer(short) :: nsup = 0 ! Number of supervariables. (Copy of keep%nsup). + integer(short) :: num_neg = 0 ! Number of negative eigenvalues. + integer(short) :: num_nothresh = 0 ! Number of pivots which did not +! satisfy the threshold criteria. + integer(short) :: num_perturbed = 0 ! holds number of pivots that were +! replaced by control%static + integer(short) :: ntwo = 0 ! Number of 2x2 pivots. + integer(short) :: stat = 0 ! STAT value on error return -1 and -8. + integer(short) :: index(1:4) = -1 +! Holds info. on index of of01 superfiles used +! index(1) index of main integer superfile +! index(2) index of main real superfile +! index(3) index of real work superfile +! index(4) index of real superfile for delayed pivot cols +! index(i) < 0 if no data written to superfile. + + integer(long) :: nio_read(1:2) = 0_long ! On exit from a call to +! MA77_analyse, MA77_factor, and MA7_solve, holds the no. of integer +! and real records read by HSL_OF01 during the subroutine call + integer(long) :: nio_write(1:2) = 0_long ! On exit from a call to +! MA77_analyse, MA77_factor, and MA7_solve, holds the no. of integer +! and real records written by HSL_OF01 during the subroutine call + integer(long) :: nwd_read(1:2) = 0_long ! On exit from a call to +! MA77_analyse, MA77_factor, and MA7_solve, holds the no. of integer +! and real scalars read by HSL_OF01 during the subroutine call + integer(long) :: nwd_write(1:2) = 0_long ! On exit from a call to +! MA77_analyse, MA77_factor, and MA7_solve, holds the no. of integer +! and real scalars written by HSL_OF01 during the subroutine call + + integer(short) :: num_file(1:4) = 0 ! On exit from a call to MA77_finalise, +! holds the number of secondary files that have been used +! by the superfiles + + integer(long) :: storage(1:4) = 0_long ! Holds info. on storage used for +! arrays that replace superfiles. +! storage(1) ! no. of integers stored in main integer superfile +! (set to keep%ifree-1 at end of factorize) +! storage(2) ! no. of reals stored in main real superfile +! (set to keep%rfree-1 at end of factorize) +! storage(3) ! max. size of main real stack (keep%rtopmx) +! storage(4) ! max. size of real stack for delayed pivot +! cols (keep%rtopdmx) + integer(short) :: tree_nodes = 0 ! number of non-leaf nodes in tree +! (including any that are discarded but not reused). +! (=keep%tnode-keep%nelt) + integer(short) :: unit_restart = -1 ! Holds unit number of restart file + integer(short) :: unused = 0 ! Holds number of unused variables. + real(wp) :: u = zero ! if num_perturbed = 0, on exit from factor +! u holds threshold parameter that was used. + +! integer(short) :: wasted = 0 + end type MA77_info + +!**************************************************************************** + + type MA77_node ! Each element of the array tree of this type holds +! data at a non-leaf node of the tree. +! private ! 22.07.08 no longer private because hsl_ma79 needs to +! have access to some of its components. + integer(short), allocatable :: child(:) ! Names of the node's children. +! Note: children are all elements (either original elements or +! generated elements: original rows are NOT included in the +! tree structure). + integer(short) :: nelim ! Number of variables eliminated at the node if +! there are no delayed pivots. + end type MA77_node + +!**************************************************************************** + +! Structure of the main integer superfile is as follows: +! (a) For each row/element i input by the user in the +! calls to MA77_input_vars we store +! a list of length nvar = keep%size(i) of user-supplied variables. +! If there are duplicates and/or out-of-range entries, we flag this +! by setting keep%size(i) = -nvar, where nvar is the number of variables +! in list AFTER duplicates/out-of-range entries squeezed out. +! We write this list out to file, then the no. of entries +! in the original user-supplied list and then a mapping +! from the original list to the compressed list. +! map(j) = 0 indicates jth variable out-of-range and to be ignored. +! if map(j) = map(k) then jth and kth variables are duplicates. +! (b) For each non-leaf node we store the list of variables +! in elimination order, +! with those that are eliminated at the node given first. +! keep%ifile(i) holds the start of the data for node i. +! (c) In the indefinite case, during MA77_factor +! we hold the actual lists +! of the variables at each node (which will differ from +! those stored during analyse if pivots are delayed). +! keep%posint holds the position beyond the +! end of the variable list for the last node in the tree +! generated by MA77_analyse; this is the start of the lists +! of integers for the nodes of the tree used during +! the factorization. If more than one problem is +! factorized, the code will overwrite from keep%posint. +! Note: if the user has input 2x2 pivots, then negative signs +! are used to flag this (amking it necessary to take absolute +! values at non-leaf nodes). + +! Structure of the main real superfile is as follows: +! (a) For each row/element i input by the user in the +! calls to MA77_input_reals we store the real data supplied +! by the user (nvar reals in row case and +! (nvar*nvar+nvar)/2 in element case, where +! nvar = keep%size(i)). keep%rfile(i) holds the position after +! the last entry in the list for elt/equ i (it points +! to the end of the list to allow user to input data using +! more than one call) +! (b) keep%posfac holds the position beyond the +! end of the reals for the last element/row +! input by the user; this is the start of the reals on diagonal (block) +! of factor followed by for the factors. In positive definite +! case, we store n diagonal entries (square roots +! of the pivots), in the indefinite case we leave +! room for 2n entries (to allow for 2x2 pivots) before we write the +! factor entries (actually store the inverse of D in indefinite case) +! If more than one problem is +! factorized, the code will overwrite from keep%posfac. + +!**************************************************************************** + + type MA77_keep ! The scalar keep of this type holds matrix data that is +! passed between subroutines +! private ! 22.07.08 keep is no longer private because hsl_ma79 needs to +! have access to some of its components. + integer(long) :: dfree ! Last location in the main real superfile +! used for storage of diagonal entries. + logical :: element_input ! .true. iff input is by elements. + integer(long) :: file_size ! file_size for of01 + integer(short) :: flag = 0 ! holds warning flag (needed so that on reverse +! communications calls, info%flag can be reset) + integer(long) :: ifree ! First free location in the main integer superfile + integer(short) :: index(1:4) = -1 ! Holds index of of01 superfiles used +! index(1) index of main integer superfile +! index(2) index of main real superfile +! index(3) index of real work superfile +! index(4) index of real superfile for delayed pivot columns +! index(i) < 0 if no data written to file. +! In pos. def. case, files are opened on index(4:5) but not actually used. + integer(short) :: inelrs ! Number of reals required to complete the input +! of the current element/row (used by MA77_input_reals). + integer(short) :: inelrn ! index of the element/row that was last input. + integer(short) :: lpage(2) ! lpage for of01 + integer(short) :: ltree ! Size of the array called tree. + integer(long) :: lup ! huge(0_short)/8 (32-bit) or huge(0_long)/8 (64-bit) + integer(short) :: l1,l2 ! we use tree(keep%l1:keep%l2) +! l1 is set to keep%nelt+1 +! l2 is set to keep%nelt+keep%ltree +! If finalise is called with restart_file present, +! l2 is set to keep%tnode (we allocate tree(keep%l1:keep%l2) +! for restarting as the actual number of nodes in +! tree is known by this stage) + integer(short) :: matrix_dup ! Number of duplicated entries. + integer(short) :: matrix_outrange ! Number of out-of-range entries. + integer(short) :: maxelim ! Holds largest number of eliminations at a node + integer(short) :: maxelim_actual ! Set in factorize to hold +! the largest number of eliminations +! actually performed at a node (indefinite case only) + integer(long) :: maxfa ! Holds the largest factor contribution that +! is written to the main real superfile during call to MA77_factor. +! We need this to allocate sufficient space for +! reading in factor blocks during solve. + integer(short) :: maxfront ! Holds the largest front size. +! Set during call to MA77_analyse. Not altered during factor. + integer(short) :: maxdepth ! Holds max tree depth. + integer(short) :: maxfrontb ! Holds the largest front size +! during factorize (=maxfront is pos def case) + integer(short) :: maxlen ! Holds the number of variables in +! the largest node in the tree. +! Set during call to MA77_analyse. Not altered during factor. + integer(long) :: maxstore ! Max. amount of storage available +! (in Fortran storage units) for in-core working + integer(short) :: mvar ! Max. number of variables in an elt/row. + integer(short) :: mmvar ! Max. number of variables in an elt/row after +! duplicates and out-of-range entries removed. + integer(long) :: mx_ifree ! mx_ifree is +! set to no. of integers written to integer superfile +! (needed so that info%storage(1) is calculated correctly) + integer(short) :: n ! Order of the system. +! Set by user on the call to MA77_open. + character(50) :: name ! Procedure name (used when printing messages). + integer(short) :: nb ! Copy of control%nb54 or control%nb64 +! (set on call to MA77_factor). + integer(short) :: nbi ! Copy of control%nbi +! (set on call to MA77_factor). + integer(short) :: nelt ! Bound on the integers used to index elements in +! the element-entry case or variables in the row-entry +! case. Set on the call to MA77_open. + integer(short) :: npage(2) ! npage for of01 + integer(short) :: nsup ! Number of supervariables, including one for +! indices that are not used. + integer(short) :: ntwo ! Number of 2x2 pivots passed by user to analyse + integer(short) :: null ! Number of null rows and cols in matrix + logical :: pos_def ! .true. iff the problem is known to positive definite. +! Specified by user on call of MA77_factor. + integer(long) :: posfac ! Holds the position in the main real superfile of +! the start of the reals in the factor. + integer(long) :: posint ! Holds the position in the main int. superfile +! of the start of the integers in the factor +! (only needed in the indef. case) + integer(long) :: rfree ! First free location in the main real superfile. + integer(long) :: rtopmx ! Max. size of main real stack. + integer(long) :: rtopdmx ! Max. size of real stack for delayed pivots. + integer(short) :: scale = 0 ! Set to 1 if ma77_factor called with +! scale present. + integer(short) :: status = 0 ! Monitors the progress: +! 0 initially or after a call to MA77_finalise +! 1 after call to MA77_open +! 2 after a successful call to MA77_analyse +! 3 after a successful call to MA77_factor +! or successful call to MA77_restart +! -2 after an error condition early in MA77_open (needed by finalise) +! -1 after another error condition +! NB To continue after an error requires a call of MA77_finalise + integer(long) :: used ! amount of storage used when user wishes to work +! in-core (ie the sum of the sizes of the arrays +! that are used in place of files) + integer(short) :: tnode ! No. of nodes in the tree (including any that are +! discarded but not reused). + +!!! allocatable components: + + real(wp), allocatable :: aelt(:) ! Used in MA77_input_reals in element +! entry case to squeeze out duplicates/out-of-range entries. +! Allocated by MA77_input_reals. +! Deallocated by MA77_factorize. + + real(wp), allocatable :: arow(:) ! Used in MA77_input_reals in row +! entry case to squeeze out duplicates/out-of-range entries. +! Allocated by MA77_input_reals. +! Deallocated by MA77_factorize. + + integer(short), allocatable :: clist(:) ! Used in MA77_input_vars to hold +! variable list for the incoming +! element/row with duplicates/out-of-range indices removed. +! Also used in MA77_input_reals to hold this list +! Allocated by MA77_input_vars. +! Deallocated by MA77_factorize. + + integer(long), allocatable :: ifile(:) +! ifile(ie) is the position in the main integer superfile of the +! list of names of variables associated with node ie. + + integer(short), allocatable :: iptr(:) ! Used in MA77_input_reals to hold +! positions of columns in compressed element. +! Allocated by MA77_input_vars. +! Deallocated by MA77_factorize. + + integer(short), allocatable :: map(:) ! Used to hold mapping +! between user-supplied +! variable list for incoming element/row and list +! with duplicates/out-of-range indices removed. +! Allocated by MA77_MA77_input_vars. +! Deallocated by MA77_analyse. + + integer(short), allocatable :: new(:) +! new(is) is the new supervariable constructed from variables of +! supervariable is. Allocated by MA77_open to have length n+1. +! Deallocated by MA77_analyse. + + integer(long), allocatable :: rfile(:) +! rfile(ie) is the position in the main super-real file after the +! last entry in the list of reals associated with the input +! element/row ie. +! Deallocated by MA77_finalise. + + integer(short), allocatable :: roots(:) +! Holds the roots of the forest. + + integer(short), allocatable :: size(:) +! size(ie) holds the length of the list of variables associated +! with node ie. If there are duplicates/out-of-range indices in the +! lists supplied by the user at leaf nodes, this is indicated +! by a negative flag and -size(ie) holds no. of variables at leaf ie +! after duplicates absorbed and out-of-range entries removed. +! Not altered by factor or solve. + + integer(short), allocatable :: size_ind(:) +! size_ind(ie) holds the length of the list that is written to the +! delayed pivots superfile for node ie (indefinite case only). + + integer(short), allocatable :: splitp(:) +! splitp(node) best split point for node (number of +! children of node to be processed before assembly begins) +! Note : could be held as file data + + integer(short), allocatable :: svar(:) +! svar(i) holds the supervariable to which variable i belongs. +! Allocated by MA77_open to have length n. +! Set during the calls to MA77_input_vars. used by MA77_analyse. +! note: not altered so that analyse can be repeated without +! recalling MA77_input_vars we could save storage by writing +! it to the main integer superfile during factorize and read +! back at end of factorize so ready to recall analyse? + + integer(short), allocatable :: vars(:) +! vars(is) holds the number of variables in supervariable is. +! Note that vars(1) holds number of variables in supervariable 1, +! that is, the number of indices not used to index a variable. +! Allocated by MA77_open to have length n+1. +! Set during the calls to MA77_input_vars. Deallocated by +! MA77_analyse. + + integer(short), allocatable :: varflag(:) +! In MA77_input_vars, varflag(is) = ielt if supervariable is has +! been encountered in element ielt. Allocated by MA77_open +! to have length n+1. Deallocated by MA77_analyse. + +! The following array components are only used if the user wants to work +! in-core; otherwise they are allocated to have length 1. + + integer(long) :: size_imain ! size of keep%imain + integer(long) :: size_rmain ! size of keep%rmain + integer(long) :: size_rwork ! size of keep%rwork + integer(long) :: size_rwdelay ! size of keep%rwdelay + + integer(short),allocatable :: imain(:) +! main integer array (replaces main integer file) + + real(wp),allocatable :: rmain(:) +! main real array (replaces main real file) + + real(wp),allocatable :: rwork(:) +! main real work array (replaces main real work file) + + real(wp),allocatable :: rwdelay(:) +! real array for delayed pivots (replaces file) + + character,allocatable :: file1(:) + character,allocatable :: file2(:) + character,allocatable :: file3(:) + character,allocatable :: file4(:) + character,allocatable :: file5(:) + + type (MA77_node),allocatable :: tree(:) ! holds information at +! non-leaf nodes. Not altered during factor or solve. +! structures for of01 + type (of01_rdata) :: rdata + type (of01_idata) :: idata + + end type MA77_keep + +contains + +!**************************************************************************** + + subroutine MA77_open_double(n,filename,keep,control,info,nelt,path) +! User must input basic problem data. Data is checked and then +! superfiles are opened using hsl_of01. + + integer(short), intent (in) :: n ! Order of the system. Must be >= 0. + character (len=*), intent (in) :: filename(4) ! len(filename) < 400 +! filename(1:2) must identify the integer and real superfiles +! for the factors; +! filename(3) must identify the primary real work superfile. +! filename(4:5) must identify the integer and real superfiles +! for delayed pivots (indefinite case only). + type (MA77_keep), intent (inout) :: keep ! See derived-type declaration + type (MA77_control), intent (in) :: control ! See derived-type declaration + type (MA77_info), intent (out) :: info ! See derived-type declaration + integer(short), optional, intent (in) :: nelt ! If absent entry is by rows; +! otherwise, must be set to largest integer used to index an element. + character (len=*), optional, intent (in) :: path(:) ! len(path) < 400. +! path(:) must be set to hold path names for the direct access +! files. More than one name may be needed for large problems. +! The file names are essentially the concatentation of path and +! filename (full details in of01 spec). +! if absent, path = '' used. + +! Local variables + integer(short) :: file ! Indicates to error_open which file +! (if any) is involved. + integer(short) :: l ! Temporary + integer(long) :: llong ! Temporary + integer(long) :: maxstore ! Copy of control%maxstore + integer(short) :: nout ! Unit for printing of messages (-1 for no messages) + integer(short) :: st ! stat variable for allocate and deallocate + integer(long) :: storage(3) + +! Possible error returns: +! -1 Allocation error +! -3 Call is not first call or does not follow call to finalise. +! -4 n < 0 +! -5 Error from of01_open (error in Fortran inquire). +! -7 Error from of01_open (error in Fortran open). +! -12 Error from of01_open (a file with same name already exists) +! -13 len(filename) too long +! -16 len(path) too long or open unsuccessful for all elements of path +! -18 nelt < 0 +! -23 control%buffer_lpage(:) < 1 or > control%file_size +! -26 control%buffer_npage(:) < 1 +! -27 control%maxstore out of range + +! Perform appropriate printing + if (control%print_level >= 1 .and. control%unit_diagnostics >= 0) then + if (present(nelt)) then + write (control%unit_diagnostics,'(//a,2(/a,i12))') & + ' Entering MA77_open (element entry) with:', & + ' n Order of matrix = ',n, & + ' nelt Number of elements = ',nelt + else + write (control%unit_diagnostics,'(//a,/a,i12)') & + ' Entering MA77_open (row entry) with:', & + ' n Order of matrix = ',n + end if + write (control%unit_diagnostics,'(2a)') ' filename(1) = ', & + trim(filename(1)) + write (control%unit_diagnostics,'(2a)') ' filename(2) = ', & + trim(filename(2)) + write (control%unit_diagnostics,'(2a)') ' filename(3) = ', & + trim(filename(3)) + write (control%unit_diagnostics,'(2a)') ' filename(4) = ', & + trim(filename(4)) + if (present(path)) & + write (control%unit_diagnostics,'(2a)') ' path(1) = ', & + trim(path(1)) + + write (control%unit_diagnostics, & + '(a,4(/a,i12),2(/a,2i8),2(/a,es12.4)/a/3es12.4)') & + ' control parameters (control%) :', & + ' print_level Level of diagnostic printing = ', & + control%print_level, & + ' unit_diagnostics Unit for diagnostics = ', & + control%unit_diagnostics, & + ' unit_error Unit for errors = ', & + control%unit_error, & + ' unit_warning Unit for warnings = ', & + control%unit_warning, & + ' buffer_lpage Length of pages in integer/real buffer = ', & + control%buffer_lpage(1:2), & + ' buffer_npage Number of pages in integer/real buffer = ', & + control%buffer_npage(1:2), & + ' file_size Target size for each file = ', & + real(control%file_size), & + ' maxstore Storage for in-core arrays = ', & + real(control%maxstore), & + ' storage(1:3) Initial sizes for in-core arrays = ', & + real(control%storage(1:3)) + + end if + + nout = control%unit_error + if (control%print_level < 0) nout = -1 + file = 0 + +! write (6,*) ' on open, status = ',keep%status + +! Check status parameter + if (keep%status /= 0) then + info%flag = -3 + call error_open; return + end if + keep%status = -2 + + keep%lup = huge(0_long)/8 + if (control%bits == 32) keep%lup = huge(0_short)/8 + +! Perform tests on control parameters/ input data + if (control%buffer_lpage(1) < 1 .or. & + control%buffer_lpage(1) > control%file_size) then + info%flag = -23 + else if (control%buffer_lpage(2) < 1 .or. & + control%buffer_lpage(2) > control%file_size) then + info%flag = -23 + else if (len(filename) > 400) then + info%flag = -13 + else if (control%buffer_npage(1) < 1 .or. control%buffer_npage(2) < 1) then + info%flag = -26 + else if (control%maxstore < 0 .or. control%maxstore > keep%lup) then + info%flag = -27 + else if (n < 0) then + info%flag = -4 + end if + + if (info%flag < 0) then + call error_open; return + end if + + if (present(nelt)) then + if (nelt < 0) info%flag = -18 + end if + if (present(path)) then +! The user must supply file names of length <400 and +! path names of length <400 + if (len(path) > 400) info%flag = -16 + end if + + if (info%flag < 0) then + call error_open; return + end if + + keep%n = n + keep%nelt = n + l = 1 + n*2 + keep%element_input = .false. + if (present(nelt)) then + keep%nelt = nelt + l = 1 + nelt*3 + keep%element_input = .true. + end if + +! Separate deallocate statements are used so that all are deallocated even +! if some are already deallocated. + deallocate (keep%imain,stat=st) + deallocate (keep%rmain,stat=st) + deallocate (keep%rwork,stat=st) + deallocate (keep%rwdelay,stat=st) + deallocate (keep%size,stat=st) + +! Allocate the arrays needed by MA77_input_vars + deallocate (keep%varflag,stat=st) + deallocate (keep%vars,stat=st) + deallocate (keep%svar,stat=st) + deallocate (keep%new,stat=st) + deallocate (keep%rfile,stat=st) + deallocate (keep%ifile,stat=st) + + allocate (keep%varflag(n+1),keep%vars(n+1), & + keep%svar(n),keep%new(n+1),keep%ifile(l), & + keep%rfile(l),keep%size(l),stat=st) + if (st /= 0) then + info%flag = -1; info%stat = st + call error_open; return + end if + +! Initialise the leaf nodes of the tree + l = keep%nelt+1 + keep%size(1:l) = 0 + keep%ifile(1:l) = 0 + + keep%rfile = 0 + +! Set keep%svar and keep%vars to represent all variables +! belonging to supervariable 1. Initialize keep%nsup and keep%varflag. + keep%svar(:) = 1 + keep%vars(1) = n + keep%varflag(:) = 0 + keep%nsup = 1 + +! Initialise of01 (we do this even if user hopes to work in-core) + keep%status = -1 + keep%file_size = control%file_size + keep%npage = control%buffer_npage + keep%lpage = control%buffer_lpage + + if (present(path)) then + call of01_initialize(info%flag,keep%idata,path=path,npage=keep%npage(1),& + lpage=keep%lpage(1),file_size=keep%file_size,lp=-1) + else + call of01_initialize(info%flag,keep%idata,npage=keep%npage(1), & + lpage=keep%lpage(1),file_size=keep%file_size,lp=-1) + end if + if (info%flag == -1) then + info%stat = keep%idata%stat + call error_open; return + end if + + if (present(path)) then + call of01_initialize(info%flag,keep%rdata,path=path,npage=keep%npage(2),& + lpage=keep%lpage(2),file_size=keep%file_size,lp=-1) + else + call of01_initialize(info%flag,keep%rdata,npage=keep%npage(2), & + lpage=keep%lpage(2),file_size=keep%file_size,lp=-1) + end if + if (info%flag == -1) then + info%stat = keep%rdata%stat + call error_open; return + end if + +! integer superfile + file = 1 + call of01_open(filename(1),keep%index(1),info%flag,keep%idata,lp=-1) + if (info%flag < 0) then + info%iostat = keep%idata%iostat + call error_open; return + end if + + do file = 2,4 +! real superfiles + call of01_open(filename(file),keep%index(file),info%flag,& + keep%rdata,lp=-1) + if (info%flag < 0) then + info%iostat = keep%rdata%iostat + call error_open; return + end if + end do + +! Check control%maxstore and control%storage(1:3) to see if the user +! wants to try in-core working. Note: at this stage, not known if the +! problem is pos. def. or indef. + keep%used = 0_long + maxstore = control%maxstore + if (maxstore > 0_long) then + storage(1:3) = control%storage(1:3) +! user wants to try in-core working + if (any(storage(1:3) == 0_long)) then + llong = max(1_long,maxstore/200_long) + storage(1) = 2*llong; storage(2) = llong*8; storage(3) = llong + end if + if (storage(2) > 0 .and. keep%used + 2*storage(2) <= maxstore) then + deallocate (keep%rmain,stat=st) + allocate (keep%rmain(storage(2)),stat=st) + if (st == 0) then +! array allocated for real data so we will start by working in-core. +! set unit number for real superfile to be negative to indicate this + keep%index(2) = -keep%index(2) + keep%used = keep%used + 2*storage(2) + keep%size_rmain = storage(2) + end if + end if + if (storage(1) > 0_long .and. storage(1) <= maxstore) then + deallocate (keep%imain,stat=st) + allocate (keep%imain(storage(1)),stat=st) + if (st == 0) then +! array allocated for integer data so we will start by working in-core. +! set unit number for integer superfile to be negative to indicate this + keep%index(1) = -keep%index(1) + keep%used = keep%used + storage(1) + keep%size_imain = storage(1) + end if + end if + + if (storage(3) > 0_long .and. keep%used + 2*storage(3) <= maxstore) then + deallocate (keep%rwork,stat=st) + allocate (keep%rwork(storage(3)),stat=st) + if (st == 0) then + keep%index(3) = -keep%index(3) + keep%used = keep%used + 2*storage(3) + keep%size_rwork = storage(3) + end if + end if + end if + + keep%maxstore = maxstore + keep%flag = 0 + keep%status = 1 + keep%inelrs = 0 + keep%inelrn = 0 + keep%maxfront = 0 + keep%maxlen = 0 + keep%mvar = 0 + keep%mmvar = 0 + keep%matrix_dup = 0 + keep%matrix_outrange = 0 + + keep%ifree = 1 + keep%rfree = 1 + keep%posfac = 1 + + info%flag = 0 + info%index(1:4) = abs(keep%index(1:4)) + info%nsup = 1 + info%storage(1:4) = 0_long + + if (control%print_level >= 1 .and. control%unit_diagnostics >= 0) & + write (control%unit_diagnostics,'(/a,i4/a,4i4)') & + ' Leaving MA77_open with error flag info%flag = ', info%flag, & + ' File indices info%index(1:4) = ',info%index(1:4) + + contains + + subroutine error_open + integer(long) :: lenw + integer(short) :: flag,num_file + + keep%name = 'MA77_open' + + if (info%flag == -5 .or. & + info%flag == -7 .or. info%flag == -12 .or. info%flag == -17) then +! close any files that had already been opened + keep%status = -2 + if (file > 1) call of01_close(abs(keep%index(1)),lenw,num_file,flag, & + keep%idata,lp=-1,lkeep=.false.) + if (file > 2) call of01_close(abs(keep%index(2)),lenw,num_file,flag, & + keep%rdata,lp=-1,lkeep=.false.) + if (file > 3) call of01_close(abs(keep%index(3)),lenw,num_file,flag, & + keep%rdata,lp=-1,lkeep=.false.) + call of01_end(flag,keep%idata,-1) + call of01_end(flag,keep%rdata,-1) + end if + +! If necessary, reset hsl_of01 flag value to correct hsl_ma77 value. +! Then print error message. + if (info%flag == -17) info%flag = -16 + call MA77_print_iflag(keep,nout,info%flag) + if (info%flag == -12 .and. nout >= 0) & + write (nout,*) 'filename = ', trim(filename(file)) + + end subroutine error_open + + end subroutine MA77_open_double + +!**************************************************************************** + + subroutine MA77_input_vars_double(index,nvar,list,keep,control,info) + +! This subroutine is called by the user to specify the variables +! belonging to an element/row (reverse communication interface). +! Lists of supervariables are generated. +! Note: supervariable 1 holds the variables that are not +! used (it may have no variables belonging to it). +! It is possible to have nsup = n+1. +! Duplicates and/or out of range entries are allowed. + + integer(short), intent (in) :: index ! Index of incoming element/row. + integer(short), intent (in) :: nvar ! Number of variables +! in the incoming element/row. Must be >= 0. + integer(short), intent (in) :: list(nvar) ! Names of the variables in the +! incoming element/row. + type (MA77_keep), intent (inout) :: keep ! See derived-type declaration + type (MA77_control), intent (in) :: control ! See derived-type declaration + type (MA77_info), intent (inout) :: info ! See derived-type declaration + +! Local scalars + integer(short) :: flag ! local error flag + integer(short) :: i ! Temporary + integer(short) :: is ! Supervariable + integer(short) :: js ! New supervariable constructed from +! variables of is + integer(short) :: jvar ! Index for a variable + integer(short) :: k ! Temporary + integer(short) :: l ! Temporary + integer(short) :: n1 ! Holds no. of out-of-range entries + integer(short) :: n2 ! Holds no. of duplicated entries + integer(short) :: nnvar ! Set to nvar - n1 - n2 (no. of entries +! in variable list after duplicates/out-of-range entries removed). + integer(short) :: nout ! Unit for printing of error messages + integer(short) :: nout1 ! Unit for printing of warning messages + integer(short) :: nsup ! No. of supervariables + integer(short) :: st ! Allocation error + integer(long) :: loc ! Location in main integer superfile + integer(short) :: ldiag + +! Possible error returns (info%flag): +! -1 Allocation error +! -3 Error in sequence of calls to routines in package. Immediate return. +! -5 Error from of01_write (error in Fortran inquire) +! -7 Error from of01_write (error in Fortran open) +! -9 MA77_input_vars has already been called for this element/row. +! -15 Error from of01_write (error in Fortran write) +! -31 All entries in element/row are out-of-range +! -33 nvar < 0. No action taken. + + if (keep%n == 0) return +! Perform appropriate printing + if (control%print_level >= 2 .and. control%unit_diagnostics >= 0) then + write (control%unit_diagnostics,'(/a,2(/a,i12))') & + ' Entering MA77_input_vars with:', & + ' index Index of element/row = ',index, & + ' nvar Number of variables = ', nvar + i = min(nvar,10) + write (control%unit_diagnostics,'(a,2(/5i12))') & + ' Input index list: ',list(1:i) + if (i < nvar) write (control%unit_diagnostics,'(a)') ' . . . . . .' + end if + + nout = control%unit_error + if (control%print_level < 0) nout = -1 + nout1 = control%unit_warning + if (control%print_level < 0) nout1 = -1 + + info%flag = keep%flag + keep%name = 'MA77_input_vars' + + if (keep%status /= 1) then + info%flag = -3 + call MA77_print_iflag(keep,nout,info%flag,ie=index) + if (keep%status == 0) then +! MA77_open was not called + keep%status = -2 + else + keep%status = -1 + end if + return +! Check input data + else if (index < 1 .or. index > keep%nelt) then + return + else if (nvar < 0) then + info%flag = -33; keep%status = -1 + call MA77_print_iflag(keep,nout,info%flag,ie=index) + return + else if (keep%size(index) /= 0) then + info%flag = -9; keep%status = -1 + call MA77_print_iflag(keep,nout,info%flag,ie=index) + return + end if + +! Treat the special case nvar = 0 (nothing to do) + if (nvar == 0) then + keep%size(index) = 0 + keep%ifile(index) = keep%ifree + keep%rfile(index) = -1 + return + end if + + keep%mvar = max(keep%mvar,nvar) + + st = 0 + if (.not. allocated(keep%clist)) then + allocate (keep%clist(keep%mvar+1),keep%map(0:keep%mvar),stat=st) + else if (keep%mvar+1 > size(keep%clist)) then + deallocate (keep%clist,stat=st) + deallocate (keep%map,stat=st) + allocate (keep%clist(keep%mvar+1),keep%map(0:keep%mvar),stat=st) + end if + if (st /= 0) then + info%stat = st + info%flag = -1; keep%status = -1 + if (nout >= 0) & + call MA77_print_iflag(keep,nout,info%flag,ie=index,st=info%stat) + deallocate (keep%clist,keep%map,stat=st) + return + end if + keep%clist(1:nvar) = list(1:nvar) + + n1 = 0; n2 = 0 +! Loop over variables in current element/row, checking for out of +! range entries and/or duplicates (both of which result in a warning). +! Use the sign of keep%svar to flag whether a variable has appeared +! in the current element/row. + l = 0 + ldiag = 1 + do i = 1, nvar + jvar = keep%clist(i) + if (jvar < 1 .or. jvar > keep%n) then +! Out of range + keep%map(i) = 0 + n1 = n1 + 1 + if (control%print_level > 1 .and. nout1 >= 0 & + .and. keep%matrix_outrange+n1 <= 10) & + write (nout1,'(a,i8,a,i5,a,i8)') & + ' Warning: In element/row ', index, ' Entry ', i,& + ' in list has value ',jvar + if (info%flag == 0 .or. info%flag == 2) then + info%flag = info%flag + 1 + call MA77_print_iflag(keep,nout1,info%flag,ie=index) + end if + else if (keep%svar(jvar) > 0) then + keep%svar(jvar) = -keep%svar(jvar) + l = l + 1 + keep%clist(l) = jvar + keep%map(i) = l + else +! We have a duplicate + n2 = n2 + 1 + if (info%flag == 0 .or. info%flag == 1) then + info%flag = info%flag + 2 + call MA77_print_iflag(keep,nout1,info%flag,ie=index) + end if + do k = 1,l + if (jvar == keep%clist(k)) exit + end do + keep%map(i) = k + if (control%print_level > 1 .and. nout1 >= 0 & + .and. keep%matrix_dup+n2 <= 10) then + write (nout1,'(a,i8/a,i8,a,i8,a,i8)') & + ' Warning: In element/row ', index, ' Variable ', jvar,& + ' is repeated in positions ',i,' and ',k + end if + end if + if (index == jvar) ldiag = 0 + end do + if (keep%element_input) then + ldiag = 0 + else if (ldiag == 1) then +! have to add diagonal to list (row entry only) + keep%clist(l+1) = index + keep%svar(index) = -keep%svar(index) + end if +! write (6,*) 'index,ldiag,clist',index,ldiag,keep%clist(1:l+ldiag) + +! The number of variables in compressed list is now l + nnvar = l + keep%size(index) = nnvar +! use a negative sign to indicate out-of-range/duplicates have been found + if (n1 > 0 .or. n2 > 0) then + keep%size(index) = -nnvar +! Update the count of duplicates and out-of-range entries and issue warning + keep%matrix_outrange = keep%matrix_outrange + n1 + keep%matrix_dup = keep%matrix_dup + n2 +! Error if ALL entries out-of-range + if (n1 == nvar) then + info%flag = -31; keep%status = -1 + if (nout >= 0) & + call MA77_print_iflag(keep,nout,info%flag,ie=index) + deallocate (keep%clist,keep%map,stat=st) + return + end if + end if + +! Loop over variables in compressed list, decrementing the counts of variables +! in supervariables and restoring signs of keep%svar + do i = 1, nnvar+ldiag + jvar = keep%clist(i) + is = -keep%svar(jvar) + keep%svar(jvar) = is +! write (6,*) 'i,jvar,is,vars',i,jvar,is,keep%vars(is) + keep%vars(is) = keep%vars(is) - 1 + end do + +! Loop over variables, incrementing the count and resetting keep%vars. + nsup = keep%nsup + do i = 1, nnvar+ldiag + jvar = keep%clist(i) + is = keep%svar(jvar) +! write (6,*) 'i,jvar,is,varflag,vars',& +! i,jvar,is,keep%varflag(is),keep%vars(is) + if (keep%varflag(is) /= index) then +! First occurrence of supervariable is for current element/row + keep%varflag(is) = index + if (keep%vars(is) > 0 .or. is == 1) then +! Establish new supervariable + nsup = nsup + 1 + keep%vars(nsup) = 1 + keep%varflag(nsup) = index +! new(is) is the new supervariable constructed from +! variables of supervariable is. + keep%new(is) = nsup + keep%svar(jvar) = nsup + else +! No new supervariable needed + keep%vars(is) = 1 + keep%new(is) = is + end if + else +! Subsequent occurrence of supervariable is for current element/row + js = keep%new(is) + keep%vars(js) = keep%vars(js) + 1 + keep%svar(jvar) = js + end if + end do + keep%nsup = nsup +! write (6,*) 'svar',keep%svar(1:keep%n) + +! Store compressed variable list in main integer superfile + loc = keep%ifree +! write (6,*) ' Stored list: ',keep%clist(1:nnvar) + call MA77_write_integer(keep%index(1),keep%size_imain,keep%imain, & + loc,nnvar,keep%clist,flag,keep%idata,-1,keep%maxstore,keep%used) + + if (flag < 0) then + info%iostat = keep%idata%iostat + info%flag = flag; keep%status = -1 + if (nout >= 0) & + call MA77_print_iflag(keep,nout,info%flag,ie=index,ios=info%iostat) + deallocate (keep%clist,keep%map,stat=st) + return + end if + + if (n1 > 0 .or. n2 > 0) then +! If duplicates/out-of-range, also store nvar plus the mapping from the +! user list into the compressed list + keep%map(0) = nvar + loc = keep%ifree + nnvar +! write (6,*) 'nvar,map',keep%map(0:nvar) + call MA77_write_integer(keep%index(1),keep%size_imain,keep%imain, & + loc,nvar+1,keep%map(0:nvar),flag,keep%idata,-1, & + keep%maxstore,keep%used) + + if (flag < 0) then + info%iostat = keep%idata%iostat + info%flag = flag; keep%status = -1 + if (nout >= 0) & + call MA77_print_iflag(keep,nout,info%flag,ie=index,ios=info%iostat) + deallocate (keep%clist,keep%map,stat=st) + return + end if + if (keep%element_input) then + st = 0 + if (.not. allocated(keep%iptr)) then + allocate (keep%iptr(keep%mvar),stat=st) + else if (keep%mvar > size(keep%iptr)) then + deallocate (keep%iptr,stat=st) + allocate (keep%iptr(keep%mvar),stat=st) + end if + if (st /= 0) then + info%stat = st + info%flag = -1; keep%status = -1 + if (nout >= 0) & + call MA77_print_iflag(keep,nout,info%flag,ie=index,st=info%stat) + deallocate (keep%clist,keep%map,keep%iptr,stat=st) + return + end if + end if + end if + +! Store position of element/row variable list in the integer superfile +! and set flag to indicate reals not yet stored. + keep%ifile(index) = keep%ifree + keep%rfile(index) = -1 + +! Move pointer for next free location in the integer superfile + keep%ifree = keep%ifree + nnvar + if (n1 > 0 .or. n2 > 0) keep%ifree = keep%ifree + nvar + 1 + keep%mmvar = max(keep%mmvar,nnvar) +! In row case, we will allow extra space (in case the diagonal +! has not been included by user as will have to be added in +! when constructing the tree). + if (.not. keep%element_input) keep%mmvar = max(keep%mmvar,nnvar+1) + + info%unused = keep%vars(1) + info%nsup = keep%nsup + keep%ltree = min(keep%nsup,2*keep%nelt) + + info%matrix_dup = keep%matrix_dup + info%matrix_outrange = keep%matrix_outrange + + keep%flag = info%flag + + if (control%print_level >= 2 .and. control%unit_diagnostics >= 0) then + write (control%unit_diagnostics,'(/a,3(/a,i12))') & + ' Leaving MA77_input_vars with:', & + ' Error flag info%flag = ', info%flag, & + ' Number of duplicated indices info%matrix_dup = ', & + info%matrix_dup, & + ' Number of out-of-range indices info%matrix_outrange = ', & + info%matrix_outrange + i = min(nnvar,10) + write (control%unit_diagnostics,'(a,2(/5i12))') & + ' Stored index list: ',keep%clist(1:i) + if (i < nnvar) write (control%unit_diagnostics,'(a)') ' . . . . . .' + end if + + end subroutine MA77_input_vars_double + +!**************************************************************************** + + subroutine MA77_analyse_double(order,keep,control,info) + +! Analyse phase. +! The user inputs the pivot order and, using the information +! collected on the calls to MA77_input_vars, the assembly tree is constructed. + +! For details of keep, control, info : see derived type descriptions + type (MA77_keep), intent (inout) :: keep + integer(short), intent (inout), dimension(keep%n) :: order +! If i is used to index a variable, |order(i)| must +! hold its position in the pivot sequence. If a 1x1 pivot i is required, +! the user must set order(i)>0. If a 2x2 pivot involving variables +! i and j is required, the user must set +! order(i)<0, order(j)<0 and |order(j)| = |order(i)|+1. +! If i is not used to index a variable, +! order(i) may have any value and this is replaced by zero. +! On exit, holds the pivot order to be used by MA77_factor. + type (MA77_control), intent (in) :: control + type (MA77_info), intent (inout) :: info + +! Local arrays + integer(short), allocatable :: count(:) ! used for depth +! first search of tree to keep track of level we are at + integer(short), allocatable :: cnode(:) ! used for depth +! first search of tree + integer(short), allocatable :: first(:) +! first(is) is the first element associated with supervariable is. + integer(short), allocatable :: child(:) +! List of children of a node in the tree. Copied to tree(ie)%child + integer(short), allocatable :: iwork(:) +! Work array used when sorting. + integer(short), allocatable :: next(:) +! If ie in use, next(ie) is the next element associated with the +! same supervariable as element ie or next root if a root. +! If ie not in use, next(ie) is next node in a list of tree nodes +! starting from the node with name free or -1 for the final node. + integer(short), allocatable :: perm(:) +! perm(i) holds the variable that is i-th in the pivot sequence. +! Also used for checking user-supplied permutation. + integer(short), allocatable :: varlist(:) +! List of variables, as read using of01_read. + integer(short), allocatable :: wlist(:) +! Work array used when sorting. + integer(short), allocatable :: index(:) ! used in ordering nodes + integer(short), allocatable :: list(:) +! Array for holding lists when constructing nodes in the tree. +! This list is written to main integer superfile. Length n+1. + integer(short), allocatable :: nels(:) +! nels(i) is the number of elements/rows involving variable i. + integer(long), allocatable :: child_size(:) +! child_size(ic) is set to the size of the contribution +! block for child ic. + integer(long), allocatable :: m0(:), m1(:) +! allocated to have length (mx_nchild+1) and used in computing +! memory needed if the assembly is done after the jth child. + integer(long), allocatable :: mem(:),child_mem(:) + +! Local scalars. + integer(short) :: cblock ! no. of variables in contribution +! block for cnode + integer(short) :: ccnode ! child node + integer(short) :: depth ! used to compute depth of tree + integer(short) :: first_free ! first free node + integer(short) :: first_root ! First root node + integer(short) :: flag ! local error flag + integer(short) :: i ! temporary variable + integer(short) :: ie ! new generated element + integer(short) :: ielt ! an element + integer(long) :: ifree ! first free location in integer superfile + integer(short) :: ifs ! position in list of first non fully + ! summed variable + integer(short) :: ii ! temporary variable + integer(short) :: iswap + integer(short) :: ir ! do loop variable + integer(short) :: is ! supervariable that ivar belongs to + integer(short) :: ivar ! variable to be eliminated + integer(short) :: j ! temporary variable + integer(short) :: jcnode ! child node + integer(short) :: jj ! temporary variable + integer(short) :: jdum ! do loop variable + integer(short) :: jelt ! an element + integer(short) :: jvar ! a variable in an element variable list + integer(short) :: jjvar ! a variable + integer(short) :: js ! supervariable + integer(short) :: k ! temporary variable + integer(short) :: ks ! supervariable + integer(short) :: k1 ! temporary variable + integer(short) :: kk ! temporary variable + integer(short) :: kpiv ! number of variables that have been ordered so far + ! (incremented within elim_order) + integer(short) :: kvar ! a variable that is the pair of ivar in 2x2 pivot + integer(short) :: l ! temporary variable + integer(short) :: llist ! length of array list (=n+1) + integer(long) :: lnj ! used to compute flop count + integer(long) :: loc ! position in integer superfile +! integer(long) :: mem ! memory needed for the subtree rooted at root + integer(short) :: mx_nchild ! largest number of children a node has + integer(short) :: n ! order of linear system + integer(short) :: nc ! number of children of a node + integer(short) :: nchild ! number of children of a node ie + integer(short) :: nelim ! number of variables eliminated at a node + integer(short) :: nelim_i ! no. of variables eliminated at node ielt + integer(short) :: nelt ! copy of keep%nelt + ! (tree(ielt)%nelim) + integer(short) :: nemin ! min. number of eliminations (control%nemin) + integer(short) :: nfs ! the number of non fully summed variables at a node + integer(short) :: node ! node in tree + integer(short) :: nout ! unit for error messages + integer(short) :: nroot ! no. of roots (ie no. of components) + integer(long) :: nschur ! used to compute entries in factor + integer(short) :: pnode ! parent node in tree + integer(short) :: nvar ! number of variables in element ielt + integer(short) :: root ! a root of tree + integer(short) :: st ! stat parameter + logical :: belong ! + +! Possible error returns: +! -1 Allocation error +! -3 Error in sequence of calls to routines in package +! -5 Error from of01_read (error in Fortran inquire) +! -6 Error from of01_read (error in Fortran read) +! -7 Error from of01_read (error in Fortran open) +! -16 Error -17 returned from of01_read +! -21 Error in order. Immediate return. + + if (keep%n == 0) then + keep%status = 2; return + end if + +! Perform appropriate printing + if (control%print_level >= 1 .and. control%unit_diagnostics >= 0) then + write (control%unit_diagnostics,'(//a)') & + ' Entering MA77_analyse with:' + write (control%unit_diagnostics,'(a,5(/a,i12))') & + ' control parameters (control%) :', & + ' print_level Level of diagnostic printing = ', & + control%print_level, & + ' unit_diagnostics Unit for diagnostics = ', & + control%unit_diagnostics, & + ' unit_error Unit for errors = ', & + control%unit_error, & + ' unit_warning Unit for warnings = ', & + control%unit_warning, & + ' nemin Node amalgamation parameter = ', & + control%nemin + if (control%print_level >= 2) then +! Print out pivot order. + i = min(10,keep%n) + write (control%unit_diagnostics,'(a,2(/5i12))') & + ' User-supplied elimination order :', order(1:i) + if (i < keep%n) write (control%unit_diagnostics,'(a)') ' . . . . . .' + end if + end if + + nout = control%unit_error + if (control%print_level < 0) nout = -1 + + info%flag = keep%flag + keep%name = 'MA77_analyse' + ifree = keep%ifree + info%nfactor = 0_long + info%nflops = 0_long + info%ntwo = 0 + keep%ntwo = 0 + keep%maxelim = 0 + + info%nio_read(1) = keep%idata%nio_read + info%nio_read(2) = keep%rdata%nio_read + info%nio_write(1) = keep%idata%nio_write + info%nio_write(2) = keep%rdata%nio_write + info%nwd_read(1) = keep%idata%nwd_read + info%nwd_read(2) = keep%rdata%nwd_read + info%nwd_write(1) = keep%idata%nwd_write + info%nwd_write(2) = keep%rdata%nwd_write + +! Deallocate arrays used by MA77_input_vars that are no longer needed + deallocate (keep%new,stat=st) + deallocate (keep%vars,stat=st) + deallocate (keep%map,stat=st) + +! Check status parameter (remember that input of integer and real +! data can be interleaved) + if (keep%status /= 1) then + info%flag = -3 + call error_anal; go to 500 + end if + + n = keep%n + nemin = control%nemin +! Check nemin (a node is merged with its parent if both involve +! fewer than nemin eliminations). If out of range, use the default + if (nemin < 1) nemin = nemin_default + +! Check the user-supplied array order and set the inverse in perm. +! Also add up number of variables that are not used (null rows) + deallocate (perm,stat=st) + allocate (perm(n),stat=st) + if (st /= 0) go to 490 + perm(:) = 0 + k1 = 0 + keep%null = 0 + do i = 1, n + if (keep%svar(i) == 1) then +! Variable i is not used + order(i) = 0 + keep%null = keep%null + 1 + else + j = order(i) + jj = abs(j) + if (jj < 1 .or. jj > n) exit + if (perm(jj) /= 0) exit ! Duplicate found + if (j > 0) then + perm(jj) = i + else + k1 = k1 + 1 + perm(jj) = -i + end if + end if + end do + if (i-1 /= n) then + info%flag = -21 + call error_anal; go to 500 + end if + +! If 2x2 pivots entered, check that pairs are adjacent in perm (error if not) +! and set the second entry in the pair to have positive flag + if (k1 > 0) then + l = 1 + do + if (l > n) exit + k = perm(l) + if (k < 0) then + kk = perm(l+1) + if (kk >= 0) then +! 2x2 pivot not adjacent + info%flag = -21 + call error_anal; go to 500 + end if + keep%ntwo = keep%ntwo + 1 + perm(l+1) = -kk ! (so the second in the pair is positive) + l = l + 2 + else + l = l + 1 + end if + end do + end if +! write (6,*) 'order',order(1:n) +! write (6,*) 'perm ',perm(1:n) + + keep%l1 = keep%nelt + 1 + keep%l2 = keep%nelt + keep%ltree + +! Set up space for the tree (no space needed for the leaf nodes) + deallocate (keep%tree,stat=st) + allocate (keep%tree(keep%l1:keep%l2),stat=st) + if (st /= 0) go to 490 + +! Allocate varlist (for holding lists of variables) + allocate (varlist(keep%mmvar),stat=st) + if (st /= 0) go to 490 +! Allocate nels to hold number of elements containing each variable. Initialise + allocate (nels(n),stat=st) + if (st /= 0) go to 490 + nels(:) = 0 + +! Set up an empty list of unused nodes and root nodes (links are in next(:)) + first_free = -1 + first_root = -1 + nroot = 0 + keep%tnode = keep%nelt + keep%maxlen = keep%mmvar + keep%mx_ifree = 0_long + +! Allocate arrays first and next for holding linked lists of elements +! (link according to the supervariable +! in its list that appears first in the pivot sequence + deallocate (first,stat=st) + deallocate (next,stat=st) + allocate (first(keep%nsup),next(keep%l2),stat=st) + if (st /= 0) go to 490 + first(:) = 0 + +! keep%varflag has already been allocated by ma77_open. initialise. + keep%varflag(1:n) = 0 + +! The array child will hold a temporary list of the children +! of the node under construction. + llist = n + 1 ! extra space means always one space between variables + ! that are fully summed and those that are not + allocate (child(1),list(llist),stat=st) + if (st /= 0) go to 490 + +! Call internal subroutine to construct the tree + if (keep%ntwo == 0) then +! no 2x2 pivots + call construct_tree1 + else + call construct_tree2 + end if + if (st /= 0) go to 490 + if (info%flag < 0) then + call error_anal; go to 500 + end if + +! Store first free location in main integer superfile where we can write +! lists of integers (will only need to write integer lists in indef. case) + keep%posint = keep%ifree + +! Deallocate arrays we are done with. + deallocate (child,stat=st) + deallocate (list,stat=st) + deallocate (first,stat=st) + deallocate (keep%varflag,stat=st) + +! Store the roots that were found during the tree construction + deallocate (keep%roots,stat=st) + allocate (keep%roots(nroot),stat=st) + if (st /= 0) go to 490 + i = first_root + j = 0 + do + if (i <= 0) exit + j = j + 1 + keep%roots(j) = i + i = next(i) + end do + deallocate (next,stat=st) + +!************************************** +! Find the split point for each non-leaf node in the tree + deallocate (keep%splitp,stat=st) + deallocate (iwork,stat=st) + deallocate (child_size,stat=st) + deallocate (m0,stat=st) + deallocate (m1,stat=st) + deallocate (index,stat=st) + deallocate (mem,stat=st) + deallocate (child_mem,stat=st) + + nelt = keep%nelt + allocate (keep%splitp(nelt+1:keep%tnode),child_size(1:mx_nchild),& + m0(0:mx_nchild),m1(0:mx_nchild),mem(nelt+1:keep%tnode), & + child_mem(1:mx_nchild),index(1:mx_nchild),iwork(1:mx_nchild),stat=st) + if (st /= 0) goto 490 + + keep%splitp(nelt+1:keep%tnode) = 0 + mem = 0 + +! First have to ensure, for each node, the list of children is +! organised so that any children that are leaf nodes are at the +! end of the list. Loop over non-leaf nodes. +! In this loop, we also compute info%nfactor and info%nflops + do node = nelt+1,keep%tnode + if (.not. allocated(keep%tree(node)%child) ) cycle + + nvar = abs(keep%size(node)) + nelim = keep%tree(node)%nelim + + nschur = nvar - nelim + nschur = nvar + nschur + 1_long + lnj = nelim + info%nfactor = info%nfactor + (lnj*nschur)/2_long + do j = 0,nelim-1 + lnj = nvar - j + info%nflops = info%nflops + lnj*lnj + end do + + nchild = size(keep%tree(node)%child) + +! Loop through the children to find the number of non-leaf children +! and swap them to be ahead of leaf children. + nc = 0 + k1 = nchild +out: do j = 1, nchild + jcnode = keep%tree(node)%child(j) + if (jcnode <= nelt) then +! Leaf node. Look for swap + do k = k1,j+1,-1 + ccnode = keep%tree(node)%child(k) + if (ccnode > nelt) then +! non-leaf so swap with jcnode + nc = nc + 1 + keep%tree(node)%child(j) = ccnode + keep%tree(node)%child(k) = jcnode + k1 = k - 1 + cycle out + end if + end do +! no swap available so rest of children are leaf nodes + exit out + else + nc = nc + 1 + end if + end do out + + end do + +! Allocate arrays for depth first search of tree + deallocate (count,stat=st) + deallocate (cnode,stat=st) + allocate (count(0:keep%tnode),cnode(0:keep%tnode),stat=st) + if (st /= 0) goto 490 + + do ir = 1, nroot + root = keep%roots(ir) + node = root + depth = 1 + count(depth) = 0 ! no. of visited children +! Visit each node in depth-first search order + do while(depth.gt.0) + cnode(depth) = node +! Visit children + nchild = size(keep%tree(node)%child) + if (count(depth) < nchild) then + count(depth) = count(depth) + 1 + if (keep%tree(node)%child(count(depth)) > keep%nelt) then +! The next child of node is not a leaf node so descend to it + node = keep%tree(node)%child(count(depth)) + depth = depth + 1 + info%maxdepth = max(depth,info%maxdepth) + count(depth) = 0 + cycle + else + info%maxdepth = max(depth+1,info%maxdepth) + end if + end if + +! Perform work at node. + call order_child(node) + if (info%flag < 0) exit +! If we have reached the root, we are done + if (node == root) exit + +! Go to parent + depth = depth - 1 + pnode = cnode(depth) + node = pnode + + end do ! tree + + if (info%flag < 0) then + call error_anal; go to 500 + end if + end do + keep%maxdepth = max(1,info%maxdepth) + +! do ir = 1, nroot +! root = keep%roots(ir) +! if (control%print_level == 2) then +! j = 1; call write_tree(root,0) +! end if +! end do + +! deallocate arrays we have finished with. + deallocate (iwork,stat=st) + deallocate (child_size,stat=st) + deallocate (m0,stat=st) + deallocate (m1,stat=st) + deallocate (index,stat=st) + deallocate (mem,stat=st) + deallocate (child_mem,stat=st) + +!************************************** + +! For each variable i, set order(i) to hold the position +! that i is eliminated at. + if (size(varlist) < keep%maxlen) then + deallocate (varlist,stat=st) + allocate (varlist(1:keep%maxlen),stat=st) + if (st /= 0) go to 490 + end if + + kpiv = 0 + do ir = 1, nroot + root = keep%roots(ir) + node = root + depth = 1 + count(depth) = 0 ! no. of visited children +! Visit each node in depth-first search order + do while(depth.gt.0) + cnode(depth) = node +! Visit children + nchild = size(keep%tree(node)%child) + if (count(depth) < nchild) then + count(depth) = count(depth) + 1 + if (keep%tree(node)%child(count(depth)) > keep%nelt) then +! The next child of node is not a leaf node so descend to it + node = keep%tree(node)%child(count(depth)) + depth = depth + 1 + count(depth) = 0 + cycle + end if + end if + +! Perform work at node. + call elim_order(order,keep%tree,node,kpiv) + if (info%flag < 0) exit +! If we have reached the root, we are done + if (node == root) exit + +! Go to parent + depth = depth - 1 + pnode = cnode(depth) + node = pnode + + end do ! tree + if (info%flag < 0) then + call error_anal; go to 500 + end if + end do +! write (6,*) 'after ', order(1:n) + + +! We now rewrite the index lists for non-leaf nodes in elimination order + allocate (iwork(keep%maxlen),stat=st) + if (st /= 0) go to 490 + deallocate (wlist,stat=st) + allocate (wlist(keep%maxlen),stat=st) + if (st /= 0) go to 490 + + do 270 ielt = nelt+1, keep%tnode + nvar = keep%size(ielt) + if (nvar <= 0) cycle +! Cycle if nothing needs sorting + nelim = keep%tree(ielt)%nelim + nvar = nvar - nelim + if (nvar <= 1) cycle +! Read from the main integer superfile the variables that are not eliminated. + loc = keep%ifile(ielt) + nelim + call MA77_read_integer(keep%index(1),keep%imain, & + loc,nvar,varlist,flag,keep%idata,-1) + if (flag < 0) then + info%flag = flag + call error_anal; go to 500 + end if +! Sort variables into ascending order according to when they are eliminated. + do i = 1, nvar + jvar = abs(varlist(i)) + k = abs(order(jvar)) + iwork(i) = k + end do + + call kb07ai(iwork,nvar,wlist) + +! Entries of varlist now have to be ordered in the same way. + do i = 1, nvar + j = wlist(i) + iwork(i) = varlist(j) + end do +! Overwrite the original variable list with the permuted list + call MA77_write_integer(keep%index(1),keep%size_imain,keep%imain, & + loc,nvar,iwork,flag,keep%idata,-1,keep%maxstore,keep%used) + if (flag < 0) then + info%flag = flag + call error_anal; go to 500 + end if + +270 continue + +! Set keep%status to 2 to indicate successful analyse is complete + keep%status = 2 + info%index(1:4) = keep%index(1:4) + info%maxfront = keep%maxfront + + info%nio_read(1) = keep%idata%nio_read - info%nio_read(1) + info%nio_read(2) = keep%rdata%nio_read - info%nio_read(2) + info%nio_write(1) = keep%idata%nio_write - info%nio_write(1) + info%nio_write(2) = keep%rdata%nio_write - info%nio_write(2) + info%nwd_read(1) = keep%idata%nwd_read - info%nwd_read(1) + info%nwd_read(2) = keep%rdata%nwd_read - info%nwd_read(2) + info%nwd_write(1) = keep%idata%nwd_write - info%nwd_write(1) + info%nwd_write(2) = keep%rdata%nwd_write - info%nwd_write(2) + + if (control%print_level >= 1 .and. control%unit_diagnostics >= 0) then + write (control%unit_diagnostics,'(/a)') & + ' Leaving MA77_analyse with:' + write (control%unit_diagnostics, & + '(a,6(/a,i12),2(/a,es12.4),4(/a,es12.4))') & + ' information parameters (info%) :', & + ' flag Error flag = ', & + info%flag, & + ' maxfront Forecast maximum frontsize = ', & + info%maxfront, & + ' ntwo Number of 2x2 pivots supplied by user = ', & + info%ntwo, & + ' nsup Number of supervariables = ', & + info%nsup, & + ' tree_nodes Number of non-leaf nodes in tree = ', & + info%tree_nodes, & + ' maxdepth Maximum depth of the tree = ', & + info%maxdepth, & + ' nfactor Forecast number of entries in L = ', & + real(info%nfactor), & + ' nflops Forecast number of flops = ', & + real(info%nflops), & + ' nio_read(1) No. integer records read from disk by OF01_read = ',& + real(info%nio_read(1)), & + ' nio_write(1) No. integer records written to disk by OF01_write = ',& + real(info%nio_write(1)), & + ' nwd_read(1) No. integer scalars read by OF01_read = ', & + real(info%nwd_read(1)), & + ' nwd_write(1) No. integer scalars written by OF01_write = ', & + real(info%nwd_write(1)) + + end if + go to 500 + +490 info%flag = -1 + call error_anal + +500 continue + deallocate (count,stat=st) + deallocate (cnode,stat=st) + deallocate (child,stat=st) + deallocate (child_size,stat=st) + deallocate (first,stat=st) + deallocate (index,stat=st) + deallocate (iwork,stat=st) + deallocate (list,stat=st) + deallocate (nels,stat=st) + deallocate (m0,stat=st) + deallocate (m1,stat=st) + deallocate (mem,stat=st) + deallocate (child_mem,stat=st) + deallocate (perm,stat=st) + deallocate (varlist,stat=st) + deallocate (wlist,stat=st) + deallocate (keep%varflag,stat=st) + + contains +!********************************************** + recursive subroutine write_tree(node,pnode) + integer(short) :: node,pnode +!!! Write subtree rooted at root whose parent is pnode +!!! The depth is held in j + integer(short) :: cnode ! child of node + integer(short) :: i ! do index + integer(short) :: nc ! number of children +!! + nvar = abs(keep%size(node)) + if (j<=5) & + write(*,'((a,i6,a,i2,a,i6,a,i4,a,i4))')& + 'node',node,' depth=',j,' parent=',& + pnode,' nvar=',nvar,' nelim=',keep%tree(node)%nelim + loc = keep%ifile(node) + call MA77_read_integer(keep%index(1),keep%imain,& + loc,nvar,varlist,flag,keep%idata,-1) + write(*,*)' list:',varlist(1:nvar) + if (.not.allocated(keep%tree(node)%child))return +!! +!!! Loop over children of node. + nc = size(keep%tree(node)%child) + j = j + 1 + do i = 1, nc + cnode = keep%tree(node)%child(i) + if (cnode > nelt) then + call write_tree(cnode,node) + end if + end do + j = j - 1 +!! nvar = abs(keep%size(ielt)) + end subroutine write_tree +!********************************************** + + subroutine error_anal +! Perform actions after an error detected + info%iostat = keep%idata%iostat + info%stat = st + call MA77_print_iflag(keep,nout,info%flag,st=info%stat,ios=info%iostat) + + if (info%flag == -21) then +! reset keep%ifree (so that it is possible to recall MA77_analyse) + keep%ifree = ifree + else + keep%status = -1 + end if + end subroutine error_anal +!********************************************** + + subroutine read_varlist(length) +! Read a list of variables from the main integer superfile + integer(short) :: length ! length of list to be read + if (size(varlist) < length) then + deallocate (varlist,stat=st) + allocate (varlist(1:length),stat=st) + if (st /= 0) then + info%flag = -1 + return + end if + end if + call MA77_read_integer(keep%index(1),keep%imain,loc,length,varlist, & + flag,keep%idata,-1) + if (flag < 0) info%flag = flag + end subroutine read_varlist +!********************************************** + + subroutine reallocate_child(k) + integer(short),intent(in) :: k +! Reallocate the array child from size nchild to size nchild+nc-1 + if (.not. allocated(iwork)) then + allocate (iwork(1:nchild),stat=st) + else if (size(iwork) < nchild) then + deallocate (iwork,stat=st) + allocate (iwork(1:nchild),stat=st) + end if + if (st /= 0) then + info%flag = -1 + call error_anal; return + end if + iwork(1:nchild) = child(1:nchild) + + deallocate (child,stat=st) + allocate (child(1:k),stat=st) + if (st /= 0) then + info%flag = -1 + call error_anal; return + end if +! Reset children of ie + child(1:nchild) = iwork(1:nchild) + + end subroutine reallocate_child +!********************************************** + + subroutine elim_order(order,tree,node,kpiv) + +! This subroutine sets the elimination order at node + integer(short), intent (inout), dimension(keep%n) :: order + type (MA77_node), intent (in) :: tree(keep%l1:keep%l2) + integer(short), intent (in) :: node + integer(short), intent (inout) :: kpiv + + integer(short) :: flag ! error flag + integer(short) :: i ! do loop index + integer(short) :: j ! + integer(short) :: l ! + +! Immediate return for leaf nodes + if (node <= nelt) return + +! Read in list of variables eliminated at node + loc = keep%ifile(node) + nelim = tree(node)%nelim +! write (6,*) 'node,kpiv,nelim',node,kpiv,nelim + call MA77_read_integer(keep%index(1),keep%imain,loc,nelim,varlist, & + flag,keep%idata,-1) + if (flag < 0) then + info%flag = flag; return + end if +! kpiv is the number of variables that have been ordered so far +! (it was initialised to zero before first call to elim_order) + if (info%ntwo == 0) then + do i = 1, nelim + kpiv = kpiv + 1 + j = varlist(i) + order(j) = kpiv + end do + else + l = 1 + do i = 1, nelim + if (l > nelim) exit + kpiv = kpiv + 1 + j = varlist(l) + if (j > 0) then + order(j) = kpiv + l = l + 1 + else +! j is first entry in 2x2 pivot .... flag both entries in order with negative +! sign (this gives the same form as was supplied by the user) + order(-j) = -kpiv + kpiv = kpiv + 1 + j = varlist(l+1) + !! varlist(l+1) = -j ! set both entries in pivot with negative flag + order(j) = -kpiv + l = l + 2 + end if + end do + + call MA77_write_integer(keep%index(1),keep%size_imain,keep%imain,loc,& + nelim,varlist,flag,keep%idata,-1,keep%maxstore,keep%used) + if (flag < 0) then + info%flag = flag; return + end if + + end if + + end subroutine elim_order + +!********************************************** + + subroutine order_child(node) +! This subroutine computes the memory needed for the subtree +! rooted at node and finds the split point for processing its +! children (placed in keep%splitp) + use hsl_kb22_long_integer ! heapsort + integer(short), intent (in) :: node + + integer(short) :: cnode ! child node + integer(short) :: ic + integer(short) :: nc ! number of non-leaf children of node + integer(short) :: lc ! last non-leaf candidate + integer(short) :: inform ! error flag for kb22 + integer(short) :: nchild ! number of children of node + integer(short) :: nvar ! no. of variables in node + integer(short) :: p ! best split point + integer(long) :: memory ! total memory + integer(long) :: minmem ! min. memory + integer(short) :: store + + if (node <= nelt) return + + nvar = abs(keep%size(node)) + nelim = keep%tree(node)%nelim + + nchild = size(keep%tree(node)%child) +! Deal with the trivial case (only occurs in row entry case) ... must +! ensure splitp is set in case restart is used +! (in which case, keep%splitp(:) is written out so must be defined) + if (nchild == 0) then + keep%splitp(node) = 1 + return + end if + + nc = nchild +! In element case, add up the number of children of node that are leaf nodes +! .... they are the last children (in row case, leaf nodes are original +! rows and they are not part of the tree) + if (keep%element_input) then + if (nchild == 0) return + do i = 1,nchild + cnode = keep%tree(node)%child(i) + if (cnode <= keep%nelt) exit + end do + nc = i - 1 + end if + +! No ordering needed if all children are leaf nodes + if (nc < 1) then + keep%splitp(node) = nchild + return + end if + + if (nc == 1) then + keep%splitp(node) = 1 + cnode = keep%tree(node)%child(1) + mem(node) = mem(cnode) + return + end if + +! Order the non-leaf children in decreasing order of memory needed. + do ic = 1, nc + index(ic) = ic + cnode = keep%tree(node)%child(ic) + child_mem(ic) = mem(cnode) +! take copy of child_mem (since we do not want child_mem to be reordered) + child_size(ic) = child_mem(ic) + end do +! Form heap (need kb22 because it works with long integers). + call kb22_build_heap(nc,child_size,inform,index) + do ic = nc, 1, -1 +! Find smallest entry in current heap and put it at end of the list. + call kb22_get_smallest(ic,child_size,inform,index) + end do + +! Set child_size(ic) to hold storage for the contribution block for child ic. + do ic = 1, nc + cnode = keep%tree(node)%child(ic) +! cblock holds no. of variables in the contribution block. + cblock = abs(keep%size(cnode)) - keep%tree(cnode)%nelim + child_size(ic) = (cblock*cblock+cblock)/2 + end do + +! Find the best split point p (that is, the point at which +! the parent node is to be allocated and assembly done so that min. +! memory is needed). This idea is taken from +! Guermouche and L'Excellent, TOMS 32, 17-32, 2006. +! Loop over the children of node in order of decreasing memory. +! memory is the total memory needed if assembly done after jth child + store = (nvar*nvar+nvar)/2 + m0(0) = 0 + m1(0) = 0 + minmem = huge(1_long) + lc = control%p + if (lc > 2) lc = nc + do j = 1, lc +! Place child j in right position + jj = index(j) + do i = j - 1, 1, -1 + ii = index(i) +! write (6,*) i,ii,child_mem(ii) - child_size(ii), & +! child_mem(jj) - child_size(jj) +! exit loop if no further swapping needed. + if (child_mem(ii)-child_size(ii) >= & + child_mem(jj)-child_size(jj)) exit + index(i+1) = ii + end do + iswap = i + 1 + index(iswap) = jj + jj = index(j) + do i = iswap, j + ii = index(i) + m1(i) = max(m1(i-1),child_mem(ii)+m0(i-1)) + m0(i) = m0(i-1) + child_size(ii) + end do + memory = m1(j) + + if (j < nc) memory = max(memory,store+child_mem(index(j+1))) +! Record the min. total memory ... the best j is the split point p. +! Because of the way we do merges in factorize, we do not set p = 1 +! unless nc = 1 + if (memory > minmem .and. control%p==4 .and. j > 2) exit + minmem = memory + p = j + end do + +! Store the split point for node and memory needed + keep%splitp(node) = p + mem(node) = minmem + +! If p = nc, the children are in decreasing order of (child_mem - child_size). +! Otherwise, we must undo the last set of swaps so that the first p +! children only are in decreasing order of (child_mem - child_size). + if (p /= nc .and. control%p == 4) then + ii = index(iswap) + do i = iswap, j - 1 + index(i) = index(i+1) + end do + index(j) = ii + end if + +! Do the physical reordering (iwork is used here as a temporary array) + do j = 1, nc + jj = index(j) + iwork(j) = keep%tree(node)%child(jj) + end do + + keep%tree(node)%child(1:nc) = iwork(1:nc) +! write(*,*) 'node',node,' has children', iwork(1:nchild) +! if( nc/=2 .or. p == 1) then +! write(*,*) 'node',node,' has', nc, 'children', ' p=', p, & +! ' stack size',minmem,' front size',store +! do j = 1, nc +! cnode = iwork(j) +! cblock = abs(keep%size(cnode)) - keep%tree(cnode)%nelim +! cblock = (cblock*cblock+cblock)/2 +! write(*,*)cnode, mem(cnode),cblock, mem(cnode)-cblock +! end do +! end if + + + end subroutine order_child + +!********************************** + + subroutine construct_tree1 +! Construct tree when all pivots are 1x1 + + if (keep%element_input) then +! Link the elements according to the supervariable +! in its list that appears first in the pivot sequence. +! Set nels(ivar) to be number of elements containing variable ivar. + do ielt = 1, keep%nelt + nvar = abs(keep%size(ielt)) + if (nvar == 0) cycle +! Read from the main integer superfile + loc = keep%ifile(ielt) + call MA77_read_integer(keep%index(1),keep%imain,loc,nvar,varlist, & + flag,keep%idata,-1) + if (flag < 0) then + info%flag = flag; return + end if + jj = n + 1 + do i = 1, nvar + jvar = varlist(i) + nels(jvar) = nels(jvar) + 1 + if (order(jvar) < jj) then + k = jvar + jj = order(k) + end if + end do +! ks is supervariable to which k belongs. + ks = keep%svar(k) + next(ielt) = first(ks) + first(ks) = ielt + end do + end if +! Note : in row entry case, we count only the generated elements + + mx_nchild = 0 ! will hold largest number of children a node has. + do 200 jdum = 1, n + ivar = perm(jdum) + if (ivar == 0) cycle +! Check whether we have already dealt with this variable. + if (order(ivar) == 0) cycle + is = keep%svar(ivar) +! write (6,'(a,9i4)') 'jdum,ivar,is,keep%nsup', jdum,ivar,is,keep%nsup + + ie = first_free + if (ie < 0) then +! New node number needed. + ie = keep%tnode + 1 + keep%tnode = ie +! Initialize node as empty + keep%size(ie) = 0 + keep%tree(ie)%nelim = 0 + keep%ifile(ie) = 1 + keep%rfile(ie) = 1 + else +! we can reuse a node number that has been freed + first_free = next(ie) + end if + +! Check array child is large enough to hold children of ie + nchild = nels(ivar) + if (size(child) < nchild) then + deallocate (child,stat=st) + allocate (child(1:nchild),stat=st) + if (st /= 0) return + end if + +! Construct the child list for ie. + ielt = first(is) +! write (6,*) 'ie,ivar,is,ielt,nels(ivar)',ie,ivar,is,ielt,nels(ivar) + do i = 1, nels(ivar) + child(i) = ielt + ielt = next(ielt) + end do +! write (6,*) 'children:',child(1:nchild) + +! nelim holds number of variables that can be eliminated at ie. +! The indices of these variables are placed in the array list from the front. +! The indices of the other variables in the front are placed in list from +! the back; ifs holds the position of the first such variable. + nelim = 0 + ifs = llist + 1 + + if (.not.keep%element_input) then +! Row entry. +! Read the variable list for row ivar from the main integer +! superfile into varlist. Check if diagonal present. + l = 0 + nvar = abs(keep%size(ivar)) + loc = keep%ifile(ivar) + call read_varlist(nvar) + if (info%flag < 0) return + do ii = 1, nvar + jvar = varlist(ii) + if (order(jvar) == 0) cycle +! jvar not yet eliminated. + if (jvar == ivar) l = 1 + js = keep%svar(jvar) + if (js == is) then +! jvar belongs to the same supervariable as ivar and so +! can be eliminated. + nelim = nelim + 1 + list(nelim) = jvar + keep%varflag(jvar) = nelim + else +! Put jvar at the end of list as not ready for elimination + ifs = ifs - 1 + list(ifs) = jvar + keep%varflag(jvar) = ifs + end if + end do + if (l == 0) then +! add in diagonal to list of variables to be eliminated (that is, ivar) + nelim = nelim + 1 + list(nelim) = ivar + keep%varflag(ivar) = nelim + end if + end if + +! Now loop over the children of ie (which are all generated elements +! in the row entry case), reading in the variables +! for each child that are not yet eliminated and adding them into list. + do i = 1, nchild + ielt = child(i) + nelim_i = 0 + if (ielt > keep%nelt) nelim_i = keep%tree(ielt)%nelim + nvar = abs(keep%size(ielt)) - nelim_i + loc = keep%ifile(ielt) + nelim_i + call read_varlist(nvar) + if (info%flag < 0) return +! varlist holds the variables in element ielt. + do ii = 1,nvar + jvar = varlist(ii) + if (keep%varflag(jvar) == 0) keep%varflag(jvar) = llist+1 + end do +! Merge varlist into list. + do ii = 1, nvar + jvar = varlist(ii) + if (keep%varflag(jvar) == llist+1) then +! First encounter of jvar for element ie. + js = keep%svar(jvar) + if (js == is) then +! jvar belongs to the same supervariable as ivar and so can be eliminated + nelim = nelim + 1 + list(nelim) = jvar + keep%varflag(jvar) = nelim + else +! Put jvar at the end of list + ifs = ifs - 1 + list(ifs) = jvar + keep%varflag(jvar) = ifs + end if + end if + +! Decrement nels(jvar) + nels(jvar) = nels(jvar) - 1 +! write (6,*) 'ie,i,ielt,jvar,nels(jvar)',ie,i,ielt,jvar,nels(jvar) + end do + end do + + if (keep%element_input) then +! Element entry. +! Check whether any of the variables in list(ifs:llist) are fully +! summed (that is, nels(jvar) = 0). If they are, move to front of array list. + k1 = ifs + do k = k1,llist + jvar = list(k) + if (nels(jvar) == 0) then +! jvar can be eliminated so move into front portion of list + nelim = nelim + 1 + list(nelim) = jvar + keep%varflag(jvar) = nelim +! make sure we leave no gaps in list + if (k /= ifs .and. ifs < llist) then + kvar = list(ifs) + list(k) = kvar + keep%varflag(kvar) = k + end if + ifs = ifs + 1 + end if + end do + + end if +! write (6,*) 'At node= ', ie, 'nelim= ',nelim, & +! ' list: ',list(1:nelim),list(ifs:llist) +! Set keep%varflag to -ie for variables that are eliminated +! and set > 0 for those that are not eliminated + do i = 1,nelim + jvar = list(i) + order(jvar) = 0 + keep%varflag(jvar) = -ie + end do + do i = ifs,llist + jvar = list(i) + keep%varflag(jvar) = i + end do +! nfs is the number of non fully summed variables + nfs = llist - ifs + 1 + + if (nfs > 0) then +! Link new element into list. Loop over the uneliminated variables belonging +! to ie to find the one that occurs earliest in the pivot sequence. + jj = n + 1 + do i = ifs,llist + jvar = list(i) + nels(jvar) = nels(jvar) + 1 +! if (ie >= 40000) write (6,*) 'ie,i,jvar,nels(jvar),jj,order(jvar)',& +! ie,i,jvar,nels(jvar),jj,order(jvar) + if (order(jvar) < jj) then + k = jvar + jj = order(k) + end if + end do + ks = keep%svar(k) + next(ie) = first(ks) + first(ks) = ie + else +! Node is a root. Link with other roots + next(ie) = first_root + first_root = ie + nroot = nroot + 1 + end if + +! reset keep%varflag to zero for variables that are not eliminated + do i = ifs,llist + jvar = list(i) + keep%varflag(jvar) = 0 + end do + +! Merge parent ie and child nodes if the list of uneliminated variables +! at the child is the same as the list of variables at the parent +! or if both involve fewer than nemin eliminations. + k = nchild + do 80 i = 1, k + ielt = child(i) +! Cycle if ielt is a leaf node + if (ielt <= keep%nelt) cycle +! Skip to next child if merging is not needed. + nelim_i = keep%tree(ielt)%nelim + + if (nelim+nfs > keep%size(ielt)-nelim_i .and. & + (nelim >= nemin .or. nelim_i >= nemin)) cycle + +! Merge. Read in variable list. Only need the first nelim_i entries for ielt. +! Read directly into list + if (nelim_i /= 0) then + loc = keep%ifile(ielt) + call MA77_read_integer(keep%index(1),keep%imain,loc,nelim_i, & + list(nelim+1:nelim+nelim_i),flag,keep%idata,-1) + if (loc+keep%size(ielt) == keep%ifree) & +! store the largest integer storage needed so far + keep%ifree = loc + if (flag < 0) then + info%flag = flag; return + end if + nelim = nelim + nelim_i + end if + +! The children of ielt become children of ie. + nc = size(keep%tree(ielt)%child) +! ie may have more children than before so check size +! of array child. If necessary, allocate larger array child. + if (nchild+nc-1 > size(child)) then + call reallocate_child(nchild+nc-1) + if (info%flag < 0) return + end if + +! Loop over children of ielt, making them children of ie + if (nc > 0) then +! The first child replaces ielt in the list of children for ie + l = i + do j = 1, nc + jelt = keep%tree(ielt)%child(j) + child(l) = jelt + l = nchild + j + end do + nchild = nchild + nc - 1 + else +! Flag that the child has gone. + child(i) = 0 + end if + +! Remove node ielt from keep%tree by deallocating its list of children +! and adding it to the list of free nodes. + deallocate (keep%tree(ielt)%child,stat=st) + next(ielt) = first_free + first_free = ielt + keep%size(ielt) = 0 + keep%tree(ielt)%nelim = 0 + keep%ifile(ielt) = 1 + keep%rfile(ielt) = 1 + +! Finished with child ielt +80 continue + +! Flush out dummy children + k = nchild + nchild = 0 + do i = 1, k + if (child(i) /= 0) then + nchild = nchild + 1 + child(nchild) = child(i) + end if + end do + mx_nchild = max(mx_nchild,nchild) + +! Copy list of children into tree(ie)%child + allocate (keep%tree(ie)%child(1:nchild),stat=st) + ! write (6,*) 'node',ie,' has children',child(1:nchild) + keep%tree(ie)%child(1:nchild) = child(1:nchild) + +! Move list of uneliminated variables forward + k = nelim + do i = ifs,llist + k = k + 1 + list(k) = list(i) + end do + + keep%size(ie) = k + keep%maxlen = max(keep%maxlen,k) + keep%maxfront = max(keep%maxfront,k) +! write (*,*) 'ie,k,maxlen',ie,k,keep%maxlen + keep%tree(ie)%nelim = nelim + keep%maxelim = max(nelim,keep%maxelim) + +! Store variable list for ie in main integer superfile. + loc = keep%ifree +! write(*,*) 'write',k,' integers',' from position',loc +! write(*,*) 'ie,nelim,list',ie,nelim,list(1:k) + call MA77_write_integer(keep%index(1),keep%size_imain,keep%imain, & + loc,k,list,flag,keep%idata,-1,keep%maxstore,keep%used) + if (flag < 0) then + info%flag = flag + return + end if + +! Store position in the integer superfile of this variable list + keep%ifile(ie) = loc +! Move pointer for next free location in the integer superfile + keep%ifree = loc + k + keep%mx_ifree = max(keep%mx_ifree,keep%ifree) + +!!! end of main tree loop +200 continue + info%tree_nodes = keep%tnode - keep%nelt + + end subroutine construct_tree1 + +!********************************** + + subroutine construct_tree2 +! Construct tree when some pivots are 2x2 + +! write (6,*) 'order',order(1:n) +! write (6,*) 'perm ',perm(1:n) + if (keep%element_input) then +! Link the elements according to the supervariable +! in its list that appears first in the pivot sequence. + +! If ivar is 1x1 pivot or is the first entry in a 2x2 pivot, +! set nels(ivar) to be number of elements containing ivar. +! If kvar is the partner of ivar (i.e. kvar is second entry in 2x2 pivot) +! set nels(kvar) to be number of elements containing kvar but NOT ivar + + do ielt = 1, keep%nelt + nvar = abs(keep%size(ielt)) + if (nvar == 0) cycle +! Read from the main integer superfile + loc = keep%ifile(ielt) + call MA77_read_integer(keep%index(1),keep%imain,loc,nvar,varlist, & + flag,keep%idata,-1) + if (flag < 0) then + info%flag = flag + return + end if +! Set flag for variables if ielt + do i = 1, nvar + jvar = varlist(i) + keep%varflag(jvar) = ielt + end do + jj = n + 1 + do i = 1, nvar + jvar = varlist(i) + nels(jvar) = nels(jvar) + 1 + kk = -order(jvar) + belong = .false. + if (kk > 0) then +! jvar is part of 2x2 pivot. Check whether it is 1st or 2nd entry +! in the 2x2 pivot. +! If it is the 2nd entry, check to see if its partner kvar is also in ielt + if (perm(kk) > 0) then + kvar = -perm(kk-1) + if (keep%varflag(kvar) == ielt) then + nels(jvar) = nels(jvar) - 1 + belong = .true. + end if + end if + end if + if (abs(order(jvar)) < jj) then + k = jvar + if (belong) k = kvar + jj = abs(order(k)) + end if + end do +! ks is supervariable to which k belongs. + ks = keep%svar(k) + next(ielt) = first(ks) + first(ks) = ielt +! write (6,*) 'ielt,k,ks,next',ielt,k,ks,next(ielt) + end do +! reset keep%varflag + keep%varflag(1:n) = 0 + end if +! Note : in row entry case, we count only the generated elements + + mx_nchild = 0 + do 200 jdum = 1, n + ivar = abs(perm(jdum)) +! write (6,*) 'jdum,ivar,order(ivar)',jdum,ivar,order(ivar) + if (ivar == 0) cycle +! Check whether we have already dealt with this variable. + if (order(ivar) == 0) cycle + is = keep%svar(ivar) +! write (6,'(a,9i4)') 'jdum,ivar,is,keep%nsup', jdum,ivar,is,keep%nsup + + ie = first_free + if (ie < 0) then +! New node number needed. + ie = keep%tnode + 1 + keep%tnode = ie +! Initialize node as empty + keep%size(ie) = 0 + keep%tree(ie)%nelim = 0 + keep%ifile(ie) = 1 + keep%rfile(ie) = 1 + else + first_free = next(ie) + end if + +! Check array child is large enough to hold children of ie + j = -order(ivar) + if (j < 0) then + nchild = nels(ivar) + else +! 2x2 pivot. Need to consider both entries in pivot. + kvar = perm(j+1) + nchild = nels(ivar) + nels(kvar) + end if + if (size(child) < nchild) then + deallocate (child,stat=st) + allocate (child(1:nchild),stat=st) + if (st /= 0) return + end if + +! Construct the child list for ie. + ielt = first(is) + do i = 1, nels(ivar) + child(i) = ielt + ielt = next(ielt) + end do + ks = is + if (j > 0) then +! 2x2 pivot. + ks = keep%svar(kvar) + ielt = first(ks) + do i = 1, nels(kvar) + child(nels(ivar)+i) = ielt + ielt = next(ielt) + end do + end if +! write (6,*) 'children:',child(1:nchild) + +! nelim holds number of variables that can be eliminated at ie. +! The indices of these variables are placed in the array list from the front +! (keeping 2x2 pivots together). +! The indices of the other variables in the front are placed in list from +! the back; ifs holds the position of the first such variable. + nelim = 0 + ifs = llist + 1 + + if (.not.keep%element_input) then +! Row entry. +! Read the variable list for row ivar from the main integer +! superfile into varlist. Check diagonal present. + l = 0 + nvar = abs(keep%size(ivar)) + loc = keep%ifile(ivar) + call read_varlist(nvar) + if (info%flag < 0) return + do ii = 1, nvar + jvar = varlist(ii) + if (order(jvar) == 0) cycle + if (jvar == ivar) l = 1 +! jvar not yet eliminated. + js = keep%svar(jvar) + if (js == is .or. js == ks) then +! jvar belongs to the same supervariable as ivar or kvar and so +! can be eliminated. + nelim = nelim + 1 + list(nelim) = jvar + keep%varflag(jvar) = nelim + else +! Put jvar at the end of list as not ready for elimination + ifs = ifs - 1 + list(ifs) = jvar + keep%varflag(jvar) = ifs + end if + end do + if (l == 0) then +! add in diagonal + nelim = nelim + 1 + list(nelim) = ivar + keep%varflag(ivar) = nelim + end if + + l = 0 + if (ks /= is) then +! Read in row kvar and then loop over entries in row kvar. +! Check diagonal present. +! write (6,*) 'read row',kvar + nvar = abs(keep%size(kvar)) + loc = keep%ifile(kvar) + call read_varlist(nvar) + if (info%flag < 0) return + do ii = 1, nvar + jvar = varlist(ii) + if (order(jvar) == 0) cycle +! cycle if jvar already been encountered when looping over entries in row ivar. + if (keep%varflag(jvar) > 0) cycle + if (jvar == kvar) l = 1 + js = keep%svar(jvar) + if (js == is .or. js == ks) then + nelim = nelim + 1 + list(nelim) = jvar + keep%varflag(jvar) = nelim + else + ifs = ifs - 1 + list(ifs) = jvar + keep%varflag(jvar) = ifs + end if + end do + if (l == 0) then +! Diagonal not present in row kvar. Must add if not +! already encountered kvar when dealing with row ivar. + if (keep%varflag(kvar) <= 0) then + nelim = nelim + 1 + list(nelim) = kvar + keep%varflag(kvar) = nelim + end if + end if + end if + end if + +! Now loop over the children of ie (which are all generated elements +! in the row entry case), reading in the variables +! for each child that are not yet eliminated and adding them into list. + do i = 1, nchild + ielt = child(i) + nelim_i = 0 + if (ielt > keep%nelt) nelim_i = keep%tree(ielt)%nelim + nvar = abs(keep%size(ielt)) - nelim_i + loc = keep%ifile(ielt) + nelim_i + call read_varlist(nvar) + if (info%flag < 0) return +! varlist holds the variables in element ielt. +! Set negative flags so that we can quickly check if a partner is present + do ii = 1,nvar + jvar = varlist(ii) + if (keep%varflag(jvar) == 0) then + keep%varflag(jvar) = -(llist+1) + else + keep%varflag(jvar) = -keep%varflag(jvar) + end if + end do +! Merge varlist into list. + do ii = 1, nvar + jvar = varlist(ii) + if (keep%varflag(jvar) == -(llist+1)) then +! First encounter of jvar for element ie. + js = keep%svar(jvar) + if (js == is) then +! jvar belongs to the same supervariable as ivar and so can be eliminated + nelim = nelim + 1 + list(nelim) = jvar + keep%varflag(jvar) = -nelim + else +! Put jvar at the end of list + ifs = ifs - 1 + list(ifs) = jvar + keep%varflag(jvar) = -ifs + end if + end if +! Decrement nels(jvar) + nels(jvar) = nels(jvar) - 1 +! write (6,*) 'jvar,nels(jvar)',jvar,nels(jvar) + kk = -order(jvar) + if (kk < 0) cycle +! jvar is part of 2x2 pivot. Check whether jvar is 1st or 2nd in the 2x2 pivot. +! If it is the 2nd entry and its partner jjvar is in ielt, do not +! decrement nels(jvar). + if (perm(kk) < 0) cycle + jjvar = -perm(kk-1) + if (keep%varflag(jjvar) < 0) nels(jvar) = nels(jvar) + 1 + end do +! restore signs on keep%varflag + do ii = 1,nvar + jvar = varlist(ii) + keep%varflag(jvar) = abs(keep%varflag(jvar)) + end do + end do + +! write (6,*) nelim,ifs,keep%varflag(2) +! write (6,*) list(1:nelim) +! write (6,*) list(ifs:llist) + + if (keep%element_input) then +! Element entry. +! Check whether any of the variables in list(ifs:llist) are fully +! summed (that is, nels(jvar) = 0). If they are, move to front of array list. + k1 = ifs + do k = k1,llist + jvar = list(k) + if (nels(jvar) == 0) then +! jvar can be eliminated so move into front portion of list + nelim = nelim + 1 + list(nelim) = jvar + keep%varflag(jvar) = nelim +! make sure we leave no gaps in list + if (k /= ifs .and. ifs < llist) then + kvar = list(ifs) + list(k) = kvar + keep%varflag(kvar) = k + end if + ifs = ifs + 1 + end if + end do + + end if + +! write (6,*) 'nels',nels(1:n) +! write (6,*) 'nelim,list 1:',nelim,list(1:nelim) +! write (6,*) 'ifs,list 2:',ifs,list(ifs:llist) +! write (6,*) 'perm:',perm(1:n) + +! Check that if a variable that is part of a 2x2 pivot is marked for +! elimination then its partner is also ready for elimination + ii = 0 + do k = 1,nelim + jvar = list(k) + j = -order(jvar) + if (j < 0) cycle + if (perm(j) > 0) then + kvar = -perm(j-1) ! second entry in 2x2 + else + kvar = perm(j+1) + end if + if (keep%varflag(kvar) == 0 .or. keep%varflag(kvar) >= ifs) then + ii = ii + 1 + list(k) = -jvar + end if + end do + + if (ii > 0) then +! Move those that could not be eliminated to the end section of list + l = 0 + do k = 1,nelim + jvar = list(k) +! write (6,*) 'k,jvar,l,ifs',k,jvar,l,ifs + if (k == ifs) exit + if (jvar == 0) exit + list(k) = 0 + if (jvar > 0) then + l = l + 1 + list(l) = jvar + keep%varflag(jvar) = l + else + ifs = ifs - 1 + if (ifs > nelim) then + list(ifs) = -jvar + keep%varflag(-jvar) = ifs + else + k1 = list(ifs) + do while (k1 < 0) + list(ifs) = -jvar + keep%varflag(-jvar) = ifs + ifs = ifs - 1 + k1 = list(ifs) + end do + list(ifs) = -jvar + keep%varflag(-jvar) = ifs + if (k1 == 0) exit + l = l + 1 + list(l) = k1 + keep%varflag(k1) = l + end if + end if + end do + nelim = l + end if + +! write (6,*) 'nelim,list 1:',nelim,list(1:nelim) +! write (6,*) 'order',order(1:n) +! We need to reunite any pairs that have become separated within list(1:nelim). +! We flag the first entry in the pair with a negative sign. + l = 1 + do i = 1,nelim + if (l > nelim) exit + jvar = list(l) + j = -order(jvar) + if (j < 0) then + l = l + 1; cycle + end if +! jvar is part of a pair. Let its partner be kvar. + k1 = list(l+1) + if (perm(j) < 0) then +! jvar is the first in the pair. + kvar = perm(j+1) + k = keep%varflag(kvar) + list(l) = -jvar + list(l+1) = kvar + list(k) = k1 + keep%varflag(jvar) = l + keep%varflag(kvar) = l+1 + keep%varflag(k1) = k + else +! jvar is the second in the pair. + kvar = -perm(j-1) + k = keep%varflag(kvar) + list(l) = -kvar + list(l+1) = jvar + if (k > l+1) list(k) = k1 + keep%varflag(kvar) = l + keep%varflag(jvar) = l+1 + if (k > l+1) keep%varflag(k1) = k + end if + l = l + 2 + info%ntwo = info%ntwo + 1 + end do + + ! write (6,*) 'At node= ', ie, 'nelim= ',nelim, & + ! ' list: ',list(1:nelim),list(ifs:llist) +! Set keep%varflag to -ie for variables that are eliminated +! and set > 0 for those that are not eliminated + do i = 1,nelim + jvar = abs(list(i)) + order(jvar) = 0 + keep%varflag(jvar) = -ie + end do + do i = ifs,llist + jvar = list(i) + keep%varflag(jvar) = i + end do +! nfs is the number of non fully summed variables + nfs = llist - ifs + 1 + + if (nfs > 0) then +! Link new element into list. Loop over the uneliminated variables belonging +! to ie to find the one that occurs earliest in the pivot sequence. + jj = n + 1 + do i = ifs,llist + jvar = list(i) + nels(jvar) = nels(jvar) + 1 + kk = -order(jvar) + belong = .false. + if (kk > 0) then +! jvar is part of 2x2 pivot. Check whether it is 1st or 2nd in the 2x2 pivot. +! If it is the 2nd entry, check to see if its partner kvar is in list + if (perm(kk) > 0) then + kvar = -perm(kk-1) + if (keep%varflag(kvar) > 0) then + nels(jvar) = nels(jvar) - 1 + belong = .true. + end if + end if + end if + if (abs(order(jvar)) < jj) then + k = jvar + if (belong) k = kvar + jj = abs(order(k)) + end if + end do + + ks = keep%svar(k) + next(ie) = first(ks) + first(ks) = ie + + else +! Node is a root. Link with other roots + next(ie) = first_root + first_root = ie + nroot = nroot + 1 + end if + +! reset keep%varflag to zero for variables that are not eliminated + do i = ifs,llist + jvar = list(i) + keep%varflag(jvar) = 0 + end do + +! Merge parent ie and child nodes if the list of uneliminated variables +! at the child is the same as the list of variables at the parent +! or if both involve fewer than nemin eliminations. + k = nchild + do 80 i = 1, k + ielt = child(i) +! Cycle if ielt is a leaf node + if (ielt <= keep%nelt) cycle +! Skip to next child if merging is not needed. + nelim_i = keep%tree(ielt)%nelim + + if (nelim+nfs > keep%size(ielt)-nelim_i .and. & + (nelim >= nemin .or. nelim_i >= nemin)) cycle + +! Merge. Read in variable list. Only need the first nelim_i entries for ielt. +! Read directly into list + if (nelim_i /= 0) then + loc = keep%ifile(ielt) + call MA77_read_integer(keep%index(1),keep%imain,loc,nelim_i, & + list(nelim+1:nelim+nelim_i),flag,keep%idata,-1) + if (loc+keep%size(ielt) == keep%ifree) & +! store the largest integer storage needed so far + keep%ifree = loc + if (flag < 0) then + info%flag = flag; return + end if + nelim = nelim + nelim_i + end if + +! The children of ielt become children of ie. + nc = size(keep%tree(ielt)%child) +! ie may have more children than before so check size +! of array child. If necessary, allocate larger array child. + if (nchild+nc-1 > size(child)) then + call reallocate_child(nchild+nc-1) + if (info%flag < 0) return + end if + +! Loop over children of ielt, making them children of ie + if (nc > 0) then +! The first child replaces ielt in the list of children for ie + l = i + do j = 1, nc + jelt = keep%tree(ielt)%child(j) + child(l) = jelt + l = nchild + j + end do + nchild = nchild + nc - 1 + else +! Flag that the child has gone. + child(i) = 0 + end if + +! Remove node ielt from keep%tree by deallocating its list of children +! and adding it to the list of free nodes. + deallocate (keep%tree(ielt)%child,stat=st) + next(ielt) = first_free + first_free = ielt + keep%size(ielt) = 0 + keep%tree(ielt)%nelim = 0 + keep%ifile(ielt) = 1 + keep%rfile(ielt) = 1 + +! Finished with child ielt +80 continue + +! Flush out dummy children + k = nchild + nchild = 0 + do i = 1, k + if (child(i) /= 0) then + nchild = nchild + 1 + child(nchild) = child(i) + end if + end do + mx_nchild = max(mx_nchild,nchild) + +! Copy list of children into tree(ie)%child + allocate (keep%tree(ie)%child(1:nchild),stat=st) + ! write (6,*) 'node',ie,' has children',child(1:nchild) + keep%tree(ie)%child(1:nchild) = child(1:nchild) + +! Move list of uneliminated variables forward + k = nelim + do i = ifs,llist + k = k + 1 + list(k) = list(i) + end do + + keep%size(ie) = k + keep%maxlen = max(keep%maxlen,k) + keep%maxfront = max(keep%maxfront,k) +! write (*,*) 'ie,k,maxlen',ie,k,keep%maxlen + keep%tree(ie)%nelim = nelim + keep%maxelim = max(nelim,keep%maxelim) + +! Store variable list for ie in main integer superfile. + loc = keep%ifree +! write (6,*) 'write',k,' integers',' from position',loc +! write (6,*) 'ie,nelim,list',ie,nelim,list(1:k) + + call MA77_write_integer(keep%index(1),keep%size_imain,keep%imain, & + loc,k,list,flag,keep%idata,-1,keep%maxstore,keep%used) + if (flag < 0) then + info%flag = flag + return + end if + +! Store position in the integer superfile of this variable list + keep%ifile(ie) = loc +! Move pointer for next free location in the integer superfile + keep%ifree = loc + k + keep%mx_ifree = max(keep%mx_ifree,keep%ifree) + +!!! end of main tree loop +200 continue + info%tree_nodes = keep%tnode - keep%nelt + + + end subroutine construct_tree2 + +!********************************** + +!!! End of analyse + + end subroutine MA77_analyse_double + +!**************************************************************************** + + subroutine MA77_input_reals_double(index,length,reals,keep,control,info) + +! This subroutine is called by the user to specify the reals +! for an element/row (reverse communication interface). +! For element entry, the lower triangular part of the element matrix +! must be input by columns in packed form. +! If there are no duplicates/out-of-range entries in the +! element/row and if the sequence of nonzeros +! is very large, it may be broken into parts and input by +! consecutive calls to MA77_input_reals. +! For row entry, the user must input the nonzeros +! in the row (both upper and lower triangular entries are needed). +! Again, a number of consecutive calls may be used for one row. + +! The integer data for an element/row must be entered +! before the reals for the elt/row (but all the calls to MA77_input_vars +! do not have to be completed before the calls to MA77_input_reals +! are started). +! If values are entered for an element/row that has already +! been entered, the new values overwrite the old (this allows +! for subsequent factorizations of further matrices +! with same pattern but different numerical values). + + integer(short), intent (in) :: index ! must hold the index of +! incoming element/row. If out of range, the call is ignored. + integer(short), intent (in) :: length ! must hold the number of nonzeros +! being input. Must be >= 0. + real (wp), intent (in) :: reals(length) ! must contain the nonzeros +! being input +! For details of keep, control, info : see derived type description + type (MA77_keep), intent (inout) :: keep + type (MA77_control), intent (in) :: control + type (MA77_info), intent (inout) :: info + +! Local scalars + integer(short) :: flag ! local error flag + integer(short) :: i,ii + integer(short) :: inelrs + integer(short) :: j,jj + integer(short) :: k,kk + integer(short) :: len + integer(short) :: nout ! unit for printing errors + integer(short) :: nvar ! no. of variables in incoming element/row +! (compressed list) + integer(short) :: nvar_user ! no. of variables in user-supplied list for +! for incoming element/row (before duplicated/out-of-range +! entries removed) + integer(short) :: st + integer(long) :: loc,locw + +! Possible error returns: +! -1 Allocation error (only possible if duplicates and/or out-of-range +! entries) +! -3 Error in sequence of calls to routines in package +! -5 Error from of01_write (error in Fortran inquire) +! -6 Error from of01_write (error in Fortran read) +! -7 Error from of01_write (error in Fortran open) +! -10 MA77_input_vars was not called +! for the element/row index. No action taken. +! -11 Problem found to be singular or unexpectedly not pos.def. +! -14 Data for previous element/row incomplete. No action taken. +! -15 Error from of01_write (error in Fortran write) +! -16 -17 Error from of01_read or of01_write (Fortran open failed +! for all path) +! -17 out-of-range and/or duplicated indices entered but +! user has not entered all the reals for the current elt/row +! in a single call to input_reals. No action taken. +! -19 length < 0. No action taken. +! -32 Too many reals input for current element/row. No action taken. + + if (keep%n == 0) return + +! Perform appropriate printing + if (control%print_level >= 2 .and. control%unit_diagnostics >= 0) then + write (control%unit_diagnostics,'(/a,2(/a,i12))') & + ' Entering MA77_input_reals with:', & + ' index Index of element/row = ',index, & + ' length Number of reals being input = ',length + i = min(length,10) + write (control%unit_diagnostics,'(a,2(/5es12.4))') & + ' Input reals: ',reals(1:i) + if (i < length) write (control%unit_diagnostics,'(a)') ' . . . . . .' + end if + + nout = control%unit_error + if (control%print_level < 0) nout = -1 + keep%name = 'MA77_input_reals' + +! Remember that calls to this routine may follow an earlier factorization +! and so we do not want to retain a flag for singularity set on the earlier +! call. + if(keep%flag == 4) keep%flag = 0 + + flag = 0; info%flag = keep%flag + +! Check status parameter (remember that input of integer and real +! data can be interleaved and user can choose not to input reals +! until after MA77_analyse has been called). +! Remember also that call could follow a factorization. + if (keep%status < 1) then + info%flag = -3 +! Check input data + else if (index < 1 .or. index > keep%nelt) then + return + else if (keep%ifile(index) == 0) then +! no integer data has been entered for an element/row of this index. + info%flag = -10 + else if (length < 0) then + info%flag = -19 + end if + + if (info%flag < 0) then + keep%status = -1 + call MA77_print_iflag(keep,nout,info%flag,ie=index) + return + end if + +! Immediate return if keep%size(index) = 0 (this can happen only +! if nvar = 0 on call to MA77_input_vars) + if (keep%size(index) == 0) return + +! We will need some arrays to squeeze out duplicates etc +! Note: input of variables and reals can be interleaved so at this stage +! keep%mvar holds largest value of nvar so far. + if (keep%size(index) < 0) then + st = 0 + if (keep%element_input) then + len = (keep%mvar*keep%mvar+keep%mvar)/2 + if (.not. allocated(keep%aelt)) then + allocate (keep%aelt(len),stat=st) + else if (size(keep%aelt) < len) then + deallocate (keep%aelt,stat=st) + allocate (keep%aelt(len),stat=st) + end if + if (.not. allocated(keep%map)) allocate (keep%map(0:keep%mvar),stat=st) + else + len = keep%mvar + if (.not. allocated(keep%arow)) then + allocate (keep%arow(len),stat=st) + else if (size(keep%arow) < len) then + deallocate (keep%arow,stat=st) + allocate (keep%arow(len),stat=st) + end if + if (.not. allocated(keep%map)) allocate (keep%map(0:keep%mvar),stat=st) + end if + if (st /= 0) then + info%stat = st + info%flag = -1; keep%status = -1 + if (nout >= 0) & + call MA77_print_iflag(keep,nout,info%flag,ie=index,st=info%stat) + return + end if + end if + +! keep%inelrs is the number of reals still needed for the current +! element/row. If it is equal to zero on input +! then no reals have yet been input for the current element/row. +! if keep%inelrs > 0, keep%inelrn holds the index of the +! element/row that was last input. +! write (6,*) 'index,info%flag,inelrs,length,keep%inelrn',& +! index,info%flag,keep%inelrs,length,keep%inelrn + inelrs = keep%inelrs + if (inelrs > 0) then + if (index /= keep%inelrn) then +! data for previous element/row is not complete + info%flag = -14 + call MA77_print_iflag(keep,nout,info%flag,ie=index) + return + end if + else if (index == keep%inelrn .and. length > 0) then +! Too many reals have been supplied for element/row + info%flag = -32 + call MA77_print_iflag(keep,nout,info%flag,ie=index) + return + else +! no reals have yet been input for this element/row. +! Set inelrs to the expected no. of entries + if (keep%size(index) > 0) then + keep%inelrn = index + nvar = keep%size(index) + inelrs = nvar + if (keep%element_input) inelrs = (nvar*nvar + nvar)/2 + else +! some duplicates/out-of-range variables were entered for this element/row. +! Read compressed list and length of original user-supplied list (nvar_user) + nvar = -keep%size(index) + loc = keep%ifile(index) + call MA77_read_integer(keep%index(1),keep%imain,loc,nvar+1, & + keep%clist,flag,keep%idata,-1) + if (flag < 0) go to 50 + nvar_user = keep%clist(nvar+1) +! write (6,*) 'clist,nvar_user',keep%clist(1:nvar),nvar_user + inelrs = nvar_user + if (keep%element_input) inelrs = (nvar_user*nvar_user + nvar_user)/2 +! We require the user to enter the whole element/row using a single call +! If supplied incorrect number, the user can correct length and recall + if (inelrs > length) then + info%flag = -17 + call MA77_print_iflag(keep,nout,info%flag,ie=index) + return + end if + end if + end if + +! If length = 0, nothing to be done + if (length == 0) return + +! check whether the user has supplied too many reals. +! If too many supplied, the user can correct length and recall +! (keep%inelrs has not been altered) + if (length > inelrs) then + info%flag = -32 + call MA77_print_iflag(keep,nout,info%flag,ie=index) + return + end if + +! Store the reals in main real file. +! If we already have real data for an earlier version +! of the current element/row, we overwrite it with latest real data + if (keep%rfile(index) > 0 .and. keep%inelrs == 0) then + locw = keep%rfile(index) - inelrs + else + locw = keep%posfac +! move pointer for next free location in real file + if (keep%size(index) > 0) then + keep%posfac = keep%posfac + length + else + len = nvar + if (keep%element_input) len = (nvar*nvar + nvar)/2 + keep%posfac = keep%posfac + len + end if + end if + +! If no duplicates/out-of-range entries in this element/row, we can write +! directly to the main real file + if (keep%size(index) > 0) then + call MA77_write_real(keep%index(2),keep%size_rmain,keep%rmain,& + locw,length,reals,flag,keep%rdata,-1,keep%maxstore,keep%used) + else +! We have to squeeze out duplicates/out-of-range entries. +! Start by reading in the mapping that was stored by MA77_input_vars. + loc = keep%ifile(index) + nvar + 1 + call MA77_read_integer(keep%index(1),keep%imain,loc,nvar_user,& + keep%map(1:nvar_user),flag,keep%idata,-1) +! write (6,*) 'loc,map',loc,keep%map(1:nvar_user) + if (flag < 0) go to 50 + if (keep%element_input) then +! Set ip(jj) to point to start of col jj in array aelt. + keep%iptr(1) = 1 + do jj = 2,nvar + keep%iptr(jj) = keep%iptr(jj-1) + nvar - jj + 2 + end do + k = 1 + keep%aelt(1:len) = zero +! Loop over the columns of the incoming element + do j = 1,nvar_user + jj = keep%map(j) +! Skip if column corresponds to an out-of-range index + if (jj == 0) then + k = k + (nvar_user - j + 1) + cycle + end if +! Loop over the rows in column j. + do i = j,nvar_user + ii = keep%map(i) + if ( ii /= 0) then + if (ii >= jj) then + kk = keep%iptr(jj) + ii - jj + else + kk = keep%iptr(ii) + jj - ii + end if + keep%aelt(kk) = keep%aelt(kk) + reals(k) + end if + k = k + 1 + end do + end do + call MA77_write_real(keep%index(2),keep%size_rmain,keep%rmain,& + locw,len,keep%aelt,flag,keep%rdata,-1,keep%maxstore,keep%used) + else + keep%arow(1:len) = zero + do i = 1,nvar_user + j = keep%map(i) + if (j == 0) cycle + keep%arow(j) = keep%arow(j) + reals(i) + end do + call MA77_write_real(keep%index(2),keep%size_rmain,keep%rmain,& + locw,len,keep%arow,flag,keep%rdata,-1,keep%maxstore,keep%used) + end if + end if + if (flag < 0) go to 60 + +! Set keep%inelrs to hold number of reals still required for current +! element/row + keep%inelrs = inelrs - length + +! Set rfile(index) to point to the position in the real file +! after the current element/row (it points to the end of the +! elt/row list rather than to the start to allow us overwrite the data +! with new real values in the case when the elt/row is input +! using more than one call ... if more than one call is used +! and we want to overwrite existing data, we cannot do this +! if we only know the position of the start of the list for the elt/equ) + keep%rfile(index) = locw + length + if (keep%size(index) < 0) keep%rfile(index) = locw + len + +! keep%posfac holds first free location in main real +! superfile where we can write factor + + if (control%print_level >= 2 .and. control%unit_diagnostics >= 0) then + write (control%unit_diagnostics,'(/a,(/a,i12))') & + ' Leaving MA77_input_reals with:', & + ' Error flag info%flag = ', info%flag + end if + return + + 50 info%iostat = keep%idata%iostat + + 60 info%iostat = keep%rdata%iostat + info%flag = flag; keep%status = -1 + call MA77_print_iflag(keep,nout,info%flag,ie=index,ios=info%iostat) + + end subroutine MA77_input_reals_double + +!**************************************************************************** + + subroutine MA77_factor_double(pos_def,keep,control,info,scale) + +! Factorisation phase. + + logical :: pos_def ! Must be set to .true. if the problem is known to +! positive definite and to .false. otherwise. +! if pos_def = .true., no pivoting is performed +! For details of keep, control, info : see derived type description + type (MA77_keep), intent (inout) :: keep + type (MA77_control), intent (in) :: control + type (MA77_info), intent (inout) :: info + + real(wp), intent(in), optional :: scale(:) ! if present, must hold +! row and column scaling factors + + real(wp) :: x(0,0) + +! Possible error returns: +! -1 Allocation error +! -3 Error in sequence of calls +! -5 Error from of01 (error in Fortran inquire) +! -6 Error from of01 (error in Fortran read) +! -7 Error from of01 (error in Fortran open) +! -11 Problem found to be singular or unexpectedly not pos.def. +! -14 data for last element/row passed to MA77_input_reals was incomplete. +! -15 Error from of01 (error in Fortran write) +! -22 For one or more elements/rows, MA77_input_vars was called but +! no corresponding call was made to MA77_input_reals. +! -29 pos_def = .true. but 2x2 pivots supplied to analyze +! -30 front size is too large +! -38 error in static +! -39 size(scale) too small +! -40 IEEE infinities found in the reduced matrix + +! write(*,*) 'entering MA77_factor with keep%status=', keep%status + + keep%name = 'MA77_factor' + + if (present(scale)) then + call MA77_factor_solve_double(pos_def,keep,control,info,0,0,x,scale) + else + call MA77_factor_solve_double(pos_def,keep,control,info,0,0,x) + end if + + end subroutine MA77_factor_double + +!**************************************************************************** + + subroutine MA77_factor_solve_double(pos_def,keep,control,info,nrhs, & + lx,x,scale) + +! Factorisation phase. If lx .ge. n and nrhs > 0, also solve. + + integer(short), parameter :: nb_default = 150 + logical, intent (in) :: pos_def ! Must be set to .true. if +! the problem is known to +! positive definite and to .false. otherwise. +! if pos_def = .true., no pivoting is performed +! For details of keep, control, info : see derived type description + type (MA77_keep), intent (inout) :: keep + type (MA77_control), intent (in) :: control + type (MA77_info), intent (inout) :: info + + real(wp), intent(in), optional :: scale(:) ! if present, must hold +! row and column scaling factors + + integer(short) :: lx ! First extent of x. must be at least n. + integer(short) :: nrhs ! number right-hand sides. must be at least 1 +! if solve required + real (wp), intent(inout) :: x(lx,nrhs) ! if nrhs > 0 +! must hold right-hand sides on entry. On exit, holds solution. + +! The following arrays are allocated by MA77_factor_solve and are +! then used as workspace by subroutine MA77_factorize + real (wp), allocatable :: fa(:) ! frontal matrix + real (wp), allocatable :: w54(:) ! array used by ma54 (pos. def. kernel) + real (wp), allocatable :: w64(:) ! array used by ma64 (indefinite kernel) + real (wp), allocatable :: reals(:) ! used to hold a single col. +! of the frontal matrix. Also used for reading in +! a user-supplied elt/equ. + real (wp), allocatable :: xlocal(:,:) ! temporary dense vector for +! performing forward subs (only needed if x present). + integer(short), allocatable :: count(:) ! used for depth +! first search of tree to keep track of level we are at + integer(short), allocatable :: cnode(:) ! used for depth +! first search of tree + integer(short), allocatable :: rlist(:), varlist(:) ! used for holding +! the variables at nodes in the tree. +! They are allocated to be of length keep%maxlen. This is +! sufficient if there are no delayed cols. If insufficient, +! reallocated within MA77_factorize. + integer(short), allocatable :: map(:) ! used to map between variables in +! a child and those in its parent. + integer(short), allocatable :: pos(:) ! Used for mapping into the front +! (only array of length n) + integer(long), allocatable :: ip(:) ! Used to hold +! positions of columns in the front. + + type(ma64_control) :: cntl64 ! control derived type for hsl_ma64 + type(ma64_info) :: info64 ! information derived type for hsl_ma64 + + real (wp) :: multiplier ! set to max(1.0, control%multipler) (indef. case) + logical :: lsolve ! set to true if solves are to follow the factorization + + integer(short) :: cdelay ! number of delayed pivots for children of code + integer(short) :: cnvar ! number of (uneliminated) variables at child node + integer(short) :: depth ! depth in tree + integer(short) :: d1max ! max value of d(1,:) over children of node + integer(short) :: dreals ! + integer(short) :: flag + integer(short) :: i ! temporary variable + integer(long) :: ilong ! temporary variable + integer(short) :: ic ! indicates which child of pnode node is + integer(short) :: ii ! temporary variable + integer(long) :: inactive_fac ! points to first entry in factor storage +! (= keep%posfac + n in pos def case; keep%posfac + 2n in indefinite case) + integer(short) :: inelrs ! number of reals to be read in + integer(long) :: ipp ! points to start of a column in frontal matrix + integer(long) :: ip1 ! points to position of start of frontal mx for node + integer(long) :: ipc ! points to position of start of frontal +! mx for child + integer(long) :: ipj2 ! temporary variable (used assemble54/assemble64) + integer(long) :: ipk ! temporary variable (used assemble54/assemble64) + integer(short) :: ir ! do loop variable + integer(short) :: ivar ! a variable + integer(short) :: j ! temporary variable + integer(long) :: jlong ! temporary variable + integer(short) :: j1 ! temporary variable + integer(short) :: j2 ! temporary variable + integer(short) :: jc ! temporary variable + integer(short) :: jj ! temporary variable + integer(short) :: jcnode ! jc-th child node + integer(short) :: jrow ! a row in the front + integer(short) :: jvar ! a variable + integer(short) :: k ! temporary variable + integer(short) :: k1 ! temporary variable (used in scaling) + integer(short) :: k2 ! temporary variable (used in scaling) + integer(short) :: kk ! temporary variable + integer(long) :: klong ! temporary variable + integer(short) :: l ! temporary variable + integer(short) :: ld ! + integer(short) :: ldc ! number of delayed columns for child + integer(long) :: lfa ! size of array fa + integer(long) :: length ! total length of list to be read + integer(long) :: lnj,lnj1 ! used to compute flop count and factor entries + integer(short) :: lreals ! number of reals to be written +! Also length of array reals + integer(long) :: llreals ! + integer(long) :: ln ! set to (nfront*(nfront+1))/2 during factorize + integer(long) :: llong + integer(long) :: loc1 + integer(long) :: loc ! location in real or integer superfile when reading + integer(long) :: locw ! location in real or integer superfile when writing + integer(long) :: loci ! location in integer superfile + integer(long) :: locr ! location in super-real file + integer(long) :: lq ! set by call to ma64_factor + integer(short) :: lw54 ! length of array w54 + integer(short) :: lw64 ! length of array w64 + integer(short) :: lw + integer(long) :: maxstore + integer(short) :: maxlen ! In pos. def. case, holds copy of keep%maxlen +! In indef. case, set to keep%maxlen*control%multiplier + integer(short) :: mvar ! copy of keep%mvar + integer(short) :: nb ! set to control%nb54 or control%nb64 +! (or to nb54_default or nb64_default if out of range) + integer(short) :: nbi ! set to control%nbi +! (or to nbi_default if out of range) + integer(short) :: nfront ! order of frontal matrix to be factorized + integer(long) :: nfront_long ! order of frontal matrix to be factorized + integer(short) :: node ! node in tree + integer(short) :: nchild ! number of children + integer(short) :: n ! set to keep%n + integer(short) :: ncand ! number of variables that are candidates +! for elimination at node + integer(short) :: nelim_jc ! no. variables to be eliminated at child jcnode + integer(short) :: nelim ! number of eliminations performed at node + integer(short) :: non_leaf ! number of children of node that are not +! leaf nodes + integer(short) :: nout ! output unit for errors + integer(short) :: nout1 ! output unit for warnings + integer(short) :: nroot ! number of roots (components) of the tree + integer(short) :: nvar ! no. variables associated with node during analyse + integer(long) :: nvar_long ! no. variables associated with node +! during analyse + integer(long) :: posdiag ! points to end of storage for diagonal entries +! (initialised to keep%posfac) + integer(short) :: pnode ! parent node in tree + integer(short) :: root ! root node + integer(long) :: rtop ! points to the top of the main real stack + integer(long) :: rtopd ! points to the top of the real stack for +! delayed pivots (only needed in indefinite case) + integer(long) :: size_fa ! size of frontal array fa + integer(short) :: splitp ! split point at which space allocated for +! generated frontal matrix + integer(short) :: st ! stat parameter + integer(long) :: storage_indef + integer(long) :: temp(8) ! used to get counts of of01 reads/writes when +! solve follows factorization + + integer(long), allocatable :: dpos(:) ! used to pass info. +! on delayed pivots + integer(short), allocatable :: delay(:,:) ! Set so that +! delay(1,node) holds nfront-nelim where nfront is frontsize +! and nelim is no. of eliminations performed +! delay(2,node) holds number of delayed pivots ie ncand-nelim +! where ncand is no. of candidate pivots (no. of fully summed variables) + +! Possible error returns: +! -1 Allocation error +! -3 Error in sequence of calls +! -5 Error from of01 (error in Fortran inquire) +! -6 Error from of01 (error in Fortran read) +! -7 Error from of01 (error in Fortran open) +! -11 Problem found to be singular or unexpectedly not pos.def. +! -14 data for last element/row passed to MA77_input_reals was incomplete. +! -15 Error from of01 (error in Fortran write) +! -16 -17 Error from of01_read or of01_write (Fortran open failed +! for all path) +! -22 For one or more elements/rows, MA77_input_vars was called but +! no corresponding call was made to MA77_input_reals. +! -24 lx or nrhs out of range +! -29 pos_def = .true. but 2x2 pivots supplied to analyze +! -30 front size is too large +! -38 error in static +! -39 size(scale) too small +! -40 IEEE infinities found in the reduced matrix + +! +4 Problem found to be singular (control%action = .true.) + +! Temporary variables for timing +! real :: t1, t2, tfactor, t54, st1, st2, stfactor, st54, tmerge, stmerge +! tfactor = 0.0; t54 = 0.0; stfactor = 0.0; st54 = 0.0 +! tmerge = 0.0; stmerge = 0.0 + + lsolve = .true. + if (lx == 0 .and. nrhs == 0) lsolve = .false. + +! write(*,*) 'entering MA77_factor_solve with keep%status=', keep%status +! Perform appropriate printing + if (control%print_level >= 1 .and. control%unit_diagnostics >= 0) then + if (pos_def) then + if (lsolve) write (control%unit_diagnostics,'(//a)') & + ' Entering MA77_factor_solve with pos_def = .true. and :' + if (.not. lsolve) write (control%unit_diagnostics,'(//a)') & + ' Entering MA77_factor with pos_def = .true. and :' + write (control%unit_diagnostics,'(a,5(/a,i12))') & + ' control parameters (control%) :', & + ' print_level Level of diagnostic printing = ', & + control%print_level, & + ' unit_diagnostics Unit for diagnostics = ', & + control%unit_diagnostics, & + ' unit_error Unit for errors = ', & + control%unit_error, & + ' unit_warning Unit for warnings = ', & + control%unit_warning, & + ' nb54 Block size for HSL_MA54 = ', & + control%nb54 + else + write (control%unit_diagnostics,'(//a)') & + ' Entering MA77_factor with pos_def = .false. and :' + write (control%unit_diagnostics,& + '(a,6(/a,i12),6(/a,es12.4))') & + ' control parameters (control%) :', & + ' print_level Level of diagnostic printing = ', & + control%print_level, & + ' unit_diagnostics Unit for diagnostics = ', & + control%unit_diagnostics, & + ' unit_error Unit for errors = ', & + control%unit_error, & + ' unit_warning Unit for warnings = ', & + control%unit_warning, & + ' nb64 Block size for HSL_MA64 = ', & + control%nb64, & + ' nbi Inner block size for HSL_MA64 = ', & + control%nbi, & + ' small Small pivot size = ', & + control%small, & + ' static Static pivoting control = ', & + control%static, & + ' u Initial relative pivot tolerance = ', & + control%u, & + ' umin Minimum relative pivot tolerance = ', & + control%umin, & + ' multiplier Multiplier for increasing array sizes = ', & + control%multiplier, & + ' storage_indef Initial size for in-core array = ', & + real(control%storage_indef) + end if + if (lsolve) then + write (control%unit_diagnostics,'(a,i12/a,i12)') & + ' lx = ', & + lx, & + ' nrhs = ', & + nrhs + end if + end if + + keep%scale = 0 + if (present(scale)) then + if (control%print_level >= 1 .and. control%unit_diagnostics >= 0) & + write (control%unit_diagnostics,'(a)') & + ' Scaling factors supplied. ' + keep%scale = 1 + end if + + nout = control%unit_error + if (control%print_level < 0) nout = -1 + nout1 = control%unit_warning + if (control%print_level < 0) nout1 = -1 + if (lsolve) keep%name = 'MA77_factor_solve' + + info%flag = 0 + + info%nio_read(1) = keep%idata%nio_read + info%nio_read(2) = keep%rdata%nio_read + info%nio_write(1) = keep%idata%nio_write + info%nio_write(2) = keep%rdata%nio_write + info%nwd_read(1) = keep%idata%nwd_read + info%nwd_read(2) = keep%rdata%nwd_read + info%nwd_write(1) = keep%idata%nwd_write + info%nwd_write(2) = keep%rdata%nwd_write + +! Check status parameter (status = 3 is possible if restart has +! been called) + if (keep%status < 2) then + info%flag = -3 + call MA77_print_iflag(keep,nout,info%flag) + return + end if + + if (keep%n == 0) then + keep%status = 3; return + end if + +! check the last call to MA77_input_reals was complete. + if (keep%inelrs > 0) then +! data for last element/row not complete + info%flag = -14 + call MA77_print_iflag(keep,nout,info%flag) + return + end if + + keep%pos_def = pos_def + if (keep%pos_def) then + nb = control%nb54 +! check nb is valid ... if not, we will use our recommended value + if (nb < 1) nb = nb54_default +! take copy for use in solve phase + keep%nb = nb + if (keep%ntwo > 0) then +! 2x2 pivots supplied + info%flag = -29 + call MA77_print_iflag(keep,nout,info%flag) + return + end if + + else + +! Set up controls for HSL_MA64 + nb = control%nb64 + nbi = control%nbi +! check nbi is valid ... if not, we will use our recommended value + if (nbi <= 1) nbi = nbi_default + +! check nb is valid ... if not, we will use our recommended value + if (nb < 1) nb = nb64_default +! nb has to be a multiple of nbi. If necessary, reset to that it is. + if (nb/nbi*nbi /= nb) nb = max(nbi,nb/nbi*nbi) +! take copy for use in solve phase + keep%nb = nb + keep%nbi = nbi + cntl64%small = control%small + + cntl64%twos = .false. + if (keep%ntwo > 0) cntl64%twos = .true. + +! Check control%static + if (control%static < control%small .and. control%static /= zero) then + info%flag = -38 + call MA77_print_iflag(keep,nout,info%flag) + return + end if + cntl64%static = control%static + +! check threshold ... if out-of-range, use the default + cntl64%u = control%u + if (cntl64%u < zero .or. cntl64%u > one) cntl64%u = 0.01 + + cntl64%umin = control%umin + if (cntl64%umin < zero) cntl64%umin = zero + if (cntl64%umin > cntl64%u) cntl64%umin = cntl64%u + +! Check to see if the user is working in-core (note: if we are +! restarting the computation, keep%rwdelay is already allocated) + if (.not. allocated(keep%rwdelay)) then + maxstore = keep%maxstore + if (maxstore > 0_long) then + storage_indef = control%storage_indef +! user working in-core + if (storage_indef == 0_long) then + llong = max(1_long,maxstore/200_long) + storage_indef = llong*4 + end if + if (storage_indef > 0_long .and. & + keep%used + 2*storage_indef <= maxstore) then + deallocate (keep%rwdelay,stat=st) + allocate (keep%rwdelay(storage_indef),stat=st) + if (st == 0) then + keep%index(4) = -keep%index(4) + keep%used = keep%used + 2*storage_indef + keep%size_rwdelay = storage_indef + end if + end if + end if + end if + end if + + n = keep%n + + if (lsolve) then + if (lx < n .or. nrhs < 1) then + info%flag = -24 + keep%status = -1 + call MA77_print_iflag(keep,nout,info%flag) + if (nout >= 0) then + if (lx < n) write (nout,'(a,i8,a,i8)') & + ' Increase lx from ', lx, ' to at least ', n + if (nrhs < 1) write (nout,'(a,i8,a,i8)') & + ' nrhs must be at least 1. nrhs = ', nrhs + end if + return + end if + end if + + if (present(scale)) then + if (size(scale) < n) then + info%flag = -39 + call MA77_print_iflag(keep,nout,info%flag) + return + end if + if (lsolve) then +! scale right-hand sides + do i = 1,n + x(i,1:nrhs) = scale(i)*x(i,1:nrhs) + end do + end if + end if + +! Deallocate arrays used by analyse but no longer needed. + deallocate (keep%clist,stat=st) + deallocate (keep%arow,stat=st) + deallocate (keep%aelt,stat=st) + deallocate (keep%iptr,stat=st) + deallocate (keep%map,stat=st) + +! Allocate arrays needed by factorize + multiplier = one + if (.not. keep%pos_def) multiplier = max(control%multiplier, one) + mvar = keep%mvar + +! write (6,*) 'keep%index ',keep%index(1:4) + deallocate (fa,stat=st) + nfront_long = keep%maxfront + if (keep%pos_def) then + lfa = (nfront_long*(nfront_long+1))/2 + if (lfa > keep%lup) info%flag = -30 + maxlen = keep%maxlen + else + nfront_long = max(nfront_long,int(real(nfront_long,wp)*multiplier,long)) + lfa = (nfront_long*(nfront_long+nb+1)/2) + if (lfa > keep%lup) info%flag = -30 + maxlen = int(real(keep%maxlen,wp)*multiplier) + end if + if (info%flag == -30) then + call MA77_print_iflag(keep,nout,info%flag) + go to 25 + end if + + allocate (fa(lfa),stat=st) + + if (st /= 0) then +! if arrays are being used, we try and switch to using files + if (all(keep%index(1:4) > 0)) then +! files are being used so we have failed to allocate front + info%flag = -30; info%stat = st + call MA77_print_iflag(keep,nout,info%flag) + go to 25 + else +! at least one array is being used. +! Try and write the integers to file + if (keep%index(1) < 0) then + keep%index(1) = -keep%index(1) + loc1 = 1 + lw = int(keep%ifree,short) - 1 + call of01_write(keep%index(1),loc1,lw,keep%imain, & + flag,keep%idata,lp=-1) + if (flag < 0) then + info%iostat = keep%idata%iostat + info%stat = keep%idata%stat + info%flag = flag + if (flag == -17) info%flag = -16 + go to 25 + end if + keep%used = keep%used - size(keep%imain) + deallocate (keep%imain,stat=st) + allocate (fa(lfa),stat=st) + if (st == 0) go to 10 + end if +! Try switching reals to a file + if (keep%index(2) < 0) then + keep%index(2) = -keep%index(2) + loc1 = 1 + lw = int(keep%posfac,short) - 1 + call of01_write(keep%index(2),loc1,lw,keep%rmain, & + flag,keep%rdata,lp=-1) + if (flag < 0) then + info%iostat = keep%rdata%iostat + info%stat = keep%rdata%stat + info%flag = flag + if (flag == -17) info%flag = -16 + go to 25 + end if + keep%used = keep%used - size(keep%rmain)*2 + deallocate (keep%rmain,stat=st) + allocate (fa(lfa),stat=st) + if (st == 0) go to 10 + end if +! In the indefinite case, nothing +! yet written to the in-core arrays so switch to files + if (.not. keep%pos_def) then + if (keep%index(4) < 0) then + deallocate(keep%rwdelay,stat=st) + keep%index(4) = -keep%index(4) + keep%used = keep%used - 2*storage_indef + end if + allocate (fa(lfa),stat=st) + if (st == 0) go to 10 + end if +! Now try to write stack to file (at moment, nothing in the stack) + if (keep%index(3) < 0) then + keep%index(3) = -keep%index(3) + keep%used = keep%used - size(keep%rwork)*2 + deallocate (keep%rwork,stat=st) + allocate (fa(lfa),stat=st) + if (st == 0) go to 10 + end if +! Have not been able to allocate front + info%flag = -30; info%stat = st + call MA77_print_iflag(keep,nout,info%flag) + go to 25 + end if + end if +! frontal matrix has been allocated + 10 continue + size_fa = lfa + +! set keep%rfree and keep%ifree to point to where we will start writing +! factor data. Allow space for the entries of D to be held + posdiag = keep%posfac + inactive_fac = keep%posfac + n + if (.not. keep%pos_def) inactive_fac = inactive_fac + n + keep%rfree = inactive_fac + keep%ifree = keep%posint + +! If arrays are being used in place of files, we have to ensure +! that the entries keep%posfac:keep%rfree contain meaningful data +! (otherwise, problem if we switch to using a file) + if (keep%index(2) < 0) then +! use w54 as temporary array that we fill with zeros + deallocate (w54,stat=st) + lw54 = n + if (.not. keep%pos_def) lw54 = lw54 + n + allocate (w54(lw54),stat=st) + if (st /= 0) go to 20 + w54(1:lw54) = zero + call MA77_write_real(keep%index(2),keep%size_rmain,keep%rmain, & + posdiag,lw54,w54,flag,keep%rdata,-1,keep%maxstore,keep%used) + if (flag < 0) go to 15 + end if + + deallocate (w54,stat=st) + deallocate (w64,stat=st) + if (keep%pos_def) then + lw54 = max(nb,maxlen)*nb + if (lsolve .and. nrhs >= 4) lw54 = lw54 + keep%maxelim*nb + allocate (w54(lw54),stat=st) + if (st /= 0) go to 20 + else + lw64 = maxlen + maxlen*nb + allocate (w64(lw64),stat=st) + if (st /= 0) go to 20 + end if +! keep%maxelim_actual will hold actual max. number of eliminations at a node +! (only used in indef case but set in pos def case so not undefined) + keep%maxelim_actual = 0 + + deallocate (ip,stat=st) + allocate (ip(maxlen),stat=st) + if (st /= 0) go to 20 + + if (.not.keep%pos_def) then + deallocate (keep%size_ind,stat=st) + deallocate (dpos,stat=st) + deallocate (delay,stat=st) + allocate (keep%size_ind(keep%l1:keep%l2),dpos(keep%l1:keep%l2), & + delay(2,keep%l1:keep%l2),stat=st) + if (st /= 0) go to 20 + keep%size_ind = 0 + dpos = 0_long + delay = 0 + end if + lreals = max(mvar,maxlen) + + deallocate (rlist,stat=st) + deallocate (varlist,stat=st) + deallocate (reals,stat=st) + deallocate (pos,stat=st) + deallocate (map,stat=st) + deallocate (count,stat=st) + deallocate (cnode,stat=st) + + allocate (count(0:keep%maxdepth),cnode(1:keep%maxdepth),stat=st) + if (st /= 0) goto 20 + + allocate (reals(lreals),rlist(maxlen+1),varlist(maxlen), & + map(maxlen),pos(1:keep%n),stat=st) + if (st /= 0) go to 20 +! Initialise the array pos to zero + pos = 0 + + if (lsolve) then + deallocate (xlocal,stat=st) + allocate (xlocal(maxlen,nrhs),stat=st) + if (st /= 0) go to 20 + end if + +! initialise + info%detlog = zero + info%detsign = 1 + info%ndelay = 0 + info%num_neg = 0 + info%num_nothresh = 0 + info%num_perturbed = 0 + info%matrix_rank = n - keep%null + info%nfactor = 0_long + info%nflops = 0_long + info%ntwo = 0 + info%u = cntl64%u + +! info%wasted = 0 + + keep%maxfa = 0_long + keep%maxfrontb = 0 + keep%rtopmx = 1_long + keep%rtopdmx = 1_long + + nroot = size(keep%roots) + + do ir = 1, nroot + root = keep%roots(ir) +! Perform factorization for tree rooted at root. +! Initialise the top of the stack + rtop = 1; rtopd = 1 + node = root + depth = 1 + count(depth) = 0 ! no. of visited children +! Visit each node in depth-first search order + do while(depth.gt.0) + cnode(depth) = node +! Visit children + nchild = size(keep%tree(node)%child) + if (count(depth) < nchild) then + count(depth) = count(depth) + 1 + if (keep%tree(node)%child(count(depth)) > keep%nelt) then +! The next child of node is not a leaf node so descend to it + node = keep%tree(node)%child(count(depth)) + depth = depth + 1 + count(depth) = 0 + cycle + end if + end if + +! Perform work at node. Assemble contributions +! from any children of node that are leaf nodes +! and then perform the partial factorization of node. +! Then either stack the contribution from node or +! assemble it into its parent (node is the ic-th child of its parent) + + if (pos_def) then + if (present(scale)) then + call factorize54(node,scale) + else + call factorize54(node) + end if + if (info%flag < 0 .or. depth <= 1) exit + depth = depth - 1 + pnode = cnode(depth) + ic = count(depth) + call assemble54(pnode,node,ic,rtop) + else + if (present(scale)) then + call factorize64(node,rtopd,scale) + else + call factorize64(node,rtopd) + end if + if (info%flag < 0 .or. depth <= 1) exit + depth = depth - 1 + pnode = cnode(depth) + ic = count(depth) + call assemble64(pnode,node,ic,rtop) + end if + if (info%flag < 0) exit + +! Go to parent + node = pnode + + end do ! tree + +! If pos. def. case indicated but found to be indefinite, allow code to +! rerun by not seeing keep%status negative. + if (info%flag == -11 .and. pos_def) then + call MA77_print_iflag(keep,nout,info%flag,st=info%stat, & + ios=info%iostat) + go to 25 + end if + + if (info%flag < 0) then + keep%status = -1 + call MA77_print_iflag(keep,nout,info%flag,st=info%stat, & + ios=info%iostat) + go to 25 + end if + end do ! roots + + keep%dfree = posdiag + + info%storage(1) = max(keep%mx_ifree,keep%ifree-1) + info%storage(2) = keep%rfree - 1 + info%storage(3) = keep%rtopmx + if (.not.pos_def) info%storage(4) = keep%rtopdmx + info%minstore = info%storage(1) + & + 2*(info%storage(2) + info%storage(3) + info%storage(4)) + info%maxfront = keep%maxfrontb + info%index(1:4) = keep%index(1:4) + + info%nio_read(1) = keep%idata%nio_read - info%nio_read(1) + info%nio_read(2) = keep%rdata%nio_read - info%nio_read(2) + info%nio_write(1) = keep%idata%nio_write - info%nio_write(1) + info%nio_write(2) = keep%rdata%nio_write - info%nio_write(2) + info%nwd_read(1) = keep%idata%nwd_read - info%nwd_read(1) + info%nwd_read(2) = keep%rdata%nwd_read - info%nwd_read(2) + info%nwd_write(1) = keep%idata%nwd_write - info%nwd_write(1) + info%nwd_write(2) = keep%rdata%nwd_write - info%nwd_write(2) + + info%u = cntl64%u + if (info%num_nothresh > 0) info%u = zero + + if (pos_def) then +! superfiles with index(4) have not been used + info%index(4) = -keep%index(4) + end if + + if (info%flag == 4) call MA77_print_iflag(keep,nout1,info%flag) + + if (info%flag >= 0) go to 25 + +15 info%iostat = keep%rdata%iostat + info%stat = keep%rdata%stat + info%flag = flag + if (flag == -17) info%flag = -16 + go to 25 + +20 if (st /= 0) then + info%flag = -1; keep%status = -1 + info%stat = st + call MA77_print_iflag(keep,nout,info%flag,st=info%stat) + end if + + 25 deallocate (reals,stat=st) + deallocate (map,stat=st) + deallocate (pos,stat=st) + deallocate (rlist,stat=st) + deallocate (varlist,stat=st) + deallocate (fa,stat=st) + deallocate (xlocal,stat=st) + deallocate (w64,stat=st) + deallocate (dpos,stat=st) + deallocate (delay,stat=st) + deallocate (count,stat=st) + deallocate (cnode,stat=st) + deallocate (ip,stat=st) + + keep%flag = info%flag + if (info%flag < 0) return + keep%status = 3 + +! Do back subs if lsolve = .true. + if (lsolve) then + + if (control%print_level >= 1 .and. control%unit_diagnostics >= 0) & + write (control%unit_diagnostics,'(/a,i8,a)') & + ' Factorisation complete. Solving for ',nrhs,' right-hand sides' + temp(1:2) = info%nio_read(1:2) + temp(3:4) = info%nio_write(1:2) + temp(5:6) = info%nwd_read(1:2) + temp(7:8) = info%nwd_write(1:2) + + if (present(scale)) then + if (pos_def) then + call MA77_solve(nrhs,lx,x,keep,control,info,scale=scale,job=3) + else + call MA77_solve(nrhs,lx,x,keep,control,info,scale=scale,job=4) + end if + else + if (pos_def) then + call MA77_solve(nrhs,lx,x,keep,control,info,job=3) + else + call MA77_solve(nrhs,lx,x,keep,control,info,job=4) + end if + end if + deallocate (w54,stat=st) + + info%nio_read(1:2) = temp(1:2) + info%nio_read(1:2) + info%nio_write(1:2) = temp(3:4) + info%nio_write(1:2) + info%nwd_read(1:2) = temp(5:6) + info%nwd_read(1:2) + info%nwd_write(1:2) = temp(7:8) + info%nwd_write(1:2) + if (info%flag == 0) info%flag = keep%flag + end if + +! write (6,'(A,F12.3)') 'CPU time for calls to ma54_factor = ', tfactor +! write (6,'(A,F12.3)') 'Wall time for calls to ma54_factor = ', stfactor + +! write (6,'(A,F12.3)') 'CPU time for calls to block form = ', t54 +! write (6,'(A,F12.3)') 'Wall time for calls to block form = ', st54 + + if (control%print_level >= 1 .and. control%unit_diagnostics >= 0) then + if (lsolve) then + write (control%unit_diagnostics,'(/a)') & + ' Completed factorisation and solve with:' + else + write (control%unit_diagnostics,'(/a)') & + ' Completed factorisation with:' + end if + write (control%unit_diagnostics, & + '(a,2(/a,i12),3(/a,es12.4),4(/a/2es12.4),5(/a,i12))') & + ' information parameters (info%) :', & + ' flag Error flag = ', & + info%flag, & + ' maxfront Maximum frontsize = ', & + info%maxfront, & + ' nfactor Number of entries in L = ', & + real(info%nfactor), & + ' nflops Number of flops performed = ', & + real(info%nflops), & + ' minstore Storage used in superfiles = ', & + real(info%minstore), & + ' nio_read(1:2) Number of records read from disk by OF01_read = ',& + real(info%nio_read(1:2)), & + ' nio_write(1:2) Number of records written to disk by OF01_write = ',& + real(info%nio_write(1:2)), & + ' nwd_read(1:2) Number of scalars read by OF01_read = ', & + real(info%nwd_read(1:2)), & + ' nwd_write(1:2) Number of scalars written by OF01_write = ', & + real(info%nwd_write(1:2)), & + ' ntwo Number of 2x2 pivots used = ', & + info%ntwo, & + ' ndelay Number of delayed eliminations = ', & + info%ndelay, & + ' rank Computed rank = ', & + info%matrix_rank, & + ' num_neg Computed number of negative eigenvalues = ', & + info%num_neg, & + ' num_nothresh Pivots did not satisfy input threshold criteria = ', & + info%num_nothresh + + if (info%num_perturbed == 0) then + write (control%unit_diagnostics,'(a,es12.4)') & + ' threshold parameter used (info%u) = ', & + info%u + else + write (control%unit_diagnostics,'(a,i12)') & + ' number of perturbed pivots (info%num_perturbed) = ', & + info%num_perturbed + end if + end if + +contains + +!******************************* + + subroutine factorize54(node,scale) +! This subroutine assembles contributions from any children of node +! that are leaf nodes and then performs the partial factorization at node +! (pos definite case). + + integer(short), intent(in) :: node ! node in tree + real(wp), intent(in), optional :: scale(*) + +! Possible error returns: +! -1 Allocation error +! -5 Error from of01 (error in Fortran inquire) +! -6 Error from of01 (error in Fortran read) +! -7 Error from of01 (error in Fortran open) +! -11 Problem found to be not pos.def. +! -15 Error from of01 (error in Fortran write) +! -16 -17 Error from of01_read or of01_write (Fortran open failed +! for all path) +! -22 For one or more elements/rows, MA77_input_vars was called but +! no corresponding call was made to MA77_input_reals. + + nvar = abs(keep%size(node)) + if (nvar == 0) return +! If node is a leaf, immediate return. + if (node <= keep%nelt) return + + nvar_long = nvar + nfront = nvar; nfront_long = nvar + ln = (nfront_long*(nfront_long+1))/2 +! set ip1 to point to first location in fa that will be used for front at node + ip1 = 1 + size_fa - ln + lfa = ln + + nchild = size(keep%tree(node)%child) + non_leaf = nchild +! In element case, add up the number of children of node that are leaf nodes +! .... they are the last children (in row case, leaf nodes are original +! rows and they are not part of the tree) + if (keep%element_input) then + if (nchild == 0) return + do i = nchild,1,-1 + jcnode = keep%tree(node)%child(i) + if (jcnode > keep%nelt) exit + end do + non_leaf = i + end if +! If all the children of node are leaf children, initialize front + if (non_leaf == 0) fa(ip1:ip1+lfa-1) = zero + +! Read the variable list for node into rlist. + loc = keep%ifile(node) + call MA77_read_integer(keep%index(1),keep%imain,loc,nvar,& + rlist,flag,keep%idata,-1) + if (flag < 0) go to 480 + do i = 1,nvar + ivar = rlist(i) + pos(ivar) = i + end do + +! In element case, must now deal with children that are leaf nodes +! and in row case, deal with original rows + +! Set ip(j) to point to start of col j in array fa. + ip(1) = ip1 + do j = 2,nvar + ip(j) = ip(j-1) + nvar - j + 2 + end do + + if (keep%element_input) then + do ic = non_leaf+1,nchild + jcnode = keep%tree(node)%child(ic) +! Check reals were entered. + if (keep%rfile(jcnode) == -1 .and. keep%size(jcnode) /= 0) then +! User has not entered required reals + info%flag = -22; return + end if + loc = keep%ifile(jcnode) + cnvar = abs(keep%size(jcnode)) + call MA77_read_integer(keep%index(1),keep%imain,loc,cnvar, & + varlist,flag,keep%idata,-1) + if (flag < 0) go to 480 +! Set mapping from jcnode into the front using array pos. + do j = 1,cnvar + k = varlist(j) + map(j) = pos(k) + end do + +! Read reals from main file one column at a time + loc = cnvar + loc = keep%rfile(jcnode) - (loc*loc+loc)/2 + do j = 1,cnvar + lreals = cnvar - j + 1 + call MA77_read_real(keep%index(2),keep%rmain,loc,lreals, & + reals,flag,keep%rdata,-1) + if (flag < 0) go to 480 + +! Add the reals from the original element into the front (optionally scale) + k = 1 + jj = map(j) + if (present(scale)) then + k1 = varlist(j) + do i = j, cnvar + ii = map(i) + if (ii >= jj) then + klong = ip(jj) + ii - jj + else + klong = ip(ii) + jj - ii + end if + k2 = varlist(i) + reals(k) = scale(k1)*reals(k)*scale(k2) + fa(klong) = fa(klong) + reals(k) + k = k + 1 + end do + else + do i = j, cnvar + ii = map(i) + if (ii >= jj) then + klong = ip(jj) + ii - jj + else + klong = ip(ii) + jj - ii + end if + fa(klong) = fa(klong) + reals(k) + k = k + 1 + end do + end if + loc = loc + lreals + end do + end do + + else +! For row entry, add into the front the original rows corresponding +! to the eliminated variables. + do j = 1, keep%tree(node)%nelim + jcnode = rlist(j) + cnvar = abs(keep%size(jcnode)) + if (cnvar == 0) cycle + if (keep%rfile(jcnode) == -1) then +! User has not entered required reals + info%flag = -22; return + end if + loc = keep%ifile(jcnode) +! Read in the variable list for row jcnode and its reals + call MA77_read_integer(keep%index(1),keep%imain,loc,cnvar,varlist,& + flag,keep%idata,-1) + if (flag < 0) go to 480 +! Recall that keep%rfile(jcnode) points to position in the main reals +! file after the last entry in the list of reals for jcnode + loc = keep%rfile(jcnode) - cnvar + call MA77_read_real(keep%index(2),keep%rmain,loc,cnvar,reals,flag,& + keep%rdata,-1) + if (flag < 0) go to 480 + +! Loop over entries in the row jcnode, putting +! them into row/col j of the frontal matrix (lower triangular part). +! ipp points to start of col. j + jlong = j + ipp = ip1 + (nvar_long+1)*(jlong-1) - (jlong*(jlong-1))/2 + if (present(scale)) then + k1 = jcnode + do jj = 1, cnvar + k2 = varlist(jj) + i = pos(k2) + if (i < j) cycle +! Put entry into col j, row i. + reals(jj) = scale(k1)*reals(jj)*scale(k2) + fa(ipp+i-j) = fa(ipp+i-j) + reals(jj) + end do + else + do jj = 1, cnvar + k2 = varlist(jj) + i = pos(k2) + if (i < j) cycle +! Put entry into col j, row i. + fa(ipp+i-j) = fa(ipp+i-j) + reals(jj) + end do + end if + end do + end if + +! Restore pos to zero + do i = 1,nvar + ivar = rlist(i) + pos(ivar) = 0 + end do + +! Have now assembled the frontal matrix and are ready to factorize it. +! It is of order nfront=nvar, held in lower triangular packed form + + nelim = keep%tree(node)%nelim + keep%maxfrontb = max(keep%maxfrontb,nfront) + +! call cpu_time(t1) +! call mysystem_clock(st1) + +! Rearrange to block hybrid form and Cholesky factorization of nelim columns + + call ma54_to_block(nfront,nelim,nb,fa(ip1:ip1+lfa-1),w54,flag) + + call ma54_factor(nfront,nelim,nb,fa(ip1:ip1+lfa-1),w54,flag) + + if (flag > 0) then +! Matrix not positive definite. error return -11 +! write (6,*) 'error from ma54_factor. flag = ',flag,nfront,nelim + info%flag = -11 + go to 500 + end if + + lreals = (nelim*nelim+nelim)/2 + nelim*(nfront-nelim) +! write (6,'(a,6i6)') & +! 'node,nfront,ncand,nelim,delay ',node,nfront,nelim,nelim,nelim-nelim + + if (nelim > 0) then + +! obtain the diagonal entries and store in main real file + call ma54_diag(nfront,nelim,nb,fa(ip1:ip1+lfa-1),w54) + locw = posdiag + call MA77_write_real(keep%index(2),keep%size_rmain,keep%rmain, & + locw,nelim,w54,flag,keep%rdata,-1,keep%maxstore, & + keep%used,inactive=keep%posfac) + if (flag < 0) go to 480 + posdiag = posdiag + nelim +! Compute the determinant + do k = 1,nelim + info%detlog = info%detlog + log(abs(w54(k))) + if (w54(k) < 0) info%detsign = -info%detsign + end do + +! Store factor in fa(ip1:ip1+lreals-1) to the main file. + lreals = nfront + ipp = ip1 + locw = keep%rfree + do j = 1,nelim + call MA77_write_real(keep%index(2),keep%size_rmain,keep%rmain, & + locw,lreals,fa(ipp:ipp+lreals-1),flag,keep%rdata,-1, & + keep%maxstore,keep%used,inactive=inactive_fac) + if (flag < 0) go to 480 + locw = locw + lreals + ipp = ipp + lreals + lreals = lreals - 1 + end do + +! Update keep%maxfa to hold the longest factor entry written + llreals = nelim + llreals = (llreals*llreals+llreals)/2 + llreals*(nfront-llreals) + keep%maxfa = max(keep%maxfa,llreals) + +! Set info%nfactor to hold no. of entries in factor (long integers needed) + lnj = nelim + lnj1 = nfront - nelim + llreals = (lnj*lnj+lnj)/2_long + lnj*lnj1 + keep%rfree = keep%rfree + llreals + info%nfactor = info%nfactor + llreals + + lnj = nfront + info%nflops = info%nflops + & + (lnj*(lnj+1)*(2_long*lnj+1))/6_long + lnj = nfront - nelim + info%nflops = info%nflops - & + (lnj*(lnj+1)*(2_long*lnj+1))/6_long + + end if + +! Partial factorization complete. + +!!!!!!! +! If x was supplied then perform the forward subs. + if (lsolve .and. nelim > 0) then + if (size(xlocal,1) < nfront) then + deallocate (xlocal,stat=st) + allocate (xlocal(nfront,nrhs),stat=st) + if (st /= 0) go to 490 + end if + do i = 1,nfront + jvar = rlist(i) + xlocal(i,1:nrhs) = x(jvar,1:nrhs) + end do + if (nrhs >= 4) then + call ma54_forward2(nfront,nelim,nb,nrhs,fa(ip1:ip1+lfa-1), & + xlocal,maxlen,nb,w54,flag) + else + do j = 1, nrhs + call ma54_forward1(nfront,nelim,nb,fa(ip1:ip1+lfa-1), & + xlocal(:,j),flag) + end do + end if + do i = 1, nfront + jvar = rlist(i) + x(jvar,1:nrhs) = xlocal(i,1:nrhs) + end do +! if (flag /= 0) then +! write (6,*) 'error forward: flag=', flag +! stop +! end if + end if + +!!!!! + if (info%flag >= 0) go to 500 + +480 info%iostat = keep%rdata%iostat + info%stat = keep%rdata%stat + info%flag = flag + if (flag == -17) info%flag = -16 + go to 500 + +490 info%flag = -1 + info%stat = st + go to 500 + +500 continue + info%index(1:4) = keep%index(1:4) +! files not used for work array + info%index(4) = -keep%index(4) + return + + end subroutine factorize54 +!******************************* + + subroutine assemble54(node,cnode,ic,rtop) + +! This subroutine either stacks the contribution from cnode +! or assembles it into its parent node. cnode is the ic-th child of node. + + integer(short), intent(in) :: node ! node in tree + integer(short), intent(in) :: cnode ! child of node + integer(short), intent(in) :: ic ! position of ic in sibling list + integer(long), intent(inout) :: rtop ! points to top of main real stack + +! Possible error returns: +! -1 Allocation error +! -5 Error from of01 (error in Fortran inquire) +! -6 Error from of01 (error in Fortran read) +! -7 Error from of01 (error in Fortran open) +! -15 Error from of01 (error in Fortran write) +! -16 -17 Error from of01_read or of01_write (Fortran open failed +! for all path) + + nchild = size(keep%tree(node)%child) + non_leaf = nchild +! In element case, add up the number of children of node that are leaf nodes + if (keep%element_input) then + if (nchild == 0) return + do i = nchild,1,-1 + jcnode = keep%tree(node)%child(i) + if (jcnode > keep%nelt) exit + end do + non_leaf = i + end if + +! set ipc to point to first location in fa that was used for cnode + cnvar = keep%size(cnode) - keep%tree(cnode)%nelim + length = cnvar + length = (length*length + length)/2 + ipc = 1 + size_fa - length + + nvar = abs(keep%size(node)) + nfront = nvar + nvar_long = nvar + ln = (nvar_long*nvar_long + nvar_long)/2 +! set ip1 to point to first location in fa that will be used for front at node + ip1 = 1 + size_fa - ln + lfa = ln + splitp = keep%splitp(node) +! If we are not yet at the split point, write generated element for cnode onto +! top of the real stack and return + if (ic < splitp) then + locw = rtop + lreals = cnvar + ipp = ipc + do j = 1,cnvar + call MA77_write_real(keep%index(3),keep%size_rwork,keep%rwork, & + locw,lreals,fa(ipp:ipp+lreals-1),flag,keep%rdata,-1, & + keep%maxstore,keep%used) + if (flag < 0) go to 480 + ipp = ipp + lreals + locw = locw + lreals + lreals = lreals - 1 + end do +! Adjust top of stack + rtop = rtop + length + keep%rtopmx = max(keep%rtopmx,rtop) + return + end if + +! Read the variables for node from the main integer superfile. + loc = keep%ifile(node) + call MA77_read_integer(keep%index(1),keep%imain,loc,nvar,& + rlist,flag,keep%idata,-1) + if (flag < 0) go to 480 + do i = 1,nvar + ivar = rlist(i) + pos(ivar) = i + end do + +! Set ip(j) to point to start of col j in array fa. + ip(1) = ip1 + do j = 2,nvar + ip(j) = ip(j-1) + nvar - j + 2 + end do + +! read integer list for cnode from main integer file + loc = keep%ifile(cnode) + keep%tree(cnode)%nelim + call MA77_read_integer(keep%index(1),keep%imain,loc,cnvar, & + varlist,flag,keep%idata,-1) + if (flag < 0) go to 480 +! Set mapping from cnode into the front + do j = 1,cnvar + k = varlist(j) + map(j) = pos(k) + end do + + if (ic == splitp .or. ic == non_leaf) then + if (cnvar /= nvar) then +! Expand cnode into the front + j1 = 1 + do j = 1,cnvar + j2 = map(j) +! col. j of cnode maps to col. j2 of front +! set cols j1:j2-1 of front to zero + fa(ip(j1):ip(j2)-1) = zero +! Expand col. j of cnode into col. j2 of front. +! col j of cnode is currently at col k=j+nvar-cnvar of front + k = j + nvar - cnvar + if (j2 /= k) then + ipj2 = ip(j2) + ipk = ip(k) + fa(ipj2:ip(j2+1)-1) = zero + do l = j,cnvar + i = map(l) + fa(ipj2+i-j2) = fa(ipk+l-j) + end do + else +! j2 = k, so all columns are now in place + j1 = nvar + 1 + exit + end if + j1 = j2 + 1 + end do +! Check final cols are set to 0. + klong = size_fa + if (j1 <= nvar) fa(ip(j1):klong) = zero + end if + end if + + if (ic == splitp) then +! At split point. +! Merge children 1:splitp-1 into rows/columns 1:nfront of frontal matrix + do 160 jc = splitp-1, 1, -1 + jcnode = keep%tree(node)%child(jc) + nelim_jc = keep%tree(jcnode)%nelim + loc = keep%ifile(jcnode) + nelim_jc + cnvar = keep%size(jcnode) - nelim_jc + call MA77_read_integer(keep%index(1),keep%imain,loc,cnvar, & + varlist,flag,keep%idata,-1) + if (flag < 0) go to 480 +! Set mapping from jcnode into the front using array pos (length n) + do j = 1,cnvar + k = varlist(j) + map(j) = pos(k) + end do +! Read in reals for child from the top of stack, one col. at a time, +! using map to read directly into the front. + length = cnvar + length = (length*length + length)/2 + loc = rtop - length + lreals = cnvar +! move pointer to top of stack + rtop = loc + do j = 1, cnvar + ilong = map(j) + ipp = ip1 + nvar_long*(ilong-1) - (ilong*(ilong-1))/2 + call MA77_read_discard_real(keep%index(3),keep%rwork,loc,lreals,& + fa(ipp:ipp+nvar-1),flag,keep%rdata,-1,map=map(j:cnvar)) + if (flag < 0) go to 480 + loc = loc + lreals + lreals = lreals - 1 + end do +! End of loop over children +160 continue + +! At this point fa holds the reals in the frontal matrix in packed form. +! If split point is not also last non-leaf child, write fa onto the stack + if (ic /= non_leaf) then + lreals = nvar + loc = rtop + ipp = ip1 + do j = 1,nvar + call MA77_write_real(keep%index(3),keep%size_rmain,keep%rwork, & + loc,lreals,fa(ipp:ipp+lreals-1),flag,keep%rdata,-1, & + keep%maxstore,keep%used) + if (flag < 0) go to 480 + ipp = ipp + lreals + loc = loc + lreals + lreals = lreals - 1 + end do + rtop = rtop + (nvar_long*nvar_long+nvar_long)/2 + keep%rtopmx = max(keep%rtopmx,rtop) + end if + + else if (ic < non_leaf) then +! We have passed split point and not yet reached last non-leaf child. +! The reals for jcnode are still in fa. +! Loop over the cols of cnode, merging the child into its parent. + do j = 1,cnvar + i = map(j) +! Read column i of the frontal matrix from the stack. Find its position. + loc = rtop - (nvar*nvar+nvar)/2 +! loc now points to the first entry in the front on the stack. +! Set loc to point to first entry in col. i and +! lreals to number of entries in col. i. + loc = loc + nvar*(i-1) - ((i-2)*(i-1))/2 + lreals = nvar - i + 1 + call MA77_read_real(keep%index(3),keep%rwork,loc,lreals,reals,& + flag,keep%rdata,-1) + if (flag < 0) go to 480 +! ipp points to start of col. j of jcnode, which is held in fa + jlong = j + ipp = ipc + cnvar*(jlong-1) - ((jlong-2)*(jlong-1))/2 + do k = j,cnvar + kk = map(k) + reals(1+kk-i) = reals(1+kk-i) + fa(ipp+k-j) + end do +! Write the updated reals back onto the stack + call MA77_write_real(keep%index(3),keep%size_rmain,keep%rwork, & + loc,lreals,reals,flag,keep%rdata,-1,keep%maxstore,keep%used) + if (flag < 0) go to 480 + end do + + else if (ic == non_leaf) then +! Dealing with last non-leaf child (and it is not split point) +! Read frontal matrix from top of stack, one column at a time and add +! in with last non-leaf child (which we have already expanded in fa). + loc = rtop - (nvar_long*nvar_long+nvar_long)/2 + rtop = loc + ipp = ip1 + lreals = nvar + do j = 1,nvar + call MA77_read_discard_real(keep%index(3),keep%rwork,loc,& + lreals,reals,flag,keep%rdata,-1) + if (flag < 0) go to 480 + fa(ipp:ipp+lreals-1) = fa(ipp:ipp+lreals-1) + reals(1:lreals) + ipp = ipp + lreals + loc = loc + lreals + lreals = lreals - 1 + end do + + end if + + if (info%flag >= 0) return + +480 info%iostat = keep%rdata%iostat + info%stat = keep%rdata%stat + info%flag = flag + if (flag == -17) info%flag = -16 + + end subroutine assemble54 + +!*********************************************** + + subroutine factorize64(node,rtopd,scale) +! This subroutine assembles contributions from any children of node +! that are leaf nodes, adds in contributions from delayed +! pivots and then performs the partial factorization at node +! (indefinite case). + + integer(short), intent(in) :: node ! node in tree + integer(long) :: rtopd ! points to the top of the real stack for +! delayed pivots (only needed in indefinite case) + real(wp), intent(in),optional :: scale(*) + +! Possible error returns: +! -1 Allocation error +! -5 Error from of01 (error in Fortran inquire) +! -6 Error from of01 (error in Fortran read) +! -7 Error from of01 (error in Fortran open) +! -11 Problem found to be singular. +! -15 Error from of01 (error in Fortran write) +! -16 -17 Error from of01_read or of01_write (Fortran open failed +! for all path) +! -22 For one or more elements/rows, MA77_input_vars was called but +! no corresponding call was made to MA77_input_reals. +! -30 Front size too large + + nvar = abs(keep%size(node)) + if (nvar == 0) return +! If node is a leaf, immediate return. + if (node <= keep%nelt) return + + nvar_long = nvar + ln = (nvar_long*(nvar_long+1))/2 + ip1 = 1 + size_fa - ln + + nchild = size(keep%tree(node)%child) + non_leaf = nchild + +! In element case, add up the number of children that are leaf nodes +! .... they are the last children (in row case, leaf nodes are original +! rows and they are not part of the tree) + if (keep%element_input) then + if (nchild == 0) return + do i = nchild,1,-1 + jcnode = keep%tree(node)%child(i) + if (jcnode > keep%nelt) exit + end do + non_leaf = i + end if + +! If node has no non-leaf children, initialize front + cdelay = 0 + if (non_leaf == 0) then + fa(ip1:ip1+ln-1) = zero + else +! Add up number of delayed cols being passed up the children + do j = 1,non_leaf + jcnode = keep%tree(node)%child(j) + cdelay = cdelay + delay(2,jcnode) + end do + end if + nfront = nvar + cdelay + nfront_long = nfront + lfa = (nfront_long*(nfront_long+nb+1))/2 + +! Read the variables for node from the main integer superfile into +! the end of rlist and set mapping into front + loc = keep%ifile(node) + call MA77_read_integer(keep%index(1),keep%imain,loc,nvar,& + rlist(cdelay+1:cdelay+nvar),flag,keep%idata,-1) + if (flag < 0) go to 480 + do i = 1,nvar + ivar = abs(rlist(cdelay+i)) + pos(ivar) = i + end do + +! In element case, must now deal with children that are leaf nodes +! and in row case, deal with original rows + +! Set ip(j) to point to start of jth col. + ip(1) = ip1 + do j = 2,nvar + ip(j) = ip(j-1) + nvar - j + 2 + end do + if (keep%element_input) then + do ic = non_leaf+1,nchild + jcnode = keep%tree(node)%child(ic) +! Check reals were entered. + if (keep%rfile(jcnode) == -1 .and. keep%size(jcnode) /= 0) then +! User has not entered required reals + info%flag = -22; return + end if + loc = keep%ifile(jcnode) + cnvar = abs(keep%size(jcnode)) + call MA77_read_integer(keep%index(1),keep%imain,loc,cnvar, & + varlist,flag,keep%idata,-1) + if (flag < 0) go to 480 +! Set mapping from jcnode into the front using array pos. + do j = 1,cnvar + k = varlist(j) + map(j) = pos(k) + end do + +! Read reals from main file one column at a time + loc = cnvar + loc = keep%rfile(jcnode) - (loc*loc+loc)/2 + do j = 1,cnvar + inelrs = cnvar - j + 1 + call MA77_read_real(keep%index(2),keep%rmain,loc,inelrs, & + reals,flag,keep%rdata,-1) + if (flag < 0) go to 480 + +! Add the reals from the original element into the front + k = 1 + jj = map(j) + if (present(scale)) then + k1 = varlist(j) + do i = j, cnvar + ii = map(i) + if (ii >= jj) then + klong = ip(jj) + ii - jj + else + klong = ip(ii) + jj - ii + end if + k2 = varlist(i) + reals(k) = scale(k1)*reals(k)*scale(k2) + fa(klong) = fa(klong) + reals(k) + k = k + 1 + end do + else + do i = j, cnvar + ii = map(i) + if (ii >= jj) then + klong = ip(jj) + ii - jj + else + klong = ip(ii) + jj - ii + end if + fa(klong) = fa(klong) + reals(k) + k = k + 1 + end do + end if + loc = loc + inelrs + end do + end do + + else +! For row entry, add into the front the original rows corresponding +! to the eliminated variables. + do j = 1, keep%tree(node)%nelim + jcnode = abs(rlist(cdelay+j)) + cnvar = abs(keep%size(jcnode)) + if (cnvar == 0) cycle + if (keep%rfile(jcnode) == -1) then +! User has not entered required reals + info%flag = -22; return + end if + loc = keep%ifile(jcnode) +! Read in the variable list for row jcnode and its reals + call MA77_read_integer(keep%index(1),keep%imain,loc,cnvar,varlist,& + flag,keep%idata,-1) + if (flag < 0) go to 480 +! Recall that keep%rfile(jcnode) points to position in the main reals +! file after the last entry in the list of reals for jcnode + loc = keep%rfile(jcnode) - cnvar + call MA77_read_real(keep%index(2),keep%rmain,loc,cnvar,reals,flag,& + keep%rdata,-1) + if (flag < 0) go to 480 + +! Loop over entries in the row jcnode, putting +! them into col j of the frontal matrix (lower triangular part). +! ipp points to start of col. j + jlong = j + ipp = ip1 + (nvar_long+1)*(jlong-1) - (jlong*(jlong-1))/2 + if (present(scale)) then + k1 = jcnode + do jj = 1, cnvar + k2 = varlist(jj) + i = pos(k2) + if (i < j) cycle +! Put entry into col j, row i. + reals(jj) = scale(k1)*reals(jj)*scale(k2) + fa(ipp+i-j) = fa(ipp+i-j) + reals(jj) + end do + else + do jj = 1, cnvar + k2 = varlist(jj) + i = pos(k2) + if (i < j) cycle +! Put entry into col j, row i. + fa(ipp+i-j) = fa(ipp+i-j) + reals(jj) + end do + end if + end do + end if + +! All children dealt with. +! We have to put the delayed columns into first columns of frontal matrix. +! Read in integer and real data corresponding to delayed pivots +! from the integer and real delay stacks + nchild = size(keep%tree(node)%child) + ld = 1 + nfront_long = nfront + ln = (nfront_long*(nfront_long+1))/2 + ip1 = 1 + size_fa - ln + ipp = ip1 + k = 1 +! write (6,*) 'node,nfront,size_fa,ln,ip1', & +! node,nfront,size_fa,ln,ip1 + do jc = nchild, 1, -1 + jcnode = keep%tree(node)%child(jc) + if (jcnode <= keep%nelt) cycle + ldc = delay(2,jcnode) +! cycle if no delayed pivots for jcnode. + if (ldc == 0) cycle + cnvar = delay(1,jcnode) + +! Read delayed variables from integer file into varlist + loci = dpos(jcnode) + call MA77_read_integer(keep%index(1),keep%imain,loci,cnvar,varlist,& + flag,keep%idata,-1) + if (flag < 0) go to 480 +! write (6,*) 'read: ldc,loci,varlist',ldc,loci,varlist(1:cnvar) +! Copy indices for the delayed pivots at jcnode into start of rlist + rlist(k:k+ldc-1) = varlist(1:ldc) + k = k + ldc +! Set mapping between the other variables in delayed cols and current front + + if (cnvar > size(map)) then + deallocate (map,stat=st) + allocate (map(cnvar),stat=st) + if (st /= 0) go to 490 + end if + do j = ldc+1,cnvar + jj = varlist(j) + map(j) = pos(jj) + end do + lreals = cnvar + ilong = ldc + locr = rtopd - (ilong*(cnvar-ilong) + (ilong*ilong+ilong)/2) +! Reset top of real stack and then read in reals one column at a time +! and put into the start of the frontal matrix. + rtopd = locr + do i = 1, ldc + call MA77_read_discard_real(keep%index(4),keep%rwdelay,locr,& + lreals,reals,flag,keep%rdata,-1) + if (flag < 0) go to 480 +! ipp is start of column ld in array fa +! write (6,*) 'ipp,ldc,i,ld,ipp+ldc-i+1,ipp+nfront-ld', & +! ipp,ldc,i,ld,ipp+ldc-i+1,ipp+nfront-ld + fa(ipp:ipp+ldc-i) = reals(1:ldc-i+1) +! Set zeros in the rest of the col. to zero + fa(ipp+ldc-i+1:ipp+nfront-ld) = zero + +! Use map to put the remaining entries into the front + ipp = ipp + cdelay - ld + l = ldc - i + 1 + do ii = ldc+1,cnvar + jrow = map(ii) + l = l + 1 + fa(ipp+jrow) = reals(l) + end do + locr = locr + lreals + lreals = lreals - 1 + ipp = ipp + nvar + 1 + ld = ld + 1 + end do + + end do + +! Reset pos to zero + do i = 1,nvar + ivar = abs(rlist(cdelay+i)) + pos(ivar) = 0 + end do +!!!!(we want to use negative sign in rlist to indicate 2x2 pivot) + + continue + + keep%maxfrontb = max(keep%maxfrontb,nfront) + +! Have now added the leaf nodes and the delayed +! columns into the frontal matrix and are ready to factorize it. +! It is of order nfront, held in lower triangular packed form +! Let ncand be no. of potential pivots + + ncand = keep%tree(node)%nelim + cdelay + +! nelim will be the number of eliminations actually performed. +! reals is used to hold the inverse of the block diagonal +! in the LDL^T factorization. It must be length 2*ncand + i = 2*ncand + if (size(reals) < i) then + deallocate (reals,stat=st) + allocate(reals(max(i,int(multiplier*i))),stat=st) + if (st /= 0) go to 490 + end if + i = nfront + nfront*nb + if (size(w64) < i) then + deallocate (w64,stat=st) + allocate(w64(max(i,int(multiplier*i))),stat=st) + if (st /= 0) go to 490 + end if + +! varlist will be used to hold the ma64 array perm +! If we want to flag up 2x2 pivots, then we do this using varlist here +! check whether 2x2 pivots were supplied + if (keep%ntwo > 0) then + do i = 1,cdelay + varlist(i) = 1 + end do + k = cdelay + 1 + do i = cdelay+1,ncand + varlist(k) = rlist(k) + if (rlist(k) < 0) then +! reset sign + rlist(k) = -rlist(k) +! ensure negative flag for the partner + varlist(k+1) = -rlist(k+1) + k = k + 1 + end if + k = k + 1 + if (k > ncand) exit + end do + end if + +! write (6,*) 'Before MA64: nfront,nvar,ncand,nb,nbi,lfa,cdelay',& +! nfront,nvar,ncand,nb,nbi,lfa,cdelay +! write (6,*) 'rlist',rlist(1:nfront) +! write (6,*) 'varlist',varlist(1:ncand) + +! write (6,*) 'ip1,ln,ip1+ln-lfa,size_fa',& +! ip1,ln,ip1+ln-lfa,size_fa +! if (cdelay > 0) then +! write (6,'(4(es12.4,2x))') fa(ip1:ip1+ln-1) +! stop +! end if + + call ma64_factor(nfront,ncand,nb,nbi,fa(ip1+ln-lfa:ip1+ln-1),lfa, & + cntl64,nelim,lq,varlist,reals,w64,info64,s=cdelay) + + if (info64%flag == -13) then + info%flag = -40; goto 500 + else if (info64%flag < 0) then +! write (6,*) 'unexpected error from ma64_factor. flag = ',info64%flag + info%flag = -99; go to 500 + end if + if (ncand == nfront) then + if (nelim /= ncand) then +! write (6,*) 'error from ma64_factor. not enough pivots chosen' +! write (6,*) 'nelim,ncand,num_zero', nelim,ncand,info64%num_zero + info%flag = -99; go to 500 + end if + end if +! if (ncand /= nelim) write (6,*) 'node,ncand,nelim',node,ncand,nelim +! write (6,*) 'After MA64: ncand,nelim',ncand,nelim + +! Keep a record of the actual max. number of eliminations at a node + keep%maxelim_actual = max(keep%maxelim_actual,nelim) + + if (info64%num_zero > 0) then + info%matrix_rank = info%matrix_rank - info64%num_zero + ! write (6,*) rank, num_zero',info%matrix_rank, info64%num_zero + if (.not. control%action) then + info%flag = -11; go to 500 + else + info%flag = 4 + end if + end if + + info%num_nothresh = info%num_nothresh + info64%num_nothresh + info%num_perturbed = info%num_perturbed + info64%num_perturbed + info%ntwo = info%ntwo + info64%num_2x2 + info%num_neg = info%num_neg + info64%num_neg + info%detlog = info%detlog + info64%detlog + info%detsign = info%detsign*info64%detsign + +! If we have used a smaller u, we will use it at the next stage + cntl64%u = info64%u + +! Store factor held in fa(ip1+ln-lfa:ip1+ln-lfa+lq-1) to the main file + if (nelim > 0) then + ipp = 1 + size_fa - lfa ! = ip1 + ln - lfa + locw = keep%rfree + lreals = nfront + do j = 1,nelim + call MA77_write_real(keep%index(2),keep%size_rmain,keep%rmain, & + locw,lreals,fa(ipp:ipp+lreals-1),flag,keep%rdata,-1, & + keep%maxstore,keep%used,inactive=inactive_fac) + if (flag < 0) go to 480 + locw = locw + lreals + ipp = ipp + lreals + info%nfactor = info%nfactor + lreals + lreals = lreals - 1 + end do + keep%rfree = locw + +! set llreals to be the number of entries stored + llreals = nelim + llreals = (llreals*llreals+llreals)/2 + llreals*(nfront-llreals) + +! Update keep%maxfa to hold upper bound on +! the longest factor entry written (we do not +! include the diagonal entries since we will read these later with +! separate array) + keep%maxfa = max(keep%maxfa,llreals) + +! Also store the block diagonal (held in reals) + dreals = 2*nelim + locw = posdiag + call MA77_write_real(keep%index(2),keep%size_rmain,keep%rmain, & + locw,dreals,reals,flag,keep%rdata,-1,keep%maxstore,keep%used, & + inactive=keep%posfac) + if (flag < 0) go to 480 +! 10 sept. 2008. No longer include D in the count info%nfactor +! info%nfactor = info%nfactor + dreals + posdiag = posdiag + dreals + +! Flop count + do j = 0,nelim-1 + lnj = nfront - j + info%nflops = info%nflops + lnj*lnj + end do + end if + +! Set delay(1,node) to hold frontsize after eliminations and +! delay(2,node) to hold number of delayed pivots + delay(1,node) = nfront - nelim + ldc = ncand - nelim + delay(2,node) = ldc + +! Write delayed pivots to the delayed integer +! and real stacks, and write integer data to main integer file + +! Apply permutation computed by factorization to fully summed cols. +! write (6,*) 'nelim,delay(1:2)',nelim,delay(1:2) +! write (6,*) 'perm ',varlist(1:ncand) + +! Use map to take temporary copy (because f95 compiler with -O is giving me +! wrong answer if I use following) +! rlist(1:ncand) = rlist(varlist(1:ncand)) + if (size(map) < nfront) then + deallocate (map,stat=st) + allocate (map(nfront),stat=st) + if (st /= 0) go to 490 + end if + map(1:nfront) = rlist(1:nfront) + do i = 1,ncand + rlist(i) = map(varlist(i)) + end do + +! Store no. of eliminations performed + rlist(nfront+1) = nelim +! Write rlist onto the end of the main integer file + locw = keep%ifree + dpos(node) = locw + nelim +! write (6,*) 'rlist,locw',rlist(1:nfront+1),locw + call MA77_write_integer(keep%index(1),keep%size_imain,keep%imain, & + locw,nfront+1,rlist,flag,keep%idata,-1,keep%maxstore,keep%used) + if (flag < 0) go to 480 + locw = locw + nfront + 1 + keep%ifree = locw + keep%size_ind(node) = nfront + info%ndelay = info%ndelay + ldc + + if (ldc > 0) then +! Write the reals for delayed cols onto the temporary real stack + nfront_long = nfront + ipp = 1 + size_fa - ((nfront_long-nelim)*(nfront_long-nelim+1))/2 + locw = rtopd + lreals = nfront - nelim + ilong = ldc + length = ilong*(nfront_long-ncand) + (ilong*ilong+ilong)/2 + do j = 1,ldc + call MA77_write_real(keep%index(4),keep%size_rwdelay,keep%rwdelay,& + locw,lreals,fa(ipp:ipp+lreals-1),flag,keep%rdata, & + -1,keep%maxstore,keep%used) + if (flag < 0) go to 480 + locw = locw + lreals + ipp = ipp + lreals + lreals = lreals - 1 + end do + rtopd = rtopd + length + keep%rtopdmx = max(keep%rtopdmx,rtopd) + end if +!!!!!!! +! If x was supplied then perform the forward subs. + if (lsolve .and. nelim > 0) then + if (size(xlocal,1) < nfront) then + deallocate (xlocal,stat=st) + allocate (xlocal(nfront,nrhs),stat=st) + if (st /= 0) go to 490 + end if + do i = 1,nfront + jvar = rlist(i) + xlocal(i,1:nrhs) = x(jvar,1:nrhs) + end do + ipp = 1 + size_fa - lfa + llreals = nelim + llreals = (llreals*(2*nfront_long-llreals+nb))/2 + l = size(xlocal,1) + if (nrhs >= 4) then + call ma64_solveL2(nfront,nelim,nb,nrhs,xlocal,l, & + flag,fa(ipp:ipp+llreals-1),lq) + else + do j = 1, nrhs + call ma64_solveL1(nfront,nelim,nb,xlocal(:,j),flag, & + fa(ipp:ipp+llreals-1),lq) + end do + end if + + do i = 1, nfront + jvar = rlist(i) + x(jvar,1:nrhs) = xlocal(i,1:nrhs) + end do + end if + +!!!!! + if (info%flag >= 0) go to 500 + +480 info%iostat = keep%rdata%iostat + info%stat = keep%rdata%stat + info%flag = flag + if (flag == -17) info%flag = -16 + go to 500 + +490 info%flag = -1 + info%stat = st + go to 500 + +500 continue + info%index(1:4) = keep%index(1:4) + return + + end subroutine factorize64 + +!******************************* + + subroutine assemble64(node,cnode,ic,rtop) + +! This subroutine either stacks the contribution from cnode +! or assembles it into its parent node. cnode is the ic-th child of node. + + integer(short), intent(in) :: node ! node in tree + integer(short), intent(in) :: cnode ! child of node + integer(short), intent(in) :: ic ! position of ic in sibling list + integer(long), intent(inout) :: rtop ! points to top of main real stack + +! Possible error returns: +! -1 Allocation error +! -5 Error from of01 (error in Fortran inquire) +! -6 Error from of01 (error in Fortran read) +! -7 Error from of01 (error in Fortran open) +! -15 Error from of01 (error in Fortran write) +! -16 -17 Error from of01_read or of01_write (Fortran open failed +! for all path) +! -30 Front size too large + + nchild = size(keep%tree(node)%child) + non_leaf = nchild +! In element case, add up the number of children of node that are leaf nodes + if (keep%element_input) then + if (nchild == 0) return + do i = nchild,1,-1 + jcnode = keep%tree(node)%child(i) + if (jcnode > keep%nelt) exit + end do + non_leaf = i + end if + +! set ipc to point to first location in fa that was used for cnode + cnvar = keep%size(cnode) - keep%tree(cnode)%nelim + length = cnvar + length = (length*length+length)/2 + ipc = 1 + size_fa - length + + nvar = abs(keep%size(node)) + nfront = nvar + nvar_long = nvar +! set ip1 to point to first location in fa that will be used for front at node + lfa = (nvar_long*nvar_long + nvar_long)/2 + ip1 = 1 + size_fa - lfa + +! If we are not yet at the split point, write generated element for cnode onto +! top of the real stack and return + splitp = keep%splitp(node) + if (ic < splitp) then + locw = rtop + lreals = cnvar + ipp = ipc + do j = 1,cnvar + call MA77_write_real(keep%index(3),keep%size_rwork,keep%rwork, & + locw,lreals,fa(ipp:ipp+lreals-1),flag,keep%rdata,-1, & + keep%maxstore,keep%used) + if (flag < 0) go to 480 + ipp = ipp + lreals + locw = locw + lreals + lreals = lreals - 1 + end do +! Adjust top of stack + rtop = rtop + length + keep%rtopmx = max(keep%rtopmx,rtop) + return + end if + + if (ic == non_leaf) then +! At the last non-leaf child, extra space may be needed in indefinite case +! to accommodate the delayed columns (they go at the start of +! the frontal matrix) +! Add up number of delayed cols and store max. number + cdelay = 0 + d1max = 0 + do j = 1,non_leaf + jcnode = keep%tree(node)%child(j) + cdelay = cdelay + delay(2,jcnode) + d1max = max(d1max,delay(1,jcnode)) + end do + nfront = nvar + cdelay + ncand = keep%tree(node)%nelim + cdelay + if (size(rlist) < nfront+1) then + deallocate (rlist,stat=st) + allocate (rlist(int(nfront*multiplier)+1),stat=st) + if (st /= 0) go to 490 + end if + if (size(varlist) < max(d1max,ncand)) then + deallocate (varlist,stat=st) + allocate (varlist(max(d1max,ncand)),stat=st) + if (st /= 0) go to 490 + end if +! The work array reals must be of size at least nfront. + if (size(reals) < nfront) then + deallocate (reals,stat=st) + allocate (reals(int(nfront*multiplier)),stat=st) + if (st /= 0) go to 490 + end if + + nfront_long = nfront + lfa = (nfront_long*(nfront_long+nb+1))/2 + if (lfa > keep%lup) then + info%flag = -30; return + end if + + ilong = size_fa + if (lfa > ilong) then +! write out contents of fa, allocate larger front and read back in + locw = rtop + lreals = cnvar + ipp = ipc + do j = 1,cnvar + call MA77_write_real(keep%index(3),keep%size_rwork,keep%rwork, & + locw,lreals,fa(ipp:ipp+lreals-1),flag,keep%rdata,-1, & + keep%maxstore,keep%used) +! write (6,*) 'ipp,ipp+lreals-1',ipp,ipp+lreals-1,j,cnvar +! write (6,*) fa(ipp:ipp+lreals-1) + if (flag < 0) go to 480 + ipp = ipp + lreals + locw = locw + lreals + lreals = lreals - 1 + end do + rtop = rtop + length + keep%rtopmx = max(keep%rtopmx,rtop) + deallocate (fa,stat=st) + lfa = max(nfront_long,int(real(nfront_long,wp)*multiplier,long)) + lfa = (lfa*(lfa+nb+1))/2 + if (lfa > keep%lup) lfa = (nfront_long*(nfront_long+nb+1))/2 + if (lfa > keep%lup) then + info%flag = -30; return + end if + allocate (fa(lfa),stat=st) + if (st /= 0) then + info%flag = -30; info%stat = st; return + end if + size_fa = lfa +! read fa back in (no need to retain the temporary data) + ipc = 1 + size_fa - length + loc = rtop - length + lreals = cnvar + ipp = ipc + do j = 1,cnvar + call MA77_read_discard_real(keep%index(3),keep%rwork,loc,& + lreals,fa(ipp:ipp+lreals-1),flag,keep%rdata,-1) +! write (6,*) 'ipp,ipp+lreals-1',ipp,ipp+lreals-1,j,cnvar +! write (6,*) fa(ipp:ipp+lreals-1) + if (flag < 0) go to 480 + ipp = ipp + lreals + loc = loc + lreals + lreals = lreals - 1 + end do + rtop = rtop - length + end if + + end if +! ip1 points to position after delayed columns + ip1 = 1 + size_fa - (nvar_long*nvar_long+nvar_long)/2 + +! Read the variables for node from the main integer superfile. + loc = keep%ifile(node) + call MA77_read_integer(keep%index(1),keep%imain,loc,nvar,& + rlist,flag,keep%idata,-1) + if (flag < 0) go to 480 + do i = 1,nvar + ivar = abs(rlist(i)) + pos(ivar) = i + end do + +! Set ip(j) to point to start of col j in array fa. + ip(1) = ip1 + do j = 2,nvar + ip(j) = ip(j-1) + nvar - j + 2 + end do +! write (6,*) 'ip',ip(1:nvar) + +! read integer list for cnode from main integer file + loc = keep%ifile(cnode) + keep%tree(cnode)%nelim + call MA77_read_integer(keep%index(1),keep%imain,loc,cnvar, & + varlist,flag,keep%idata,-1) + if (flag < 0) go to 480 +! Set mapping from cnode into the front + do j = 1,cnvar + k = abs(varlist(j)) + map(j) = pos(k) + end do + +! write (6,*) 'ic,splitp,non_leaf,cdelay',ic,splitp,non_leaf,cdelay + if (ic == splitp .or. ic == non_leaf) then + if (cnvar /= nvar) then +! Expand cnode into the front + j1 = 1 + do j = 1,cnvar + j2 = map(j) +! col. j of cnode maps to col. j2 of front +! set cols j1:j2-1 of front to zero + fa(ip(j1):ip(j2)-1) = zero +! Expand col. j of cnode into col. j2 of front. +! col j of cnode is currently at col k=j+nvar-cnvar of front + k = j + nvar - cnvar + if (j2 /= k) then + ipj2 = ip(j2) + fa(ipj2:ip(j2+1)-1) = zero + ipk = ip(k) + do l = j,cnvar + i = map(l) + fa(ipj2+i-j2) = fa(ipk+l-j) + end do + else +! j2 = k, so all columns are now in place + j1 = nvar + 1 + exit + end if + j1 = j2 + 1 + end do +! Check final cols are set to 0. + klong = size_fa + if (j1 <= nvar) fa(ip(j1):klong) = zero + end if + end if + + if (ic == splitp) then +! At split point. +! Merge children 1:splitp-1 into rows/columns 1:nfront of frontal matrix + do 160 jc = splitp-1, 1, -1 + jcnode = keep%tree(node)%child(jc) + nelim_jc = keep%tree(jcnode)%nelim + loc = keep%ifile(jcnode) + nelim_jc + cnvar = keep%size(jcnode) - nelim_jc + call MA77_read_integer(keep%index(1),keep%imain,loc,cnvar, & + varlist,flag,keep%idata,-1) + if (flag < 0) go to 480 +! Set mapping from jcnode into the front using array pos (length n) + do j = 1,cnvar + k = abs(varlist(j)) + map(j) = pos(k) + end do +! Read in reals for child from the top of stack, one col. at a time, +! using map to read directly into the front. + lreals = cnvar + length = cnvar + length = (length*length + length)/2 + loc = rtop - length +! move pointer to top of stack + rtop = loc + do j = 1, cnvar + ilong = map(j) +! start of column i+1 is +! k = ip1 + nvar*i - i*(i-1)/2 +! so last entry in col. i is +! k - 1 = ip1 + nvar*i - i*(i-1)/2 - 1 +! require length of part of we are reading into to be max(map) = nvar +! so start to read into k - 1 - nvar + 1 = k - nvar +! that is, ipp = k - nvar = ip1 + nvar*i - i*(i-1)/2 - nvar + ipp = ip1 + nvar_long*(ilong-1) - (ilong*(ilong-1))/2 + call MA77_read_discard_real(keep%index(3), & + keep%rwork,loc,lreals, & + fa(ipp:ipp+nvar-1),flag,keep%rdata,-1,map=map(j:cnvar)) + if (flag < 0) go to 480 + loc = loc + lreals + lreals = lreals - 1 + end do +! End of loop over children +160 continue + +! At this point fa holds the reals in the frontal matrix in packed form. +! If split point is not also last non-leaf child, write fa onto the stack + if (ic /= non_leaf) then + lreals = nvar + loc = rtop + ipp = ip1 + do j = 1,nvar + call MA77_write_real(keep%index(3),keep%size_rwork,keep%rwork, & + loc,lreals,fa(ipp:ipp+lreals-1),flag,keep%rdata,-1, & + keep%maxstore,keep%used) + if (flag < 0) go to 480 + ipp = ipp + lreals + loc = loc + lreals + lreals = lreals - 1 + end do + rtop = rtop + (nvar_long*nvar_long+nvar_long)/2 + keep%rtopmx = max(keep%rtopmx,rtop) + end if + + else if (ic < non_leaf) then +! We have passed split point and not yet reached last non-leaf child. +! The reals for cnode are still in fa. +! Loop over the cols of cnode, merging the child into its parent. + do j = 1,cnvar + i = map(j) +! Read column i of the frontal matrix from the stack. Find its position. + loc = rtop - (nvar_long*nvar_long+nvar_long)/2 +! loc now points to the first entry in the front on the stack. +! Set loc to point to first entry in col. i and +! lreals to number of entries in col. i. + ilong = i + loc = loc + nvar_long*(ilong-1) - ((ilong-2)*(ilong-1))/2 + lreals = nvar - i + 1 + call MA77_read_real(keep%index(3),keep%rwork,loc,lreals,reals,& + flag,keep%rdata,-1) + if (flag < 0) go to 480 +! ipp points to start of col. j of cnode, which is held in fa + jlong = j + ipp = ipc + cnvar*(jlong-1) - ((jlong-2)*(jlong-1))/2 + do k = j,cnvar + kk = map(k) + reals(1+kk-i) = reals(1+kk-i) + fa(ipp+k-j) + end do +! Write the updated reals back onto the stack + call MA77_write_real(keep%index(3),keep%size_rwork,keep%rwork, & + loc,lreals,reals,flag,keep%rdata,-1,keep%maxstore,keep%used) + if (flag < 0) go to 480 + end do + + else if (ic == non_leaf) then +! Dealing with last non-leaf child (and it is not split point) +! Read frontal matrix from top of stack, one column at a time and add +! in with last non-leaf child (which we have already expanded in fa). + loc = rtop - (nvar_long*nvar_long+nvar_long)/2 + rtop = loc + ipp = ip1 + lreals = nvar + do j = 1,nvar + call MA77_read_discard_real(keep%index(3),keep%rwork,loc,& + lreals,reals,flag,keep%rdata,-1) + if (flag < 0) go to 480 + fa(ipp:ipp+lreals-1) = fa(ipp:ipp+lreals-1) + reals(1:lreals) + ipp = ipp + lreals + loc = loc + lreals + lreals = lreals - 1 + end do +! lreals = (nvar*nvar+nvar)/2 +! call MA77_read_real(keep%index(3),keep%rwork,loc,lreals,& +! fa(ip1:ip1+lreals-1),flag,keep%rdata,-1,add=.true.) + + end if + + if (info%flag >= 0) return + +480 info%iostat = keep%rdata%iostat + info%stat = keep%rdata%stat + info%flag = flag + if (flag == -17) info%flag = -16 + return + +490 info%flag = -1 + info%stat = st + + end subroutine assemble64 + +!************************* + +! End factorization + + end subroutine MA77_factor_solve_double + +!************************************************************************* + subroutine MA77_resid_double(nrhs,lx,x,lresid,resid,keep,control,info, & + anorm_bnd) +! Compute the residual and optionally a bound on the norm of A. + + integer(short) :: nrhs + integer(short) :: lx ! must be at least n + integer(short) :: lresid ! must be at least n + real(wp), intent(in) :: x(lx,nrhs) + real(wp), intent(inout) :: resid(lresid,nrhs) + type (MA77_keep), intent (inout) :: keep + type (MA77_control), intent (in) :: control + type (MA77_info), intent (inout) :: info + real(wp), intent(out),optional :: anorm_bnd + + real (wp), allocatable :: reals(:) ! + integer(short), allocatable :: varlist(:) ! used for variable lists + integer(short), allocatable :: iwork(:) ! + real (wp), allocatable :: work(:) ! Work array (only if anorm_bnd present) + + real(wp) :: atemp + integer(short) :: flag + integer(short) :: i ! temporary variable + integer(short) :: ielt + integer(short) :: inelrs + integer(short) :: j + integer(short) :: k + integer(short) :: l + integer(short) :: lfa + integer(short) :: ll + integer(short) :: mvar + integer(short) :: n + integer(short) :: nout + integer(short) :: nvar + integer(short) :: st ! stat parameter + integer(long) :: loc,locr + +! Possible error returns: +! -1 Allocation error +! -3 Error in sequence of calls +! -5 Error from of01 (error in Fortran inquire) +! -6 Error from of01 (error in Fortran read) +! -7 Error from of01 (error in Fortran open) +! -16 -17 Error from of01_read or of01_write (Fortran open failed +! for all path) +! -24 Error in size of x +! -25 Error in size of resid + +! Perform appropriate printing + if (control%print_level >= 1 .and. control%unit_diagnostics >= 0) then + write (control%unit_diagnostics,'(//a)') & + ' Entering MA77_resid with:' + write (control%unit_diagnostics,'(a,4(/a,i12),(/a,i12/a,i12/a,i12))') & + ' control parameters (control%) :', & + ' print_level Level of diagnostic printing = ', & + control%print_level, & + ' unit_diagnostics Unit for diagnostics = ', & + control%unit_diagnostics, & + ' unit_error Unit for errors = ', & + control%unit_error, & + ' unit_warning Unit for warnings = ', & + control%unit_warning, & + ' nrhs = ', & + nrhs, & + ' lx = ', & + lx, & + ' lresid = ', & + lresid + end if + + nout = control%unit_error + if (control%print_level < 0) nout = -1 + keep%name = 'MA77_resid' + +! Check status parameter + if (keep%status /= 3) then + info%flag = -3 + call MA77_print_iflag(keep,nout,info%flag) + return + end if + + info%flag = keep%flag + n = keep%n + if (n == 0) then + if (present(anorm_bnd)) anorm_bnd = zero + return + end if + + if (lx < n) then + info%flag = -24 + call MA77_print_iflag(keep,nout,info%flag) + if (nout >= 0) write (nout,'(a,i8,a,i8)') & + ' Increase lx from ', lx, ' to at least ', n + return + end if + + if (nrhs < 1) then + info%flag = -24 + call MA77_print_iflag(keep,nout,info%flag) + if (nout >= 0) write (nout,'(a,i8,a,i8)') & + ' nrhs must be at least 1. nrhs = ', nrhs + return + end if + + if (lresid < n) then + info%flag = -25 + call MA77_print_iflag(keep,nout,info%flag) + if (nout >= 0) write (nout,'(a,i8,a,i8)') & + ' Increase lresid from ', lresid, ' to at least ', n + return + end if + + mvar = keep%mvar + if (keep%element_input) then + deallocate (varlist,stat=st) + allocate (varlist(mvar),stat=st) + if (st /= 0) go to 95 + if (keep%index(2) >= 0) then + lfa = (mvar*mvar + mvar)/2 + deallocate (reals,stat=st) + allocate (reals(lfa),stat=st) + if (st /= 0) go to 95 + end if + + if (present(anorm_bnd)) then +! norm of A is required so need extra array + deallocate (work,stat=st) + allocate (work(n),stat=st) + if (st /= 0) go to 95 + work = zero + do ielt = 1,keep%nelt + nvar = abs(keep%size(ielt)) + if (nvar == 0) cycle + loc = keep%ifile(ielt) + if (keep%index(1) >= 0) then +! read in variable list + call of01_read(keep%index(1),loc,nvar,varlist,flag,keep%idata, & + lp=-1) + if (flag < 0) go to 97 + else +! Direct access files not in use. + varlist(1:nvar) = keep%imain(loc:loc+nvar-1) + end if +! read in the reals + inelrs = (nvar*nvar+nvar)/2 + locr = keep%rfile(ielt) - inelrs + if (keep%index(2) >= 0) then + call of01_read(keep%index(2),locr,inelrs,reals,flag, & + keep%rdata,lp=-1) + if (flag < 0) go to 97 + k = 1 + do i = 1,nvar + l = varlist(i) + atemp = -reals(k) + resid(l,1:nrhs) = resid(l,1:nrhs) + atemp*x(l,1:nrhs) + work(l) = work(l) + abs(atemp) + k = k + 1 + do j = i+1,nvar + ll = varlist(j) + atemp = -reals(k) + resid(ll,1:nrhs) = resid(ll,1:nrhs) + atemp*x(l,1:nrhs) + resid(l,1:nrhs) = resid(l,1:nrhs) + atemp*x(ll,1:nrhs) + atemp = abs(atemp) + work(l) = work(l) + atemp + work(ll) = work(ll) + atemp + k = k + 1 + end do + end do + else +! Direct access files not in use + k = 1 + do i = 1,nvar + l = varlist(i) + atemp = -keep%rmain(locr+k-1) + resid(l,1:nrhs) = resid(l,1:nrhs) + atemp*x(l,1:nrhs) + work(l) = work(l) + abs(atemp) + k = k + 1 + do j = i+1,nvar + ll = varlist(j) + atemp = -keep%rmain(locr+k-1) + resid(ll,1:nrhs) = resid(ll,1:nrhs) + atemp*x(l,1:nrhs) + resid(l,1:nrhs) = resid(l,1:nrhs) + atemp*x(ll,1:nrhs) + atemp = abs(atemp) + work(l) = work(l) + atemp + work(ll) = work(ll) + atemp + k = k + 1 + end do + end do + end if + end do + anorm_bnd = work(1) + do i = 2,n + anorm_bnd = max(anorm_bnd,work(i)) + end do + else +! norm of A not required + do ielt = 1,keep%nelt + nvar = abs(keep%size(ielt)) + if (nvar == 0) cycle + loc = keep%ifile(ielt) +! read in variable list + if (keep%index(1) >= 0) then + call of01_read(keep%index(1),loc,nvar,varlist,flag, & + keep%idata,lp=-1) + if (flag < 0) go to 97 + else + varlist(1:nvar) = keep%imain(loc:loc+nvar-1) + end if +! read in the reals + inelrs = (nvar*nvar+nvar)/2 + locr = keep%rfile(ielt) - inelrs + if (keep%index(2) >= 0) then + call of01_read(keep%index(2),locr,inelrs,reals,flag, & + keep%rdata,lp=-1) + if (flag < 0) go to 97 + k = 1 + do i = 1,nvar + l = varlist(i) + atemp = -reals(k) + resid(l,1:nrhs) = resid(l,1:nrhs) + atemp*x(l,1:nrhs) + k = k + 1 + do j = i+1,nvar + ll = varlist(j) + atemp = -reals(k) + resid(ll,1:nrhs) = resid(ll,1:nrhs) + atemp*x(l,1:nrhs) + resid(l,1:nrhs) = resid(l,1:nrhs) + atemp*x(ll,1:nrhs) + k = k + 1 + end do + end do + else + k = 1 + do i = 1,nvar + l = varlist(i) + atemp = -keep%rmain(locr+k-1) + resid(l,1:nrhs) = resid(l,1:nrhs) + atemp*x(l,1:nrhs) + k = k + 1 + do j = i+1,nvar + ll = varlist(j) + atemp = -keep%rmain(locr+k-1) + resid(ll,1:nrhs) = resid(ll,1:nrhs) + atemp*x(l,1:nrhs) + resid(l,1:nrhs) = resid(l,1:nrhs) + atemp*x(ll,1:nrhs) + k = k + 1 + end do + end do + end if + end do + end if + else +! row entry + if (keep%index(1) >= 0) then + deallocate (varlist,stat=st) + allocate (varlist(mvar),stat=st) + if (st /= 0) go to 95 + end if + if (keep%index(2) >= 0) then + deallocate (reals,stat=st) + allocate (reals(mvar),stat=st) + if (st /= 0) go to 95 + end if + if (present(anorm_bnd)) then +! norm of A is required so need extra array + deallocate (work,stat=st) + allocate (work(n),stat=st) + if (st /= 0) go to 95 + work = zero + do ielt = 1,keep%nelt + nvar = abs(keep%size(ielt)) + if (nvar == 0) cycle + loc = keep%ifile(ielt) + locr = keep%rfile(ielt) - nvar +! read in variable list + if (keep%index(1) >= 0) then + call of01_read(keep%index(1),loc,nvar,varlist,flag, & + keep%idata,lp=-1) + if (flag < 0) go to 97 +! read in the reals + if (keep%index(2) >= 0) then + call of01_read(keep%index(2),locr,nvar,reals,flag, & + keep%rdata,lp=-1) + if (flag < 0) go to 97 + do i = 1,nvar + l = varlist(i) + atemp = -reals(i) + resid(ielt,1:nrhs) = resid(ielt,1:nrhs) + atemp*x(l,1:nrhs) + work(l) = work(l) + abs(atemp) + end do + else + do i = 1,nvar + l = varlist(i) + atemp = -keep%rmain(locr+i-1) + resid(ielt,1:nrhs) = resid(ielt,1:nrhs) + atemp*x(l,1:nrhs) + work(l) = work(l) + abs(atemp) + end do + end if + else + if (keep%index(2) >= 0) then + call of01_read(keep%index(2),locr,nvar,reals,flag, & + keep%rdata,lp=-1) + if (flag < 0) go to 97 + do i = 1,nvar + l = keep%imain(loc+i-1) + atemp = -reals(i) + resid(ielt,1:nrhs) = resid(ielt,1:nrhs) + atemp*x(l,1:nrhs) + work(l) = work(l) + abs(atemp) + end do + else + do i = 1,nvar + l = keep%imain(loc+i-1) + atemp = -keep%rmain(locr+i-1) + resid(ielt,1:nrhs) = resid(ielt,1:nrhs) + atemp*x(l,1:nrhs) + work(l) = work(l) + abs(atemp) + end do + end if + end if + end do + anorm_bnd = work(1) + do i = 2,n + anorm_bnd = max(anorm_bnd,work(i)) + end do + else +! norm of A not required + do ielt = 1,keep%nelt + nvar = abs(keep%size(ielt)) + if (nvar == 0) cycle + loc = keep%ifile(ielt) + locr = keep%rfile(ielt) - nvar +! read in variable list + if (keep%index(1) >= 0) then + call of01_read(keep%index(1),loc,nvar,varlist,flag,keep%idata, & + lp=-1) + if (flag < 0) go to 97 +! read in the reals + if (keep%index(2) >= 0) then + call of01_read(keep%index(2),locr,nvar,reals,flag, & + keep%rdata,lp=-1) + if (flag < 0) go to 97 + do i = 1,nvar + l = varlist(i) + atemp = -reals(i) + resid(ielt,1:nrhs) = resid(ielt,1:nrhs) + atemp*x(l,1:nrhs) + end do + else + do i = 1,nvar + l = varlist(i) + atemp = -keep%rmain(locr+i-1) + resid(ielt,1:nrhs) = resid(ielt,1:nrhs) + atemp*x(l,1:nrhs) + end do + end if + else +! integer superfile not in use + if (keep%index(2) >= 0) then + call of01_read(keep%index(2),locr,nvar,reals,flag, & + keep%rdata,lp=-1) + if (flag < 0) go to 97 + do i = 1,nvar + l = keep%imain(loc+i-1) + atemp = -reals(i) + resid(ielt,1:nrhs) = resid(ielt,1:nrhs) + atemp*x(l,1:nrhs) + end do + else + do i = 1,nvar + l = keep%imain(loc+i-1) + atemp = -keep%rmain(locr+i-1) + resid(ielt,1:nrhs) = resid(ielt,1:nrhs) + atemp*x(l,1:nrhs) + end do + end if + end if + end do + end if + + end if + if (present(anorm_bnd)) then + if (control%print_level >= 1 .and. control%unit_diagnostics >= 0) & + write (control%unit_diagnostics,'(/a,es12.4)') & + ' Leaving MA77_resid with anorm_bnd = ', anorm_bnd + end if + + go to 99 + + 95 info%flag = -1 + info%stat = st + call MA77_print_iflag(keep,nout,info%flag,st=info%stat) + go to 99 + + 97 info%iostat = keep%idata%iostat + info%stat = keep%idata%stat + info%flag = flag + if (flag == -17) info%flag = -16 + call MA77_print_iflag(keep,nout,info%flag,st=info%stat, & + ios=keep%idata%iostat) + + 99 deallocate (varlist,stat=st) + deallocate (iwork,stat=st) + deallocate (work,stat=st) + deallocate (reals,stat=st) + + end subroutine MA77_resid_double +!************************************************************************* + + subroutine MA77_solve_double(nrhs,lx,x,keep,control,info,scale,job) + +! Solve phase. Optionally performs only the forward or backward sub. +! use indef + integer(short), intent (in) :: nrhs + integer(short), intent (in) :: lx + real (wp), intent (inout) :: x(lx,nrhs) ! On entry, x must +! be set so that if i has been used to index a variable, +! x(i,j) is the corresponding component of the +! right-hand side for the jth system (j = 1,2,..., nrhs). +! On exit, if i has been used to index a variable, +! x(i,j) holds solution for variable i to system j +! For details of keep, control, info : see derived type description + type (MA77_keep), intent (inout) :: keep + type (MA77_control), intent (in) :: control + type (MA77_info), intent (inout) :: info + real(wp), intent(in), optional :: scale(:) ! if present, +! must hold scaling factors. If scale was present on +! call to ma77_factor , then scale should also be present here. + integer(short), optional, intent (in) :: job ! used to indicate whether +! partial solution required +! job = 1 : forward eliminations only (PLX = B) +! job = 2 : diagonal solve (DX = B) (indefinite case only) +! job = 3 : backsubs only ((PL)^TX = B) +! job = 4 : diag and backsubs (D(PL)^TX = B) (indefinite case only) +! job absent: complete solve performed + + real (wp), allocatable :: xlocal(:,:) ! temporary dense vector for +! performing forward eliminations and back substitutions. + real (wp), allocatable :: d(:) ! used to hold diagonal entries + real (wp), allocatable :: fa(:) ! used to hold factor entries + real (wp), allocatable :: w54(:) ! workspace for ma54 (nrhs > 4) + integer(short), allocatable :: varlist(:) ! used for variable lists + integer(short), allocatable :: count(:) ! used for depth +! first search of tree to keep track of level we are at + integer(short), allocatable :: cnode(:) ! used for depth +! first search of tree + +! Possible error returns: +! -1 Allocation error +! -3 Error in sequence of calls +! -5 Error from of01 (error in Fortran inquire) +! -6 Error from of01 (error in Fortran read) +! -7 Error from of01 (error in Fortran open) +! -16 -17 Error from of01_read or of01_write (Fortran open failed +! for all path) +! -20 job is out of range +! -24 Error in size of x +! -39 size(scale) too small or scale not present when expected or +! present when not expected + + integer(short) :: depth ! depth in tree + integer(short) :: ir ! do loop variable + integer(short) :: i ! temporary variable + integer(short) :: ld ! size of array d + integer(long) :: lfa ! size of array fa + integer(short) :: local_job ! local job parameter + integer(short) :: lw54 ! length of workarray w54 + integer(long) :: locend ! initialised to keep%rfree (first free position +! after end of factor storage) + integer(long) :: locendi ! initialised to keep%ifree (first free position +! after end of factor storage) (integer data) + integer(long) :: locfac ! initialised to start of factor storage + integer(long) :: locint ! initialised to start of integer factor + integer(short) :: maxlen ! holds largest number of variables in +! an element list + integer(short) :: nchild ! number of children of node in tree + integer(short) :: nb ! set to keep%nb + integer(short) :: n ! set to keep%n + integer(short) :: nelt ! set to keep%nelt + integer(short) :: node ! node in tree + integer(short) :: nout ! output unit + integer(short) :: nroot ! number of roots (components) + integer(short) :: pnode ! parent node in tree + integer(long) :: posdiag ! initialised to start of diagonal entries +! storage. Incremented as integers read (indefinite case only) + integer(short) :: root ! root of tree + integer(short) :: st ! stat parameter + logical :: ldiag_solve ! controls whether a diagonal solve +! is performed on the call to the backsubstitution. +! it is used by the subroutine back in the indefinite case. +! If set to false, then diag. solve not performed (job = 3). +! If set to true, then diag. solve is performed. + +! tblas = 0.0; sizes = 0 + +! Perform appropriate printing + if (control%print_level >= 1 .and. control%unit_diagnostics >= 0) then + write (control%unit_diagnostics,'(//a)') & + ' Entering MA77_solve with:' + write (control%unit_diagnostics,'(a,4(/a,i12),(/a,i12/a,i12))') & + ' control parameters (control%) :', & + ' print_level Level of diagnostic printing = ', & + control%print_level, & + ' unit_diagnostics Unit for diagnostics = ', & + control%unit_diagnostics, & + ' unit_error Unit for errors = ', & + control%unit_error, & + ' unit_warning Unit for warnings = ', & + control%unit_warning, & + ' nrhs = ', & + nrhs, & + ' lx = ', & + lx + end if + if (present(scale)) then + if (control%print_level >= 1 .and. control%unit_diagnostics >= 0) & + write (control%unit_diagnostics,'(a)') & + ' Scaling factors supplied. ' + end if + + nout = control%unit_error + if (control%print_level < 0) nout = -1 + keep%name = 'MA77_solve' + + info%flag = keep%flag + info%nio_read(1) = keep%idata%nio_read + info%nio_read(2) = keep%rdata%nio_read + info%nio_write(1) = keep%idata%nio_write + info%nio_write(2) = keep%rdata%nio_write + info%nwd_read(1) = keep%idata%nwd_read + info%nwd_read(2) = keep%rdata%nwd_read + info%nwd_write(1) = keep%idata%nwd_write + info%nwd_write(2) = keep%rdata%nwd_write + +! Check status parameter + if (keep%status /= 3) then + info%flag = -3 + call MA77_print_iflag(keep,nout,info%flag) + return + end if + + n = keep%n + if (keep%n == 0) return + nelt = keep%nelt + + if (lx < n) then + info%flag = -24 + call MA77_print_iflag(keep,nout,info%flag) + if (nout >= 0) write (nout,'(a,i8,a,i8)') & + ' Increase lx from ', lx, ' to at least ', n + return + end if + + if (nrhs < 1) then + info%flag = -24 + call MA77_print_iflag(keep,nout,info%flag) + if (nout >= 0) write (nout,'(a,i8,a,i8)') & + ' nrhs must be at least 1. nrhs = ', nrhs + return + end if + + if (present(scale)) then + if (keep%scale == 0) info%flag = -39 + if (size(scale) < n) info%flag = -39 + else + if (keep%scale == 1) info%flag = -39 + end if + if (info%flag == -39) then + call MA77_print_iflag(keep,nout,info%flag) + return + end if + + local_job = 0 + if (present(job)) then + if (job < 1 .or. job > 4) info%flag = -20 + if (keep%pos_def .and. job == 2) info%flag = -20 + if (keep%pos_def .and. job == 4) info%flag = -20 + if (info%flag == -20) then + call MA77_print_iflag(keep,nout,info%flag) + return + end if + local_job = job + end if + + deallocate (varlist,stat=st) + deallocate (xlocal,stat=st) + deallocate (w54,stat=st) + deallocate (d,stat=st) + deallocate (fa,stat=st) + deallocate (count,stat=st) + deallocate (cnode,stat=st) + + allocate (count(0:keep%maxdepth),cnode(0:keep%maxdepth),stat=st) + if (st /= 0) goto 95 + + maxlen = keep%maxlen + if (.not. keep%pos_def) maxlen = max(maxlen,keep%maxfrontb) + + nb = keep%nb + lw54 = 1 + if (keep%pos_def) then + if (nrhs >=4) lw54 = 2*nb*maxlen + end if + allocate (w54(lw54),stat=st) + if (st /= 0) go to 95 + + if (local_job /= 2) then + lfa = keep%maxfa + if (keep%index(2) == 0) lfa = 1 + allocate (fa(lfa),stat=st) + if (st /= 0) go to 95 + end if + if (.not. keep%pos_def .and. local_job /= 1) then + ld = 2*keep%maxelim_actual + if (keep%index(2) == 0) ld = 1 + allocate (d(ld),stat=st) + if (st /= 0) go to 95 + end if + + allocate (varlist(maxlen+1),stat=st) + if (st /= 0) go to 95 + allocate (xlocal(maxlen,nrhs),stat=st) + if (st /= 0) go to 95 + + nroot = size(keep%roots) + + if (present(scale)) then + if (local_job == 0 .or. local_job == 1) then + do i = 1,n + x(i,1:nrhs) = scale(i)*x(i,1:nrhs) + end do + end if + end if + + ldiag_solve = .true. + + if (local_job == 0) then +! full system solve. +! Forward eliminations. Initialise locfac/locint to the start of +! the factor storage (skip diagonal entries that are stored first) + locfac = keep%posfac + n + if (.not. keep%pos_def) locfac = locfac + n + locint = keep%posint + + do ir = 1, nroot + root = keep%roots(ir) + node = root + depth = 1 + count(depth) = 0 ! no. of visited children +! Visit each node in depth-first search order + do while(depth.gt.0) + cnode(depth) = node +! Visit children + nchild = size(keep%tree(node)%child) + if (count(depth) < nchild) then + count(depth) = count(depth) + 1 + if (keep%tree(node)%child(count(depth)) > keep%nelt) then +! The next child of node is not a leaf node so descend to it + node = keep%tree(node)%child(count(depth)) + depth = depth + 1 + count(depth) = 0 + cycle + end if + end if + +! Perform work at node. + call forward(node,nb,locfac,locint,maxlen,varlist,nrhs,lx,x, & + xlocal,lfa,fa,lw54,w54,keep,info) + if (info%flag < 0) exit +! If we have reached the root, we are done + if (node == root) exit + +! Go to parent + depth = depth - 1 + pnode = cnode(depth) + node = pnode + + end do ! tree + if (info%flag < 0) go to 96 + end do ! roots + + +! At this point, array x holds partial solution vector(s). +! It will be overwritten by solution. +! Back substitutions. Initialise locend/locendi to first free position +! after the end of the factor storage (we must read +! records in reverse order to the written order) + locend = keep%rfree + locendi = keep%ifree + posdiag = keep%dfree + + do ir = nroot, 1, -1 + root = keep%roots(ir) +! Visit each node in tree rooted at root in reverse depth-first search order + node = root + cnode(0) = root; count(0) = 0 + depth = 1 + count(1) = 0 ! number of visited children + do + cnode(depth) = node + if (count(depth) == 0 .and. node > nelt) then + if (keep%pos_def) then + call back_posdef(node,nb,locend,maxlen,varlist,nrhs, & + lx,x,xlocal,lfa,fa,lw54,w54,keep,info) + else + call back_indef(node,nb,locend,locendi,maxlen,varlist,nrhs, & + lx,x,xlocal,posdiag,ld,d,lfa,fa,ldiag_solve,keep,info) + end if + if (info%flag < 0) exit + nchild = size(keep%tree(node)%child) + if (nchild == 0) then + if (node == root) exit + else +! Descend to last child of node + count(depth) = 1 + node = keep%tree(node)%child(nchild) + depth = depth + 1 + count(depth) = 0 + cycle + end if + end if + +! Parent node + pnode = cnode(depth-1) + nchild = size(keep%tree(pnode)%child) + if (count(depth-1) < nchild) then +! There is another sibling of node - go to it + count(depth-1) = count(depth-1) + 1 + node = keep%tree(pnode)%child(nchild-count(depth-1)+1) + count(depth)=0 + cycle + end if + +! No siblings remain so go to parent + depth = depth - 1 + node = pnode +! If we have reached the root, we are done + if (depth <= 1) exit + + end do + if (info%flag < 0) go to 96 + end do + + else if (local_job == 1) then +! Foward sub. + locfac = keep%posfac + n + if (.not. keep%pos_def) locfac = locfac + n + locint = keep%posint + do ir = 1, nroot + root = keep%roots(ir) + node = root + depth = 1 + count(depth) = 0 ! no. of visited children +! Visit each node in depth-first search order + do while(depth.gt.0) + cnode(depth) = node +! Visit children + nchild = size(keep%tree(node)%child) + if (count(depth) < nchild) then + count(depth) = count(depth) + 1 + if (keep%tree(node)%child(count(depth)) > keep%nelt) then +! The next child of node is not a leaf node so descend to it + node = keep%tree(node)%child(count(depth)) + depth = depth + 1 + count(depth) = 0 + cycle + end if + end if + +! Perform work at node. + call forward(node,nb,locfac,locint,maxlen,varlist,nrhs,lx,x, & + xlocal,lfa,fa,lw54,w54,keep,info) + if (info%flag < 0) exit +! If we have reached the root, we are done + if (node == root) exit + +! Go to parent + depth = depth - 1 + pnode = cnode(depth) + node = pnode + + end do ! tree + if (info%flag < 0) go to 96 + end do ! roots + + else if (local_job == 2) then +! Diag. solve + locint = keep%posint + posdiag = keep%posfac + do ir = 1, nroot + root = keep%roots(ir) + node = root + depth = 1 + count(depth) = 0 ! no. of visited children +! Visit each node in depth-first search order + do while(depth.gt.0) + cnode(depth) = node +! Visit children + nchild = size(keep%tree(node)%child) + if (count(depth) < nchild) then + count(depth) = count(depth) + 1 + if (keep%tree(node)%child(count(depth)) > keep%nelt) then +! The next child of node is not a leaf node so descend to it + node = keep%tree(node)%child(count(depth)) + depth = depth + 1 + count(depth) = 0 + cycle + end if + end if + +! Perform work at node. + call diag_solve(node,locint,maxlen,varlist,nrhs,lx,x, & + xlocal,posdiag,ld,d,keep,info) + if (info%flag < 0) exit +! If we have reached the root, we are done + if (node == root) exit + +! Go to parent + depth = depth - 1 + pnode = cnode(depth) + node = pnode + + end do ! tree + if (info%flag < 0) go to 96 + end do ! roots + + else if (local_job == 3 .or. local_job == 4) then +! Back sub. (without diagonal solve in indefinite case if job = 3) + locend = keep%rfree + locendi = keep%ifree + posdiag = keep%dfree + if (local_job == 3) ldiag_solve = .false. + do ir = nroot, 1, -1 + root = keep%roots(ir) +! Visit each node in tree rooted at root in reverse depth-first search order + node = root + cnode(0) = root; count(0) = 0 + depth = 1 + count(1) = 0 ! number of visited children + do + cnode(depth) = node + if (count(depth) == 0 .and. node > nelt) then + if (keep%pos_def) then + call back_posdef(node,nb,locend,maxlen,varlist,nrhs, & + lx,x,xlocal,lfa,fa,lw54,w54,keep,info) + else + call back_indef(node,nb,locend,locendi,maxlen,varlist,nrhs, & + lx,x,xlocal,posdiag,ld,d,lfa,fa,ldiag_solve,keep,info) + end if + if (info%flag < 0) exit + nchild = size(keep%tree(node)%child) + if (nchild == 0) then + if (node == root) exit + else +! Descend to last child of node + count(depth) = 1 + node = keep%tree(node)%child(nchild) + depth = depth + 1 + count(depth) = 0 + cycle + end if + end if + +! Parent node + pnode = cnode(depth-1) + nchild = size(keep%tree(pnode)%child) + if (count(depth-1) < nchild) then +! There is another sibling of node - go to it + count(depth-1) = count(depth-1) + 1 + node = keep%tree(pnode)%child(nchild-count(depth-1)+1) + count(depth)=0 + cycle + end if + +! No siblings remain so go to parent + depth = depth - 1 + node = pnode +! If we have reached the root, we are done + if (depth <= 1) exit + + end do + if (info%flag < 0) go to 96 + end do + + end if + + if (present(scale)) then + if (local_job == 0 .or. local_job == 3 .or. local_job == 4) then + do i = 1,n + x(i,1:nrhs) = scale(i)*x(i,1:nrhs) + end do + end if + end if + + info%nio_read(1) = keep%idata%nio_read - info%nio_read(1) + info%nio_read(2) = keep%rdata%nio_read - info%nio_read(2) + info%nio_write(1) = keep%idata%nio_write - info%nio_write(1) + info%nio_write(2) = keep%rdata%nio_write - info%nio_write(2) + info%nwd_read(1) = keep%idata%nwd_read - info%nwd_read(1) + info%nwd_read(2) = keep%rdata%nwd_read - info%nwd_read(2) + info%nwd_write(1) = keep%idata%nwd_write - info%nwd_write(1) + info%nwd_write(2) = keep%rdata%nwd_write - info%nwd_write(2) + + if (control%print_level >= 1 .and. control%unit_diagnostics >= 0) then + write (control%unit_diagnostics,'(/a)') & + ' Completed solve with:' + write (control%unit_diagnostics, & + '(a,(/a,i12),4(/a/2es12.4))') & + ' information parameters (info%) :', & + ' flag Error flag = ', & + info%flag, & + ' nio_read(1:2) Number of records read from disk by OF01_read = ',& + real(info%nio_read(1:2)), & + ' nio_write(1:2) Number of records written to disk by OF01_write = ',& + real(info%nio_write(1:2)), & + ' nwd_read(1:2) Number of scalars read by OF01_read = ', & + real(info%nwd_read(1:2)), & + ' nwd_write(1:2) Number of scalars written by OF01_write = ', & + real(info%nwd_write(1:2)) + end if + +! write (6,'(a,f10.3)') 'tblas = ',tblas +! write (6,'(a,10i7)') 'sizes =',sizes(1:10) + + if (info%flag >= 0) go to 100 + + 95 info%flag = -1 + info%stat = st + call MA77_print_iflag(keep,nout,info%flag,st=info%stat) + go to 100 + + 96 call MA77_print_iflag(keep,nout,info%flag,ios=info%iostat) + +! Deallocate arrays we have done with. + 100 deallocate (varlist,stat=st) + deallocate (xlocal,stat=st) + deallocate (fa,stat=st) + deallocate (d,stat=st) + deallocate (w54,stat=st) + deallocate (count,stat=st) + deallocate (cnode,stat=st) +!******************************* + +! End solve + + end subroutine MA77_solve_double + +!************************************************************************* + +! Alternative solve phase (A indefinite and singular). +! + +subroutine ma77_solve_fredholm_double(nrhs, flag_out, lx, x, & + keep, control, info, scale) + + integer(short), intent (in) :: nrhs + logical, intent(out) :: flag_out(nrhs) + integer(short), intent (in) :: lx + real (wp), intent (inout) :: x(lx,2*nrhs) ! On entry, x must + ! be set so that if i has been used to index a variable, + ! x(i,j) is the corresponding component of the + ! right-hand side for the jth system (j = 1,2,..., nrhs). + ! On exit, x(1:n,1:nrhs) holds same solution as is computed by ma97_solve + ! and, if flag_out*j)=.false., x(1:n,nrhs+j-1) + ! holds the Fredholm alternative solution. +! For details of keep, control, info : see derived type description + type (MA77_keep), intent (inout) :: keep + type (MA77_control), intent (in) :: control + type (MA77_info), intent (inout) :: info + real(wp), intent(in), optional :: scale(:) ! if present, +! must hold scaling factors. If scale was present on +! call to ma77_factor, then scale must also be present here. + + real (wp), allocatable :: xlocal(:,:) ! temporary dense vector for +! performing forward eliminations and back substitutions. + real (wp), allocatable :: d(:) ! used to hold diagonal entries + real (wp), allocatable :: fa(:) ! used to hold factor entries + real (wp), allocatable :: tol(:) ! tolerance used to determine if system is + ! consistent (singular case only) + + integer(short), allocatable :: varlist(:) ! used for variable lists + integer(short), allocatable :: count(:) ! used for depth +! first search of tree to keep track of level we are at + integer(short), allocatable :: cnode(:) ! used for depth +! first search of tree + +! Possible error returns: +! -1 Allocation error +! -3 Error in sequence of calls +! -5 Error from of01 (error in Fortran inquire) +! -6 Error from of01 (error in Fortran read) +! -7 Error from of01 (error in Fortran open) +! -16 -17 Error from of01_read or of01_write (Fortran open failed +! for all path) +! -24 Error in size of x +! -39 size(scale) too small or scale not present when expected or +! present when not expected + + integer(short) :: depth ! depth in tree + integer(short) :: ir ! do loop variable + integer(short) :: i ! temporary variable + integer(short) :: irhs + integer(short) :: ld ! size of array d + integer(long) :: lfa ! size of array fa + integer(short) :: lw54 ! length of workarray w54 + integer(long) :: locend ! initialised to keep%rfree (first free position +! after end of factor storage) + integer(long) :: locendi ! initialised to keep%ifree (first free position +! after end of factor storage) (integer data) + integer(long) :: locfac ! initialised to start of factor storage + integer(long) :: locint ! initialised to start of integer factor + logical :: ldiag_solve ! controls whether a diagonal solve +! is performed on the call to the backsubstitution. + integer(short) :: maxlen ! holds largest number of variables in +! an element list + integer(short) :: nchild ! number of children of node in tree + integer(short) :: nb ! set to keep%nb + integer(short) :: n ! set to keep%n + integer(short) :: nelt ! set to keep%nelt + integer(short) :: node ! node in tree + integer(short) :: nout ! output unit + integer(short) :: nroot ! number of roots (components) + integer(short) :: num_false ! number of entries of flag_out set to false + integer(short) :: num_rhs_bwd ! number of rhs for back sub (equal to nrhs if + ! no inconsistent rhs and is equal to 2*nrhs otherwise) + integer(short) :: pnode ! parent node in tree + integer(long) :: posdiag ! initialised to start of diagonal entries +! storage. Incremented as integers read (indefinite case only) + integer(short) :: root ! root of tree + integer(short) :: st ! stat parameter + real (wp) :: w54(1) ! + + real (wp) :: dnrm2 + +! Perform appropriate printing + if (control%print_level >= 1 .and. control%unit_diagnostics >= 0) then + write (control%unit_diagnostics,'(//a)') & + ' Entering MA77_solve_fredholm with:' + write (control%unit_diagnostics,'(a,4(/a,i12),(/a,i12/a,i12))') & + ' control parameters (control%) :', & + ' print_level Level of diagnostic printing = ', & + control%print_level, & + ' unit_diagnostics Unit for diagnostics = ', & + control%unit_diagnostics, & + ' unit_error Unit for errors = ', & + control%unit_error, & + ' unit_warning Unit for warnings = ', & + control%unit_warning, & + ' nrhs = ', & + nrhs, & + ' lx = ', & + lx + end if + if (present(scale)) then + if (control%print_level >= 1 .and. control%unit_diagnostics >= 0) & + write (control%unit_diagnostics,'(a)') & + ' Scaling factors supplied. ' + end if + + nout = control%unit_error + if (control%print_level < 0) nout = -1 + keep%name = 'MA77_solve_fredholm' + + info%flag = keep%flag + info%nio_read(1) = keep%idata%nio_read + info%nio_read(2) = keep%rdata%nio_read + info%nio_write(1) = keep%idata%nio_write + info%nio_write(2) = keep%rdata%nio_write + info%nwd_read(1) = keep%idata%nwd_read + info%nwd_read(2) = keep%rdata%nwd_read + info%nwd_write(1) = keep%idata%nwd_write + info%nwd_write(2) = keep%rdata%nwd_write + +! Check status parameter + if (keep%status /= 3) then + info%flag = -3 + call MA77_print_iflag(keep,nout,info%flag) + return + end if + + flag_out(1:nrhs) = .true. + +! If matrix is non-singular, call ma77_solve + if (keep%flag /= 4) then + if (present(scale)) then + call MA77_solve_double(nrhs,lx,x,keep,control,info,scale=scale) + else + call MA77_solve_double(nrhs,lx,x,keep,control,info) + end if + return + end if + + n = keep%n + if (keep%n == 0) return + nelt = keep%nelt + + if (lx < n) then + info%flag = -24 + call MA77_print_iflag(keep,nout,info%flag) + if (nout >= 0) write (nout,'(a,i8,a,i8)') & + ' Increase lx from ', lx, ' to at least ', n + return + end if + + if (nrhs < 1) then + info%flag = -24 + call MA77_print_iflag(keep,nout,info%flag) + if (nout >= 0) write (nout,'(a,i8,a,i8)') & + ' nrhs must be at least 1. nrhs = ', nrhs + return + end if + + if (present(scale)) then + if (keep%scale == 0) info%flag = -39 + if (size(scale) < n) info%flag = -39 + else + if (keep%scale == 1) info%flag = -39 + end if + if (info%flag == -39) then + call MA77_print_iflag(keep,nout,info%flag) + return + end if + + + deallocate (varlist,stat=st) + deallocate (xlocal,stat=st) + deallocate (d,stat=st) + deallocate (fa,stat=st) + deallocate (count,stat=st) + deallocate (cnode,stat=st) + deallocate (tol,stat=st) + + allocate (count(0:keep%maxdepth),cnode(0:keep%maxdepth),& + tol(nrhs),stat=st) + if (st /= 0) goto 95 + + maxlen = keep%maxlen + maxlen = max(maxlen,keep%maxfrontb) + + nb = keep%nb + + if (keep%index(2) >= 0) then + lfa = keep%maxfa + allocate (fa(lfa),stat=st) + if (st /= 0) go to 95 + ld = 2*keep%maxelim_actual + allocate (d(ld),stat=st) + if (st /= 0) go to 95 + end if + + if (keep%index(1) >= 0) then + allocate (varlist(maxlen+1),stat=st) + if (st /= 0) go to 95 + end if + allocate (xlocal(maxlen,2*nrhs),stat=st) + if (st /= 0) go to 95 + + nroot = size(keep%roots) + + if (present(scale)) then + do i = 1,n + x(i,1:nrhs) = scale(i)*x(i,1:nrhs) + end do + end if + + ! set tolerances for rhs's + do i = 1,nrhs + tol(i) = control%consist_tol*n*dnrm2(n,x(:,i),1) + end do + + lw54 = 1 + +! Forward eliminations. Initialise locfac/locint to the start of +! the factor storage (skip diagonal entries that are stored first) + locfac = keep%posfac + n + locfac = locfac + n + locint = keep%posint + + do ir = 1, nroot + root = keep%roots(ir) + node = root + depth = 1 + count(depth) = 0 ! no. of visited children +! Visit each node in depth-first search order + do while(depth.gt.0) + cnode(depth) = node +! Visit children + nchild = size(keep%tree(node)%child) + if (count(depth) < nchild) then + count(depth) = count(depth) + 1 + if (keep%tree(node)%child(count(depth)) > keep%nelt) then +! The next child of node is not a leaf node so descend to it + node = keep%tree(node)%child(count(depth)) + depth = depth + 1 + count(depth) = 0 + cycle + end if + end if + +! Perform work at node. + call forward(node,nb,locfac,locint,maxlen,varlist,nrhs,lx,x, & + xlocal,lfa,fa,lw54,w54,keep,info) + if (info%flag < 0) exit +! If we have reached the root, we are done + if (node == root) exit + +! Go to parent + depth = depth - 1 + pnode = cnode(depth) + node = pnode + + end do ! tree + if (info%flag < 0) go to 96 + end do ! roots + +! At this point, array x holds partial solution vector(s). + + num_false = 0 +! pass over tree checking for consistency of computed solution. +! if consistent, diag solve is performed +! initialise posdiag/locint + locint = keep%posint + posdiag = keep%posfac + + do ir = 1, nroot + root = keep%roots(ir) + node = root + depth = 1 + count(depth) = 0 ! no. of visited children +! Visit each node in depth-first search order + do while(depth.gt.0) + cnode(depth) = node +! Visit children + nchild = size(keep%tree(node)%child) + if (count(depth) < nchild) then + count(depth) = count(depth) + 1 + if (keep%tree(node)%child(count(depth)) > keep%nelt) then +! The next child of node is not a leaf node so descend to it + node = keep%tree(node)%child(count(depth)) + depth = depth + 1 + count(depth) = 0 + cycle + end if + end if + +! Perform work at node. + call diag_check(node,locint,maxlen,varlist,nrhs,lx,x, & + xlocal,posdiag,ld,d,flag_out,num_false,tol,keep,info) + if (info%flag < 0) exit + +! If we have reached the root, we are done + if (node == root) exit + +! Go to parent + depth = depth - 1 + pnode = cnode(depth) + node = pnode + + end do ! tree + if (info%flag < 0) go to 96 + end do ! roots + + if (num_false.gt.0 .and. num_false.lt.nrhs) then + ! make sure that cols nrhs+1:2*nrhs of x are defined + ! (as will perform back sub on these cols even if means + ! we are solving for some consistent cols twice). + do irhs = 1,nrhs + if (.not. flag_out(irhs)) cycle + x(1:n,irhs+nrhs) = zero + end do + end if + +! We must perform the back substitution. + if (num_false.eq.0) then + ! no inconsistent right-hand sides so just do standard back sub. + num_rhs_bwd = nrhs + else + ! back sub for both the consistent and inconsistent right-hand sides + num_rhs_bwd = 2*nrhs + end if +! During back sub, x will be overwritten by solution. +! Back substitutions. Initialise locend/locendi to first free position +! after the end of the factor storage (we must read +! records in reverse order to the written order) + + locend = keep%rfree + locendi = keep%ifree + posdiag = keep%dfree + ldiag_solve = .false. + + do ir = nroot, 1, -1 + root = keep%roots(ir) +! Visit each node in tree rooted at root in reverse depth-first search order + node = root + cnode(0) = root; count(0) = 0 + depth = 1 + count(1) = 0 ! number of visited children + do + cnode(depth) = node + if (count(depth) == 0 .and. node > nelt) then + call back_indef(node,nb,locend,locendi,maxlen,varlist,num_rhs_bwd, & + lx,x,xlocal,posdiag,ld,d,lfa,fa,ldiag_solve,keep,info) + if (info%flag < 0) exit + nchild = size(keep%tree(node)%child) + if (nchild == 0) then + if (node == root) exit + else +! Descend to last child of node + count(depth) = 1 + node = keep%tree(node)%child(nchild) + depth = depth + 1 + count(depth) = 0 + cycle + end if + end if + +! Parent node + pnode = cnode(depth-1) + nchild = size(keep%tree(pnode)%child) + if (count(depth-1) < nchild) then +! There is another sibling of node - go to it + count(depth-1) = count(depth-1) + 1 + node = keep%tree(pnode)%child(nchild-count(depth-1)+1) + count(depth)=0 + cycle + end if + +! No siblings remain so go to parent + depth = depth - 1 + node = pnode +! If we have reached the root, we are done + if (depth <= 1) exit + + end do + if (info%flag < 0) go to 96 + end do + + ! write (6,*) 'x ' + ! write (6,*) x(1:n,1) + + if (present(scale)) then + do i = 1,n + x(i,1:num_rhs_bwd) = scale(i)*x(i,1:num_rhs_bwd) + end do + end if + + info%nio_read(1) = keep%idata%nio_read - info%nio_read(1) + info%nio_read(2) = keep%rdata%nio_read - info%nio_read(2) + info%nio_write(1) = keep%idata%nio_write - info%nio_write(1) + info%nio_write(2) = keep%rdata%nio_write - info%nio_write(2) + info%nwd_read(1) = keep%idata%nwd_read - info%nwd_read(1) + info%nwd_read(2) = keep%rdata%nwd_read - info%nwd_read(2) + info%nwd_write(1) = keep%idata%nwd_write - info%nwd_write(1) + info%nwd_write(2) = keep%rdata%nwd_write - info%nwd_write(2) + + if (control%print_level >= 1 .and. control%unit_diagnostics >= 0) then + write (control%unit_diagnostics,'(/a)') & + ' Completed solve_fredholm with:' + write (control%unit_diagnostics, & + '(a,(/a,i12),4(/a/2es12.4))') & + ' information parameters (info%) :', & + ' flag Error flag = ', & + info%flag, & + ' nio_read(1:2) Number of records read from disk by OF01_read = ',& + real(info%nio_read(1:2)), & + ' nio_write(1:2) Number of records written to disk by OF01_write = ',& + real(info%nio_write(1:2)), & + ' nwd_read(1:2) Number of scalars read by OF01_read = ', & + real(info%nwd_read(1:2)), & + ' nwd_write(1:2) Number of scalars written by OF01_write = ', & + real(info%nwd_write(1:2)) + end if + +! write (6,'(a,f10.3)') 'tblas = ',tblas +! write (6,'(a,10i7)') 'sizes =',sizes(1:10) + + if (info%flag >= 0) go to 100 + + 95 info%flag = -1 + info%stat = st + call MA77_print_iflag(keep,nout,info%flag,st=info%stat) + go to 100 + + 96 call MA77_print_iflag(keep,nout,info%flag,ios=info%iostat) + +! Deallocate arrays we have done with. + 100 deallocate (varlist,stat=st) + deallocate (xlocal,stat=st) + deallocate (fa,stat=st) + deallocate (d,stat=st) + deallocate (count,stat=st) + deallocate (cnode,stat=st) +!******************************* + +! End solve + + end subroutine MA77_solve_fredholm_double + +!************************************************************************* + + subroutine MA77_lmultiply_double(trans,k,lx,x,ly,y,keep,control,info,scale) + +! Forms y=PLx or y=(PL)^Tx + + logical, intent (in) :: trans ! if set to .true. compute (PL)^TX; +! otherwise, compute (PL)X + integer(short), intent (in) :: k + integer(short), intent (in) :: lx, ly + real (wp), intent (inout) :: x(lx,k) ! On entry, x must +! be set to hold the vector to be multiplied. +! Only altered in case of trans = .true. and scale present. + real (wp), intent (out) :: y(ly,k) ! On exit, +! holds PLX or (PL)^TX + type (MA77_keep), intent (inout) :: keep + type (MA77_control), intent (in) :: control + type (MA77_info), intent (inout) :: info + real(wp), intent(in), optional :: scale(:) ! if present, +! must hold scaling factors. If scale was present on +! call to ma77_factor , then scale should also be present here. + + + real (wp), allocatable :: xlocal(:,:) ! temporary dense vector + real (wp), allocatable :: zlocal(:,:) ! temporary dense vector + real (wp), allocatable :: fa(:) ! used to hold factor entries + integer(short), allocatable :: varlist(:) ! used for variable lists + integer(short), allocatable :: count(:) ! used for depth +! first search of tree to keep track of level we are at + integer(short), allocatable :: cnode(:) ! used for depth +! first search of tree + +! Possible error returns: +! -1 Allocation error +! -3 Error in sequence of calls +! -5 Error from of01 (error in Fortran inquire) +! -6 Error from of01 (error in Fortran read) +! -7 Error from of01 (error in Fortran open) +! -16 -17 Error from of01_read or of01_write (Fortran open failed +! for all path) +! -24 Error in size of x or y + + + integer(short) :: depth ! depth in tree + integer(short) :: ir ! do loop variable + integer(short) :: i ! temporary variable + integer(long) :: lfa ! size of array fa + integer(long) :: locend ! initialised to keep%rfree (first free position +! after end of factor storage) + integer(long) :: locendi ! initialised to keep%ifree (first free position +! after end of factor storage) (integer data) + integer(long) :: locfac ! initialised to start of factor storage + integer(long) :: locint ! initialised to start of integer factor + integer(short) :: maxlen ! holds largest number of variables in +! an element list + integer(short) :: nchild ! number of children of node in tree + integer(short) :: nb ! set to keep%nb + integer(short) :: n ! set to keep%n + integer(short) :: nelt ! set to keep%nelt + integer(short) :: node ! node in tree + integer(short) :: nout ! output unit + integer(short) :: nrhs ! set to k (no. of colums to multiply) + integer(short) :: nroot ! number of roots (components) + integer(short) :: pnode ! parent node in tree + integer(short) :: root ! root of tree + integer(short) :: st ! stat parameter + +! tblas = 0.0; sizes = 0 + +! Perform appropriate printing + if (control%print_level >= 1 .and. control%unit_diagnostics >= 0) then + write (control%unit_diagnostics,'(//a)') & + ' Entering MA77_lmultiply with:' + write (control%unit_diagnostics,'(a,7(/a,i12))') & + ' control parameters (control%) :', & + ' print_level Level of diagnostic printing = ', & + control%print_level, & + ' unit_diagnostics Unit for diagnostics = ', & + control%unit_diagnostics, & + ' unit_error Unit for errors = ', & + control%unit_error, & + ' unit_warning Unit for warnings = ', & + control%unit_warning, & + ' k = ', & + k, & + ' lx = ', & + lx, & + ' ly = ', & + ly + end if + if (present(scale)) then + if (control%print_level >= 1 .and. control%unit_diagnostics >= 0) & + write (control%unit_diagnostics,'(a)') & + ' Scaling factors supplied. ' + end if + + + nout = control%unit_error + if (control%print_level < 0) nout = -1 + keep%name = 'MA77_lmultiply' + + info%flag = keep%flag + info%nio_read(1) = keep%idata%nio_read + info%nio_read(2) = keep%rdata%nio_read + info%nio_write(1) = keep%idata%nio_write + info%nio_write(2) = keep%rdata%nio_write + info%nwd_read(1) = keep%idata%nwd_read + info%nwd_read(2) = keep%rdata%nwd_read + info%nwd_write(1) = keep%idata%nwd_write + info%nwd_write(2) = keep%rdata%nwd_write + +! Check status parameter + if (keep%status /= 3) then + info%flag = -3 + call MA77_print_iflag(keep,nout,info%flag) + return + end if + + n = keep%n + if (keep%n == 0) return + nelt = keep%nelt + + if (lx < n) then + info%flag = -24 + call MA77_print_iflag(keep,nout,info%flag) + if (nout >= 0) write (nout,'(a,i8,a,i8)') & + ' Increase lx from ', lx, ' to at least ', n + return + end if + + if (ly < n) then + info%flag = -24 + call MA77_print_iflag(keep,nout,info%flag) + if (nout >= 0) write (nout,'(a,i8,a,i8)') & + ' Increase ly from ', lx, ' to at least ', n + return + end if + + if (k < 1) then + info%flag = -24 + call MA77_print_iflag(keep,nout,info%flag) + if (nout >= 0) write (nout,'(a,i8,a,i8)') & + ' k must be at least 1. k = ', k + return + end if + nrhs = k + + if (present(scale)) then + if (keep%scale == 0) info%flag = -39 + if (size(scale) < n) info%flag = -39 + else + if (keep%scale == 1) info%flag = -39 + end if + if (info%flag == -39) then + call MA77_print_iflag(keep,nout,info%flag) + return + end if + + + deallocate (varlist,stat=st) + deallocate (xlocal,stat=st) + deallocate (zlocal,stat=st) + deallocate (fa,stat=st) + deallocate (count,stat=st) + deallocate (cnode,stat=st) + + allocate (count(0:keep%maxdepth),cnode(0:keep%maxdepth),stat=st) + if (st /= 0) goto 95 + + maxlen = keep%maxlen + if (.not. keep%pos_def) maxlen = max(maxlen,keep%maxfrontb) + + nb = keep%nb + + lfa = keep%maxfa + if (keep%index(2) == 0) lfa = 1 + allocate (fa(lfa),stat=st) + if (st /= 0) go to 95 + + allocate (varlist(maxlen+1),stat=st) + if (st /= 0) go to 95 + allocate (xlocal(maxlen,nrhs),zlocal(maxlen,nrhs),stat=st) + if (st /= 0) go to 95 + ! ensuer xlocal is well defined. + xlocal(1:maxlen,1:nrhs) = zero + + nroot = size(keep%roots) + + ! setting y to zero is needed in the trans=.false. case. + ! Bu we also set it to zero in trans=.true. so that + ! all entries of y are well defined (o.w. if i is not used to index + ! a variable, y(i) will be undefined) + y(1:n,1:nrhs) = zero + + if (.not. trans) then + +! Form PLx. Mimic forward eliminations. Initialise locfac/locint to the start of +! the factor storage (skip diagonal entries that are stored first) + locfac = keep%posfac + n + if (.not. keep%pos_def) locfac = locfac + n + locint = keep%posint + + do ir = 1, nroot + root = keep%roots(ir) + node = root + depth = 1 + count(depth) = 0 ! no. of visited children +! Visit each node in depth-first search order + do while(depth.gt.0) + cnode(depth) = node +! Visit children + nchild = size(keep%tree(node)%child) + if (count(depth) < nchild) then + count(depth) = count(depth) + 1 + if (keep%tree(node)%child(count(depth)) > keep%nelt) then +! The next child of node is not a leaf node so descend to it + node = keep%tree(node)%child(count(depth)) + depth = depth + 1 + count(depth) = 0 + cycle + end if + end if + +! Perform work at node. + call lforward(node,nb,locfac,locint,maxlen,varlist,nrhs,lx,x,ly,y, & + xlocal,zlocal,lfa,fa,keep,info) + if (info%flag < 0) exit +! If we have reached the root, we are done + if (node == root) exit + +! Go to parent + depth = depth - 1 + pnode = cnode(depth) + node = pnode + + end do ! tree + if (info%flag < 0) go to 96 + end do ! roots + + if (present(scale)) then + do i = 1,n + y(i,1:nrhs) = y(i,1:nrhs) / scale(i) + end do + end if + + else + +! (PL)^Tx. Mimic back sub. Scale first (S^{-1}x) + + if (present(scale)) then + do i = 1,n + x(i,1:nrhs) = x(i,1:nrhs) / scale(i) + end do + end if + + locend = keep%rfree + locendi = keep%ifree + do ir = nroot, 1, -1 + root = keep%roots(ir) +! Visit each node in tree rooted at root in reverse depth-first search order + node = root + cnode(0) = root; count(0) = 0 + depth = 1 + count(1) = 0 ! number of visited children + do + cnode(depth) = node + if (count(depth) == 0 .and. node > nelt) then + if (keep%pos_def) then + call lback_posdef(node,nb,locend,maxlen,varlist,nrhs, & + lx,x,ly,y,xlocal,zlocal,lfa,fa,keep,info) + else + call lback_indef(node,nb,locend,locendi,maxlen,varlist,nrhs, & + lx,x,ly,y,xlocal,lfa,fa,keep,info) + end if + if (info%flag < 0) exit + nchild = size(keep%tree(node)%child) + if (nchild == 0) then + if (node == root) exit + else +! Descend to last child of node + count(depth) = 1 + node = keep%tree(node)%child(nchild) + depth = depth + 1 + count(depth) = 0 + cycle + end if + end if + +! Parent node + pnode = cnode(depth-1) + nchild = size(keep%tree(pnode)%child) + if (count(depth-1) < nchild) then +! There is another sibling of node - go to it + count(depth-1) = count(depth-1) + 1 + node = keep%tree(pnode)%child(nchild-count(depth-1)+1) + count(depth)=0 + cycle + end if + +! No siblings remain so go to parent + depth = depth - 1 + node = pnode +! If we have reached the root, we are done + if (depth <= 1) exit + + end do + if (info%flag < 0) go to 96 + end do + + end if + + + info%nio_read(1) = keep%idata%nio_read - info%nio_read(1) + info%nio_read(2) = keep%rdata%nio_read - info%nio_read(2) + info%nio_write(1) = keep%idata%nio_write - info%nio_write(1) + info%nio_write(2) = keep%rdata%nio_write - info%nio_write(2) + info%nwd_read(1) = keep%idata%nwd_read - info%nwd_read(1) + info%nwd_read(2) = keep%rdata%nwd_read - info%nwd_read(2) + info%nwd_write(1) = keep%idata%nwd_write - info%nwd_write(1) + info%nwd_write(2) = keep%rdata%nwd_write - info%nwd_write(2) + + if (control%print_level >= 1 .and. control%unit_diagnostics >= 0) then + write (control%unit_diagnostics,'(/a)') & + ' Completed lmultiply with:' + write (control%unit_diagnostics, & + '(a,(/a,i12),4(/a/2es12.4))') & + ' information parameters (info%) :', & + ' flag Error flag = ', & + info%flag, & + ' nio_read(1:2) Number of records read from disk by OF01_read = ',& + real(info%nio_read(1:2)), & + ' nio_write(1:2) Number of records written to disk by OF01_write = ',& + real(info%nio_write(1:2)), & + ' nwd_read(1:2) Number of scalars read by OF01_read = ', & + real(info%nwd_read(1:2)), & + ' nwd_write(1:2) Number of scalars written by OF01_write = ', & + real(info%nwd_write(1:2)) + end if + + if (info%flag >= 0) go to 100 + + 95 info%flag = -1 + info%stat = st + call MA77_print_iflag(keep,nout,info%flag,st=info%stat) + go to 100 + + 96 call MA77_print_iflag(keep,nout,info%flag,ios=info%iostat) + +! Deallocate arrays we have done with. + 100 deallocate (varlist,stat=st) + deallocate (xlocal,stat=st) + deallocate (zlocal,stat=st) + deallocate (fa,stat=st) + deallocate (count,stat=st) + deallocate (cnode,stat=st) +!******************************* + +! End multiply + + end subroutine MA77_lmultiply_double + +!******************************* + + subroutine forward(node,nb,locfac,locint,maxlen,varlist,nrhs,lx,x, & + xlocal,lfa,fa,lw54,w54,keep,info) +! This subroutine performs forward eliminations at node. +! User-supplied rhs vectors are overwritten by the partial solution. + + integer(short), intent (in) :: node + integer(short), intent (in) :: nb ! block size + integer(long), intent (inout) :: locfac! initialised to start of factor + integer(long), intent (inout) :: locint! initialised to start of integers + integer(short), intent (in) :: maxlen + integer(short), intent (inout) :: varlist(maxlen+1)! used for variable lists + integer(short), intent (in) :: nrhs + integer(short), intent (in) :: lx + real (wp), intent (inout) :: x(lx,nrhs) + real (wp), intent (inout) :: xlocal(maxlen,nrhs) + integer(short) :: lw54 ! length of workarray w54 + real (wp), intent (inout) :: w54(lw54) + integer(long) :: lfa ! length of workarray lfa + real (wp), intent (inout) :: fa(lfa) + type (MA77_keep), intent (inout) :: keep + type (MA77_info), intent (inout) :: info + + integer(short) :: flag ! local error flag + integer(short) :: i + integer(long) :: ii + integer(short) :: j + integer(short) :: jvar ! variable belonging to node + integer(long) :: loc ! location in file + integer(long) :: lq ! number of factor entries to read + integer(short) :: lreals ! number of reals to be read at node + integer(short) :: nfront ! number of variables in node + integer(long) :: nfront_long ! number of variables in node + integer(short) :: nelim ! number of eliminations at node + integer(long) :: nelim_long ! number of eliminations at node + + +! Possible error returns: +! -5 Error from of01 (error in Fortran inquire) +! -6 Error from of01 (error in Fortran read) +! -7 Error from of01 (error in Fortran open) +! -16 -17 Error from of01_read or of01_write (Fortran open failed +! for all path) + +! Immediate return for leaf node. + if (node <= keep%nelt) return + + if (keep%pos_def) then + nelim = keep%tree(node)%nelim + nfront = abs(keep%size(node)) + loc = keep%ifile(node) + if (keep%index(1) >= 0) then +! Read integer data from file + call of01_read(keep%index(1),loc,nfront,varlist,flag, & + keep%idata,lp=-1) + if (flag < 0) go to 480 +! Copy part of right-hand side array x corresponding to the variables +! that are in varlist into local array xlocal + do i = 1, nfront + jvar = varlist(i) + xlocal(i,1:nrhs) = x(jvar,1:nrhs) + end do + else +! Integers are held in keep%imain + do i = 1, nfront + jvar = keep%imain(loc+i-1) + xlocal(i,1:nrhs) = x(jvar,1:nrhs) + end do + end if +! write (6,'(6es12.4)') xlocal(1:nfront,1) + + if (keep%index(2) >= 0) then +! Read in required part of factor and do forward elimination ops. + lreals = nfront + ii = 1 + do j = 1,nelim + call of01_read(keep%index(2),locfac,lreals,fa(ii:ii+lreals-1), & + flag,keep%rdata,lp=-1) + if (flag < 0) go to 485 + locfac = locfac + lreals + ii = ii + lreals + lreals = lreals - 1 + end do + if (nrhs >= 4) then + call ma54_forward2(nfront,nelim,nb,nrhs,fa,xlocal,maxlen,nb, & + w54,flag) + else + do j = 1,nrhs + call ma54_forward1(nfront,nelim,nb,fa,xlocal(:,j),flag) + end do + end if + else +! Factor entries are held in keep%rmain + nfront_long = nfront + nelim_long = nelim + lq = (nelim_long*nelim_long+nelim_long)/2 + & + nelim_long*(nfront_long-nelim_long) + if (nrhs >= 4) then + call ma54_forward2(nfront,nelim,nb,nrhs, & + keep%rmain(locfac:locfac+lq-1),xlocal,maxlen,nb,w54,flag) + else + do j = 1,nrhs + call ma54_forward1(nfront,nelim,nb, & + keep%rmain(locfac:locfac+lq-1),xlocal(:,j),flag) + end do + end if + locfac = locfac + lq + end if +! if (flag /= 0) then +! write (6,*) 'error forward: flag=', flag +! end if + +! write (6,'(a,6es12.4)') 'after ',xlocal(1:nelim,1) + + else +! Indefinite case. The variable lists are held after the main integer lists + nfront = keep%size_ind(node) + if (keep%index(1) >= 0) then + call of01_read(keep%index(1),locint,nfront+1,varlist,flag, & + keep%idata,lp=-1) + if (flag < 0) go to 480 +! Increment locint so that it points to start of integer data for next node + locint = locint + nfront + 1 + nelim = varlist(nfront+1) + if (nelim == 0) return +! Copy part of right-hand side array x corresponding to the variables +! that are in varlist into local array xlocal + do i = 1, nfront + jvar = varlist(i) + xlocal(i,1:nrhs) = x(jvar,1:nrhs) + end do + else +! File not in use. Integers are held in keep%imain + loc = locint + locint = locint + nfront + 1 + nelim = keep%imain(loc+nfront) + if (nelim == 0) return + do i = 1, nfront + jvar = keep%imain(loc+i-1) + xlocal(i,1:nrhs) = x(jvar,1:nrhs) + end do + end if + + lq = nelim + lq = (lq*lq+lq)/2 + lq*(nfront-lq) + if (keep%index(2) >= 0) then +! read required part of factor and do forward eliminations + lreals = nfront + ii = 1 + do j = 1,nelim + call of01_read(keep%index(2),locfac,lreals,fa(ii:ii+lreals-1), & + flag,keep%rdata,lp=-1) + if (flag < 0) go to 485 + locfac = locfac + lreals + ii = ii + lreals + lreals = lreals - 1 + end do + + if (nrhs >= 4) then + call ma64_solveL2(nfront,nelim,nb,nrhs,xlocal,maxlen,flag,fa,lq) + else + do j = 1,nrhs + call ma64_solveL1(nfront,nelim,nb,xlocal(:,j),flag,fa,lq) + end do + end if + else +! factors are in keep%rmain + if (nrhs >= 4) then + call ma64_solveL2(nfront,nelim,nb,nrhs,xlocal,maxlen, & + flag,keep%rmain(locfac:locfac+lq-1),lq) + else + do j = 1,nrhs + call ma64_solveL1(nfront,nelim,nb,xlocal(:,j),flag, & + keep%rmain(locfac:locfac+lq-1),lq) + end do + end if + locfac = locfac + lq + end if +! write (6,'(a,6es12.4)') 'after ',xlocal(1:nfront,1) + end if + +! copy xlocal back to x (we overwrite the given right-hand +! side array with the partial solution) + if (keep%index(1) >= 0) then + do i = 1, nfront + jvar = varlist(i) + x(jvar,1:nrhs) = xlocal(i,1:nrhs) + end do + else + do i = 1, nfront + jvar = keep%imain(loc+i-1) + x(jvar,1:nrhs) = xlocal(i,1:nrhs) + end do + end if +! write (6,'(a,6es12.4)') 'after ',x(1:keep%n,1) + + if (info%flag >= 0) go to 500 + +480 info%iostat = keep%idata%iostat + info%stat = keep%idata%stat + info%flag = flag + if (flag == -17) info%flag = -16 + go to 500 + +485 info%iostat = keep%rdata%iostat + info%stat = keep%rdata%stat + info%flag = flag + if (flag == -17) info%flag = -16 + go to 500 + +500 return + + end subroutine forward + +!******************************* + + subroutine back_posdef(node,nb,locend,maxlen,varlist,nrhs,lx,x, & + xlocal,lfa,fa,lw54,w54,keep,info) + +! This subroutine performs backsubstitution on +! the subtree rooted at node (pos def case). + + integer(short), intent (in) :: node + integer(short), intent (in) :: nb ! block size + integer(long), intent (inout) :: locend ! first free position +! after end of factor storage) + integer(short), intent (in) :: maxlen + integer(short), intent (inout) :: varlist(maxlen+1)! used for variable lists + integer(short), intent (in) :: nrhs + integer(short), intent (in) :: lx + real (wp), intent (inout) :: x(lx,nrhs) + real (wp), intent (inout) :: xlocal(maxlen,nrhs) + integer(short) :: lw54 ! length of workarray w54 + real (wp), intent (inout) :: w54(lw54) + integer(long) :: lfa ! length of workarray lfa + real (wp), intent (inout) :: fa(lfa) + type (MA77_keep), intent (inout) :: keep + type (MA77_info), intent (inout) :: info + + integer(short) :: flag ! local error flag + integer(short) :: i + integer(long) :: ii + integer(short) :: j + integer(short) :: jvar ! variable belonging to node + integer(long) :: loc ! location in file + integer(long) :: lq ! number of factor entries to read + integer(short) :: lreals ! number of reals to be read at node + integer(short) :: nfront ! number of variables in node + integer(long) :: nfront_long ! number of variables in node + integer(short) :: nelim ! number of eliminations at node + integer(long) :: nelim_long ! number of eliminations at node + +! Possible error returns: +! -5 Error from of01 (error in Fortran inquire) +! -6 Error from of01 (error in Fortran read) +! -7 Error from of01 (error in Fortran open) +! -16 -17 Error from of01_read or of01_write (Fortran open failed +! for all path) + +! Immediate return for leaf node. + if (node <= keep%nelt) return + + nelim = keep%tree(node)%nelim + nfront = keep%size(node) + loc = keep%ifile(node) + if (keep%index(1) >= 0) then + call of01_read(keep%index(1),loc,nfront,varlist,flag,& + keep%idata,lp=-1) + if (flag < 0) go to 480 +! copy partial solution which is held in x into local array + do i = 1, nfront + jvar = varlist(i) + xlocal(i,1:nrhs) = x(jvar,1:nrhs) + end do + else + do i = 1, nfront + jvar = keep%imain(loc+i-1) + xlocal(i,1:nrhs) = x(jvar,1:nrhs) + end do + end if + + nfront_long = nfront + nelim_long = nelim + lq = (nelim_long*nelim_long+nelim_long)/2 + & + nelim_long*(nfront_long-nelim_long) + locend = locend - lq + if (keep%index(2) >= 0) then +! read required part of factor and do back sub. ops. + lreals = nfront + ii = 1 + do j = 1,nelim + call of01_read(keep%index(2),locend,lreals,fa(ii:ii+lreals-1), & + flag,keep%rdata,lp=-1) + if (flag < 0) go to 485 + locend = locend + lreals + ii = ii + lreals + lreals = lreals - 1 + end do + locend = locend - lq +! write (6,'(6es12.4)') xlocal(1:nelim,1) + if (nrhs >= 4) then + call ma54_back2(nfront,nelim,nb,nrhs,fa,xlocal,maxlen,nb,& + w54,flag) + else + do j = 1,nrhs + call ma54_back1(nfront,nelim,nb,fa,xlocal(:,j),flag) + end do + end if + else + if (nrhs >= 4) then + call ma54_back2(nfront,nelim,nb,nrhs, & + keep%rmain(locend:locend+lq-1),xlocal,maxlen,nb,w54,flag) + else + do j = 1,nrhs + call ma54_back1(nfront,nelim,nb, & + keep%rmain(locend:locend+lq-1),xlocal(:,j),flag) + end do + end if + end if + +! copy part of xlocal corresponding to eliminated variables back into x + if (keep%index(1) >= 0) then + do i = 1, nelim + jvar = varlist(i) + x(jvar,1:nrhs) = xlocal(i,1:nrhs) +! write (6,*) jvar,x(jvar,1) + end do + else + do i = 1, nelim + jvar = keep%imain(loc+i-1) + x(jvar,1:nrhs) = xlocal(i,1:nrhs) +! write (6,*) jvar,x(jvar,1) + end do + end if +! write (6,'(6es12.4)') xlocal(1:nelim,1) + + if (info%flag >= 0) go to 500 + +480 info%iostat = keep%idata%iostat + info%stat = keep%idata%stat + info%flag = flag + if (flag == -17) info%flag = -16 + go to 500 + +485 info%iostat = keep%rdata%iostat + info%stat = keep%rdata%stat + info%flag = flag + if (flag == -17) info%flag = -16 + go to 500 + +500 return + + end subroutine back_posdef + +!******************************* + + subroutine back_indef(node,nb,locend,locendi,maxlen,varlist,nrhs,lx,x, & + xlocal,posdiag,ld,d,lfa,fa,ldiag_solve,keep,info) + +! This subroutine performs backsubstitution on +! the subtree rooted at node (indefinite case). + + integer(short), intent (in) :: node + integer(short), intent (in) :: nb ! block size + integer(long), intent (inout) :: locend ! first free position +! after end of factor storage) + integer(long), intent (inout) :: locendi ! first free position +! after end of factor storage) (integer data) + integer(short), intent (in) :: maxlen + integer(short), intent (inout) :: varlist(maxlen+1)! used for variable lists + integer(short), intent (in) :: nrhs + integer(short), intent (in) :: lx + real (wp), intent (inout) :: x(lx,nrhs) + real (wp), intent (inout) :: xlocal(maxlen,nrhs) + integer(long), intent (inout) :: posdiag ! start of diagonal data for node + integer(short), intent (in) :: ld + real (wp), intent (inout) :: d(ld) + integer(long) :: lfa ! length of workarray lfa + real (wp), intent (inout) :: fa(lfa) + logical, intent(in) :: ldiag_solve ! controls whether a diagonal solve +! is performed on the call to the backsubstitution. + type (MA77_keep), intent (inout) :: keep + type (MA77_info), intent (inout) :: info + + integer(short) :: dreals + integer(short) :: flag ! local error flag + integer(short) :: i + integer(long) :: ii + integer(short) :: j + integer(short) :: jvar ! variable belonging to node + integer(long) :: lcopy ! temporary copy of locend + integer(long) :: loc ! location in file + integer(long) :: lq ! number of factor entries to read + integer(short) :: lreals ! number of reals to be read at node + integer(short) :: nfront ! number of variables in node + integer(short) :: nelim ! number of eliminations at node + +! Possible error returns: +! -5 Error from of01 (error in Fortran inquire) +! -6 Error from of01 (error in Fortran read) +! -7 Error from of01 (error in Fortran open) +! -16 -17 Error from of01_read or of01_write (Fortran open failed +! for all path) + +! Immediate return for leaf node. + if (node <= keep%nelt) return + +! In indefinite case, lists are held after main initial integer lists. + nfront = keep%size_ind(node) + locendi = locendi - nfront - 1 + if (keep%index(1) >= 0) then + call of01_read(keep%index(1),locendi,nfront+1,varlist,flag,& + keep%idata,lp=-1) + if (flag < 0) go to 480 + nelim = varlist(nfront+1) + if (nelim == 0) go to 100 +! copy partial solution which is held in x into local array +! write (6,*) 'partial solution' + do i = 1, nfront + jvar = varlist(i) + xlocal(i,1:nrhs) = x(jvar,1:nrhs) + end do + else +! file not in use + nelim = keep%imain(locendi+nfront) + if (nelim == 0) go to 100 + loc = locendi +! copy partial solution which is held in x into local array +! write (6,*) 'partial solution' + do i = 1, nfront + jvar = keep%imain(loc+i-1) + xlocal(i,1:nrhs) = x(jvar,1:nrhs) + end do + end if + + lq = nelim + lq = (lq*lq+lq)/2 + lq*(nfront-lq) + locend = locend - lq + + if (ldiag_solve) then +! Diagonal solve is to be performed + + dreals = 2*nelim + posdiag = posdiag - dreals + if (keep%index(2) >= 0) then + lcopy = locend + lreals = nfront + ii = 1_long + do j = 1,nelim + call of01_read(keep%index(2),locend,lreals,fa(ii:ii+lreals-1), & + flag,keep%rdata,lp=-1) + if (flag < 0) go to 485 + locend = locend + lreals + ii = ii + lreals + lreals = lreals - 1 + end do +! reset locend + locend = lcopy + +! read in diagonal entries + call of01_read(keep%index(2),posdiag,dreals, & + d,flag,keep%rdata,lp=-1) + if (flag < 0) go to 485 + + if (nrhs >= 4) then + call ma64_solveDLT2(nfront,nelim,nb,nrhs,xlocal,maxlen, & + flag,fa,lq,d) + else + do j = 1,nrhs + call ma64_solveDLT1(nfront,nelim,nb,xlocal(:,j),flag,fa,lq,d) + end do + end if + + else + if (nrhs >= 4) then + call ma64_solveDLT2(nfront,nelim,nb,nrhs,xlocal,maxlen, & + flag,keep%rmain(locend:locend+lq-1),lq, & + keep%rmain(posdiag:posdiag+dreals-1)) + else + do j = 1,nrhs + call ma64_solveDLT1(nfront,nelim,nb,xlocal(:,j),flag, & + keep%rmain(locend:locend+lq-1),lq, & + keep%rmain(posdiag:posdiag+dreals-1)) + end do + end if + end if + + else +! diagonal solve not wanted (this is on a job=3 call to ma77_solve) + if (keep%index(2) >= 0) then + lcopy = locend + lreals = nfront + ii = 1 + do j = 1,nelim + call of01_read(keep%index(2),locend,lreals,fa(ii:ii+lreals-1), & + flag,keep%rdata,lp=-1) + if (flag < 0) go to 485 + locend = locend + lreals + ii = ii + lreals + lreals = lreals - 1 + end do +! reset locend + locend = lcopy + + if (nrhs >= 4) then + call ma64_solveLT2(nfront,nelim,nb,nrhs,xlocal,maxlen, & + flag,fa,lq) + else + do j = 1,nrhs + call ma64_solveLT1(nfront,nelim,nb,xlocal(:,j),flag,fa,lq) + end do + end if + + else + if (nrhs >= 4) then + call ma64_solveLT2(nfront,nelim,nb,nrhs,xlocal,maxlen, & + flag,keep%rmain(locend:locend+lq-1),lq) + else + do j = 1,nrhs + call ma64_solveLT1(nfront,nelim,nb,xlocal(:,j),flag, & + keep%rmain(locend:locend+lq-1),lq) + end do + end if + end if + + end if + +! copy part of xlocal corresponding to eliminated variables back into x + if (keep%index(1) >= 0) then + do i = 1, nelim + jvar = varlist(i) + x(jvar,1:nrhs) = xlocal(i,1:nrhs) +! write (6,*) jvar,x(jvar,1) + end do + else + do i = 1, nelim + jvar = keep%imain(loc+i-1) + x(jvar,1:nrhs) = xlocal(i,1:nrhs) +! write (6,*) jvar,x(jvar,1) + end do + end if +! write (6,'(6es12.4)') xlocal(1:nelim,1) + + + 100 if (info%flag >= 0) go to 500 + +480 info%iostat = keep%idata%iostat + info%stat = keep%idata%stat + info%flag = flag + if (flag == -17) info%flag = -16 + go to 500 + +485 info%iostat = keep%rdata%iostat + info%stat = keep%rdata%stat + info%flag = flag + if (flag == -17) info%flag = -16 + go to 500 + +500 return + + end subroutine back_indef + +!******************************* + + subroutine lforward(node,nb,locfac,locint,maxlen,varlist,nrhs,lx,x,ly,y, & + xlocal,zlocal,lfa,fa,keep,info) + +! Computes y = PLx. + + integer(short), intent (in) :: node + integer(short), intent (in) :: nb ! block size + integer(long), intent (inout) :: locfac! initialised to start of factor + integer(long), intent (inout) :: locint! initialised to start of integers + integer(short), intent (in) :: maxlen + integer(short), intent (inout) :: varlist(maxlen+1)! used for variable lists + integer(short), intent (in) :: nrhs + integer(short), intent (in) :: lx + real (wp), intent (in) :: x(lx,nrhs) + integer(short), intent (in) :: ly + real (wp), intent (inout) :: y(ly,nrhs) + !!!! note : as we currently loop over the right-handsides + ! and treat each one separately, xlocal and zlocal only need + ! to be rank-one arrays of size maxlen + real (wp), intent (inout) :: xlocal(maxlen,nrhs) + real (wp), intent (inout) :: zlocal(maxlen,nrhs) + integer(long) :: lfa ! length of workarray lfa + real (wp), intent (inout) :: fa(lfa) + type (MA77_keep), intent (inout) :: keep + type (MA77_info), intent (inout) :: info + + integer(short) :: flag ! local error flag + integer(short) :: i + integer(long) :: ii + integer(short) :: j + integer(short) :: jvar ! variable belonging to node + integer(long) :: loc ! location in file + integer(long) :: lq ! number of factor entries to read + integer(short) :: lreals ! number of reals to be read at node + integer(short) :: nfront ! number of variables in node + integer(long) :: nfront_long ! number of variables in node + integer(short) :: nelim ! number of eliminations at node + integer(long) :: nelim_long ! number of eliminations at node + + +! Possible error returns: +! -5 Error from of01 (error in Fortran inquire) +! -6 Error from of01 (error in Fortran read) +! -7 Error from of01 (error in Fortran open) +! -16 -17 Error from of01_read or of01_write (Fortran open failed +! for all path) + +! Immediate return for leaf node. + if (node <= keep%nelt) return + + if (keep%pos_def) then + nelim = keep%tree(node)%nelim + nfront = abs(keep%size(node)) + loc = keep%ifile(node) + + if (keep%index(1) >= 0) then +! Read integer data from file + call of01_read(keep%index(1),loc,nfront,varlist,flag, & + keep%idata,lp=-1) + if (flag < 0) go to 480 +! Copy part of array x corresponding to the variables +! that are in varlist into local array xlocal + do i = 1, nelim + jvar = varlist(i) + xlocal(i,1:nrhs) = x(jvar,1:nrhs) + end do + else +! Integers are held in keep%imain + do i = 1, nelim + jvar = keep%imain(loc+i-1) + xlocal(i,1:nrhs) = x(jvar,1:nrhs) + end do + end if + + if (keep%index(2) >= 0) then +! Read in required part of factor and do multiply. + lreals = nfront + ii = 1 + do j = 1,nelim + call of01_read(keep%index(2),locfac,lreals,fa(ii:ii+lreals-1), & + flag,keep%rdata,lp=-1) + if (flag < 0) go to 485 + locfac = locfac + lreals + ii = ii + lreals + lreals = lreals - 1 + end do + + do j = 1,nrhs + call ma54_multiplyL1(nfront,nelim,nb,fa,xlocal(:,j),zlocal(:,j),& + flag) + end do + + else +! Factor entries are held in keep%rmain + nfront_long = nfront + nelim_long = nelim + lq = (nelim_long*nelim_long+nelim_long)/2 + & + nelim_long*(nfront_long-nelim_long) + + do j = 1,nrhs + call ma54_multiplyL1(nfront,nelim,nb, & + keep%rmain(locfac:locfac+lq-1),xlocal(:,j),zlocal(:,j),flag) + end do + locfac = locfac + lq + end if + + if (keep%index(1) >= 0) then + do i = 1, nfront + jvar = varlist(i) + y(jvar,1:nrhs) = y(jvar,1:nrhs) + zlocal(i,1:nrhs) + end do + else + do i = 1, nfront + jvar = keep%imain(loc+i-1) + y(jvar,1:nrhs) = y(jvar,1:nrhs) + zlocal(i,1:nrhs) + end do + end if + + else + + +! Indefinite case. The variable lists are held after the main integer lists + nfront = keep%size_ind(node) + if (keep%index(1) >= 0) then + call of01_read(keep%index(1),locint,nfront+1,varlist,flag, & + keep%idata,lp=-1) + if (flag < 0) go to 480 +! Increment locint so that it points to start of integer data for next node + locint = locint + nfront + 1 + nelim = varlist(nfront+1) + if (nelim == 0) return +! Copy part of right-hand side array x corresponding to the variables +! that are in varlist into local array xlocal + do i = 1, nfront + jvar = varlist(i) + xlocal(i,1:nrhs) = x(jvar,1:nrhs) + end do + else +! File not in use. Integers are held in keep%imain + loc = locint + locint = locint + nfront + 1 + nelim = keep%imain(loc+nfront) + if (nelim == 0) return + do i = 1, nfront + jvar = keep%imain(loc+i-1) + xlocal(i,1:nrhs) = x(jvar,1:nrhs) + end do + end if + + lq = nelim + lq = (lq*lq+lq)/2 + lq*(nfront-lq) + if (keep%index(2) >= 0) then +! read required part of factor and do forward eliminations + lreals = nfront + ii = 1 + do j = 1,nelim + call of01_read(keep%index(2),locfac,lreals,fa(ii:ii+lreals-1), & + flag,keep%rdata,lp=-1) + if (flag < 0) go to 485 + locfac = locfac + lreals + ii = ii + lreals + lreals = lreals - 1 + end do + + do j = 1,nrhs + call ma64_multiplyL1(nfront,nelim,nb,xlocal(:,j),zlocal(:,j), & + flag,fa,lq) + end do + do i = 1, nfront + jvar = varlist(i) + y(jvar,1:nrhs) = y(jvar,1:nrhs) + zlocal(i,1:nrhs) + end do + + else +! factors are in keep%rmain + do j = 1,nrhs + call ma64_multiplyL1(nfront,nelim,nb,xlocal(:,j),zlocal(:,j),flag, & + keep%rmain(locfac:locfac+lq-1),lq) + end do + locfac = locfac + lq + do i = 1, nfront + jvar = varlist(i) + y(jvar,1:nrhs) = y(jvar,1:nrhs) + zlocal(i,1:nrhs) + end do + end if + end if + + if (info%flag >= 0) go to 500 + +480 info%iostat = keep%idata%iostat + info%stat = keep%idata%stat + info%flag = flag + if (flag == -17) info%flag = -16 + go to 500 + +485 info%iostat = keep%rdata%iostat + info%stat = keep%rdata%stat + info%flag = flag + if (flag == -17) info%flag = -16 + go to 500 + +500 return + + end subroutine lforward +!************************************** + + subroutine lback_posdef(node,nb,locend,maxlen,varlist,nrhs,lx,x, & + ly,y,xlocal,zlocal,lfa,fa,keep,info) + +! Computes y = (PL)^T x (pos def case). + + integer(short), intent (in) :: node + integer(short), intent (in) :: nb ! block size + integer(long), intent (inout) :: locend ! first free position +! after end of factor storage) + integer(short), intent (in) :: maxlen + integer(short), intent (inout) :: varlist(maxlen+1)! used for variable lists + integer(short), intent (in) :: nrhs + integer(short), intent (in) :: lx + real (wp), intent (in) :: x(lx,nrhs) + integer(short), intent (in) :: ly + real (wp), intent (inout) :: y(ly,nrhs) + real (wp), intent (out) :: xlocal(maxlen,nrhs) + real (wp), intent (out) :: zlocal(maxlen) + integer(long) :: lfa ! length of workarray lfa + real (wp), intent (inout) :: fa(lfa) + type (MA77_keep), intent (inout) :: keep + type (MA77_info), intent (inout) :: info + + integer(short) :: flag ! local error flag + integer(short) :: i + integer(long) :: ii + integer(short) :: j + integer(short) :: jvar ! variable belonging to node + integer(long) :: loc ! location in file + integer(long) :: lq ! number of factor entries to read + integer(short) :: lreals ! number of reals to be read at node + integer(short) :: nfront ! number of variables in node + integer(long) :: nfront_long ! number of variables in node + integer(short) :: nelim ! number of eliminations at node + integer(long) :: nelim_long ! number of eliminations at node + +! Possible error returns: +! -5 Error from of01 (error in Fortran inquire) +! -6 Error from of01 (error in Fortran read) +! -7 Error from of01 (error in Fortran open) +! -16 -17 Error from of01_read or of01_write (Fortran open failed +! for all path) + +! Immediate return for leaf node. + if (node <= keep%nelt) return + + nelim = keep%tree(node)%nelim + nfront = keep%size(node) + loc = keep%ifile(node) + if (keep%index(1) >= 0) then + call of01_read(keep%index(1),loc,nfront,varlist,flag,& + keep%idata,lp=-1) + if (flag < 0) go to 480 +! copy x into local array + do i = 1, nfront + jvar = varlist(i) + xlocal(i,1:nrhs) = x(jvar,1:nrhs) + end do + else + do i = 1, nfront + jvar = keep%imain(loc+i-1) + xlocal(i,1:nrhs) = x(jvar,1:nrhs) + end do + end if + + nfront_long = nfront + nelim_long = nelim + lq = (nelim_long*nelim_long+nelim_long)/2 + & + nelim_long*(nfront_long-nelim_long) + locend = locend - lq + if (keep%index(2) >= 0) then +! read required part of factor and multiply ops. + lreals = nfront + ii = 1 + do j = 1,nelim + call of01_read(keep%index(2),locend,lreals,fa(ii:ii+lreals-1), & + flag,keep%rdata,lp=-1) + if (flag < 0) go to 485 + locend = locend + lreals + ii = ii + lreals + lreals = lreals - 1 + end do + locend = locend - lq + do j = 1,nrhs + call ma54_multiplyLT1(nfront,nelim,nb,fa,xlocal(:,j),zlocal,flag) + end do + else + do j = 1,nrhs + call ma54_multiplyLT1(nfront,nelim,nb, & + keep%rmain(locend:locend+lq-1),xlocal(:,j),zlocal,flag) + end do + end if + +! copy part of xlocal back into y + if (keep%index(1) >= 0) then + do i = 1, nelim + jvar = varlist(i) + y(jvar,1:nrhs) = xlocal(i,1:nrhs) + end do + else + do i = 1, nelim + jvar = keep%imain(loc+i-1) + y(jvar,1:nrhs) = xlocal(i,1:nrhs) + end do + end if + + if (info%flag >= 0) go to 500 + +480 info%iostat = keep%idata%iostat + info%stat = keep%idata%stat + info%flag = flag + if (flag == -17) info%flag = -16 + go to 500 + +485 info%iostat = keep%rdata%iostat + info%stat = keep%rdata%stat + info%flag = flag + if (flag == -17) info%flag = -16 + go to 500 + +500 return + + end subroutine lback_posdef + +!******************************* + + subroutine lback_indef(node,nb,locend,locendi,maxlen,varlist,nrhs,lx,x, & + ly,y,xlocal,lfa,fa,keep,info) + +! Computes y = (PL)^T x (pos def case). + + integer(short), intent (in) :: node + integer(short), intent (in) :: nb ! block size + integer(long), intent (inout) :: locend ! first free position +! after end of factor storage) + integer(long), intent (inout) :: locendi ! first free position +! after end of factor storage) (integer data) + integer(short), intent (in) :: maxlen + integer(short), intent (inout) :: varlist(maxlen+1)! used for variable lists + integer(short), intent (in) :: nrhs + integer(short), intent (in) :: lx + real (wp), intent (in) :: x(lx,nrhs) + integer(short), intent (in) :: ly + real (wp), intent (inout) :: y(ly,nrhs) + real (wp), intent (inout) :: xlocal(maxlen,nrhs) + integer(long) :: lfa ! length of workarray lfa + real (wp), intent (inout) :: fa(lfa) + type (MA77_keep), intent (inout) :: keep + type (MA77_info), intent (inout) :: info + + integer(short) :: flag ! local error flag + integer(short) :: i + integer(long) :: ii + integer(short) :: j + integer(short) :: jvar ! variable belonging to node + integer(long) :: lcopy ! temporary copy of locend + integer(long) :: loc ! location in file + integer(long) :: lq ! number of factor entries to read + integer(short) :: lreals ! number of reals to be read at node + integer(short) :: nfront ! number of variables in node + integer(short) :: nelim ! number of eliminations at node + +! Possible error returns: +! -5 Error from of01 (error in Fortran inquire) +! -6 Error from of01 (error in Fortran read) +! -7 Error from of01 (error in Fortran open) +! -16 -17 Error from of01_read or of01_write (Fortran open failed +! for all path) + +! Immediate return for leaf node. + if (node <= keep%nelt) return + +! In indefinite case, lists are held after main initial integer lists. + nfront = keep%size_ind(node) + locendi = locendi - nfront - 1 + if (keep%index(1) >= 0) then + call of01_read(keep%index(1),locendi,nfront+1,varlist,flag,& + keep%idata,lp=-1) + if (flag < 0) go to 480 + nelim = varlist(nfront+1) + if (nelim == 0) go to 100 +! copy partial solution which is held in x into local array +! write (6,*) 'partial solution' + do i = 1, nfront + jvar = varlist(i) + xlocal(i,1:nrhs) = x(jvar,1:nrhs) + end do + else +! file not in use + nelim = keep%imain(locendi+nfront) + if (nelim == 0) go to 100 + loc = locendi +! copy partial solution which is held in x into local array +! write (6,*) 'partial solution' + do i = 1, nfront + jvar = keep%imain(loc+i-1) + xlocal(i,1:nrhs) = x(jvar,1:nrhs) + end do + end if + + lq = nelim + lq = (lq*lq+lq)/2 + lq*(nfront-lq) + locend = locend - lq + + if (keep%index(2) >= 0) then + lcopy = locend + lreals = nfront + ii = 1 + do j = 1,nelim + call of01_read(keep%index(2),locend,lreals,fa(ii:ii+lreals-1), & + flag,keep%rdata,lp=-1) + if (flag < 0) go to 485 + locend = locend + lreals + ii = ii + lreals + lreals = lreals - 1 + end do +! reset locend + locend = lcopy + + do j = 1,nrhs + call ma64_multiplyLT1(nfront,nelim,nb,xlocal(:,j),flag,fa,lq) + end do + + else + do j = 1,nrhs + call ma64_multiplyLT1(nfront,nelim,nb,xlocal(:,j),flag, & + keep%rmain(locend:locend+lq-1),lq) + end do + end if + + +! copy part of xlocal back into y + if (keep%index(1) >= 0) then + do i = 1, nelim + jvar = varlist(i) + y(jvar,1:nrhs) = xlocal(i,1:nrhs) + end do + else + do i = 1, nelim + jvar = keep%imain(loc+i-1) + y(jvar,1:nrhs) = xlocal(i,1:nrhs) + end do + end if + + + 100 if (info%flag >= 0) go to 500 + +480 info%iostat = keep%idata%iostat + info%stat = keep%idata%stat + info%flag = flag + if (flag == -17) info%flag = -16 + go to 500 + +485 info%iostat = keep%rdata%iostat + info%stat = keep%rdata%stat + info%flag = flag + if (flag == -17) info%flag = -16 + go to 500 + +500 return + + end subroutine lback_indef + +!******************************* + + subroutine diag_check(node,locint,maxlen,varlist,nrhs,lx,x, & + xlocal,posdiag,ld,d,flag_out,num_false,tol,keep,info) + +! indefinite singular case. check consistency after forward solve +! and perform diag solve. + + integer(short), intent (in) :: node + integer(long), intent (inout) :: locint ! initialised to start of integers + integer(short), intent (in) :: maxlen + integer(short), intent (inout) :: varlist(maxlen+1) ! variable lists + integer(short), intent (in) :: nrhs + integer(short), intent (in) :: lx + real (wp), intent (inout) :: x(lx,2*nrhs) + real (wp), intent (inout) :: xlocal(maxlen,nrhs) + integer(long), intent (inout) :: posdiag + integer(short), intent (in) :: ld + real (wp), intent (inout) :: d(ld) + logical, intent (inout) :: flag_out(nrhs) + integer(short), intent (inout) :: num_false ! number of inconsistent rhs + real(wp), intent (in) :: tol(nrhs) ! tolerance used to determine whether + ! or not system is consistent + type (MA77_keep), intent (inout) :: keep + type (MA77_info), intent (inout) :: info + + integer(short) :: dreals ! set to 2*nelim + integer(short) :: flag ! local error flag + integer(short) :: i, j + integer(short) :: irhs + integer(short) :: jvar + integer(short) :: nelim ! number of eliminations at node + integer(short) :: nfront ! number of variables in node + real(wp) :: temp + +! Possible error returns: +! -5 Error from of01 (error in Fortran inquire) +! -6 Error from of01 (error in Fortran read) +! -7 Error from of01 (error in Fortran open) + + +! Immediate return for leaf node. + if (node <= keep%nelt) return + +! In indefinite case, lists are held after main initial integer lists. + nfront = keep%size_ind(node) + if (keep%index(1) >= 0) then + call of01_read(keep%index(1),locint,nfront+1,varlist,flag,& + keep%idata,lp=-1) + if (flag < 0) go to 480 + nelim = varlist(nfront+1) + if (nelim == 0) go to 100 +! copy partial solution which is held in x into local array + do i = 1, nfront + jvar = varlist(i) + xlocal(i,1:nrhs) = x(jvar,1:nrhs) + end do + else +! file not in use + nelim = keep%imain(locint+nfront) + if (nelim == 0) go to 100 +! copy partial solution which is held in x into local array + do i = 1, nfront + jvar = keep%imain(locint+i-1) + xlocal(i,1:nrhs) = x(jvar,1:nrhs) + end do + end if + + dreals = 2*nelim + if (keep%index(2) >= 0) then +! read in diagonal entries + call of01_read(keep%index(2),posdiag,dreals, & + d,flag,keep%rdata,lp=-1) + if (flag < 0) go to 485 + else +! data held in keep%rmain + d(1:dreals) = keep%rmain(posdiag:posdiag+dreals-1) + end if + posdiag = posdiag + dreals + + do irhs = 1,nrhs + j = 1 + do + if (j > nelim) exit + if (d(2*j) .eq. zero) then +! 1x1 pivot + temp = xlocal(j,irhs) + if (flag_out(irhs) .and. d(2*j-1).eq.zero) then + ! check if rhs is inconsistent (but only if consistent so far) + if (abs(temp) .gt. tol(irhs)) then + flag_out(irhs) = .false. + num_false = num_false + 1 + ! set partial solution to be zero for this rhs, + ! except for entry corresponding to inconsistency + x(1:keep%n,irhs+nrhs) = zero + if (keep%index(1) >= 0) then + jvar = varlist(j) + else + jvar = keep%imain(locint+j-1) + end if + x(jvar,irhs+nrhs) = one + end if + end if + xlocal(j,irhs) = temp * d(2*j-1) + j = j + 1 + else +! 2x2 pivot ... this 2x2 is not singular so perform diag solve + temp = xlocal(j,irhs)*d(2*j-1) + xlocal(j+1,irhs)*d(2*j) + xlocal(j+1,irhs) = xlocal(j,irhs)*d(2*j) + xlocal(j+1,irhs)*d(2*j+1) + xlocal(j,irhs) = temp + j = j + 2 + end if + end do + + end do + +! Copy xlocal back to x(:,1:nrhs) + if (keep%index(1) >= 0) then + do i = 1, nfront + jvar = varlist(i) + x(jvar,1:nrhs) = xlocal(i,1:nrhs) + end do + else + do i = 1, nfront + jvar = keep%imain(locint+i-1) + x(jvar,1:nrhs) = xlocal(i,1:nrhs) + end do + end if + +! Increment locint so that it points to start of integer data for next node +100 locint = locint + nfront + 1 + + if (info%flag >= 0) go to 500 + +480 info%iostat = keep%idata%iostat + info%stat = keep%idata%stat + info%flag = flag + if (flag == -17) info%flag = -16 + go to 500 + +485 info%iostat = keep%rdata%iostat + info%stat = keep%rdata%stat + info%flag = flag + if (flag == -17) info%flag = -16 + go to 500 + +500 return + + end subroutine diag_check + +!******************************* + + subroutine diag_solve(node,locint,maxlen,varlist,nrhs,lx,x, & + xlocal,posdiag,ld,d,keep,info) +! This subroutine performs diagonal solve at node. + + integer(long), intent (inout) :: locint ! start of integer data for node + integer(short), intent (in) :: maxlen + integer(short), intent (in) :: node + integer(short), intent (inout) :: varlist(maxlen+1) ! variable lists + integer(short), intent (in) :: nrhs + integer(short), intent (in) :: lx + real (wp), intent (inout) :: x(lx,nrhs) + real (wp), intent (inout) :: xlocal(maxlen,nrhs) + integer(long), intent (inout) :: posdiag ! start of diagonal data for node + integer(short), intent (in) :: ld + real (wp), intent (inout) :: d(ld) + type (MA77_keep), intent (inout) :: keep + type (MA77_info), intent (inout) :: info + + integer(short) :: dreals + integer(short) :: flag ! local error flag + integer(short) :: i, j + integer(short) :: jvar ! variable belonging to node + integer(long) :: loc ! location in file + integer(short) :: nfront ! number of variables in node + integer(short) :: nelim ! number of eliminations at node + +! Possible error returns: +! -5 Error from of01 (error in Fortran inquire) +! -6 Error from of01 (error in Fortran read) +! -7 Error from of01 (error in Fortran open) +! -16 -17 Error from of01_read or of01_write (Fortran open failed +! for all path) + +! Immediate return for leaf node. + if (node <= keep%nelt) return + +! The variable lists are held after the main integer lists + nfront = keep%size_ind(node) + if (keep%index(1) >= 0) then + call of01_read(keep%index(1),locint,nfront+1,varlist,flag, & + keep%idata,lp=-1) + if (flag < 0) go to 480 +! Increment locint so that it points to start of integer data for next node + locint = locint + nfront + 1 + nelim = varlist(nfront+1) + if (nelim == 0) return +! Copy part of right-hand side array x corresponding to the variables +! that are in varlist into local array xlocal + do i = 1, nfront + jvar = varlist(i) + xlocal(i,1:nrhs) = x(jvar,1:nrhs) + end do + else +! File not in use. Integers are held in keep%imain + loc = locint + locint = locint + nfront + 1 + nelim = keep%imain(loc+nfront) + if (nelim == 0) return +!! Copy into varlist +!! varlist(1:nelim) = keep%imain(loc:loc+nelim-1) + do i = 1, nfront + jvar = keep%imain(loc+i-1) + xlocal(i,1:nrhs) = x(jvar,1:nrhs) + end do + end if + + dreals = 2*nelim + if (keep%index(2) >= 0) then +! read required part of d + call of01_read(keep%index(2),posdiag,dreals,d, & + flag,keep%rdata,lp=-1) + if (flag < 0) go to 485 + if (nrhs >= 4) then + call ma64_solveD2(nfront,nelim,nrhs,xlocal,maxlen,flag,d) + else + do j = 1,nrhs + call ma64_solveD1(nfront,nelim,xlocal(:,j),flag,d) + end do + end if + else +! data held in keep%rmain + if (nrhs >= 4) then + call ma64_solveD2(nfront,nelim,nrhs,xlocal,maxlen, & + flag,keep%rmain(posdiag:posdiag+dreals-1)) + else + do j = 1,nrhs + call ma64_solveD1(nfront,nelim,xlocal(:,j),flag, & + keep%rmain(posdiag:posdiag+dreals-1)) + end do + end if + end if + posdiag = posdiag + dreals + +! copy xlocal back to x + if (keep%index(1) >= 0) then + do i = 1, nfront + jvar = varlist(i) + x(jvar,1:nrhs) = xlocal(i,1:nrhs) + end do + else + do i = 1, nfront + jvar = keep%imain(loc+i-1) + x(jvar,1:nrhs) = xlocal(i,1:nrhs) + end do + end if + + if (info%flag >= 0) return + +480 info%iostat = keep%idata%iostat + info%stat = keep%idata%stat + info%flag = flag + if (flag == -17) info%flag = -16 + return + +485 info%iostat = keep%rdata%iostat + info%stat = keep%rdata%stat + info%flag = flag + if (flag == -17) info%flag = -16 + return + end subroutine diag_solve + + +!**************************************************************************** + subroutine MA77_enquire_posdef_double(d,keep,control,info) + +! allows user to obtain the pivots used + + type (MA77_keep), intent (inout) :: keep ! See derived-type declaration + type (MA77_control), intent (inout) :: control ! See derived-type declaration + type (MA77_info), intent (inout) :: info ! See derived-type declaration + + real(wp), intent (out) :: d(:) ! d(i) will hold the the i-th pivot. + +! Possible error returns: +! -1 Allocation error +! -3 Error in sequence of calls +! -5 Error from of01 (error in Fortran inquire) +! -6 Error from of01 (error in Fortran read) +! -7 Error from of01 (error in Fortran open) +! -16 -17 Error from of01_read or of01_write (Fortran open failed +! for all path) +! -35 Call does not follow a call to MA77_factor with pos_def = .true. +! -37 Error in size of d + + integer(short), allocatable :: count(:) ! used for depth +! first search of tree to keep track of level we are at + integer(short), allocatable :: cnode(:) ! used for depth +! first search of tree + integer(short) :: depth ! depth in tree + integer(short) :: i + integer(short) :: ir ! recursive do loop variable + integer(short) :: flag ! local error flag + integer(short) :: kpiv + integer(short) :: n + integer(short) :: nchild ! number of children of node in tree + integer(short) :: node ! node in tree + integer(short) :: nelim ! number of eliminations at node + integer(short) :: nout + integer(short) :: nroot ! number of roots (components) + integer(short) :: root ! root of tree + integer(short) :: pnode ! parent node in tree + integer(long) :: posdiag ! points to storage for diagonal entries + integer(short) :: st ! stat parameter + + nout = control%unit_error + if (control%print_level < 0) nout = -1 + keep%name = 'MA77_enquire_posdef' + + n = keep%n +! make checks + if (keep%status /= 3) then + info%flag = -3 + call MA77_print_iflag(keep,nout,info%flag) + return + end if + + if (.not.keep%pos_def) then + info%flag = -35 + call MA77_print_iflag(keep,nout,info%flag) + return + end if + + if (size(d) < n) then + info%flag = -37 + call MA77_print_iflag(keep,nout,info%flag) + return + end if + + deallocate (count,stat=st) + deallocate (cnode,stat=st) + + allocate (count(0:keep%maxdepth),cnode(0:keep%maxdepth),stat=st) + if (st /= 0) go to 495 + + nroot = size(keep%roots) +! initialise posdiag/locint + posdiag = keep%posfac + kpiv = 0 + do ir = 1, nroot + root = keep%roots(ir) + node = root + depth = 1 + count(depth) = 0 ! no. of visited children +! Visit each node in depth-first search order + do while(depth.gt.0) + cnode(depth) = node +! Visit children + nchild = size(keep%tree(node)%child) + if (count(depth) < nchild) then + count(depth) = count(depth) + 1 + if (keep%tree(node)%child(count(depth)) > keep%nelt) then +! The next child of node is not a leaf node so descend to it + node = keep%tree(node)%child(count(depth)) + depth = depth + 1 + count(depth) = 0 + cycle + end if + end if + +! Perform work at node. + call ask_posdef(node,kpiv) + if (info%flag < 0) exit +! If we have reached the root, we are done + if (node == root) exit + +! Go to parent + depth = depth - 1 + pnode = cnode(depth) + node = pnode + + end do ! tree + if (info%flag < 0) go to 496 + end do ! roots + + + go to 500 + +495 info%flag = -1 + info%stat = st + call MA77_print_iflag(keep,nout,info%flag,st=info%stat) + go to 500 + +496 call MA77_print_iflag(keep,nout,info%flag,ios=info%iostat) + +500 continue + deallocate (count,stat=st) + deallocate (cnode,stat=st) + + contains + +!******************************* + + subroutine ask_posdef(node,kpiv) + + integer(short), intent (in) :: node + integer(short), intent (inout) :: kpiv + +! Possible error returns: +! -5 Error from of01 (error in Fortran inquire) +! -6 Error from of01 (error in Fortran read) +! -7 Error from of01 (error in Fortran open) + +! Immediate return for leaf node. + if (node <= keep%nelt) return + + nelim = keep%tree(node)%nelim + if (nelim == 0) return + + if (keep%index(2) >= 0) then +! read required part of d + call of01_read(keep%index(2),posdiag,nelim,d(kpiv+1:kpiv+nelim), & + flag,keep%rdata,lp=-1) + if (flag < 0) go to 485 +! write (6,*) d(kpiv+1:kpiv+nelim) + else +! data held in keep%rmain + d(kpiv+1:kpiv+nelim) = keep%rmain(posdiag:posdiag+nelim-1) + end if + do i = 1,nelim + d(kpiv+i) = d(kpiv+i)**2 + end do + posdiag = posdiag + nelim + kpiv = kpiv + nelim + + if (info%flag >= 0) return + +485 info%iostat = keep%rdata%iostat + info%stat = keep%rdata%stat + info%flag = flag + if (flag == -17) info%flag = -16 + return + + end subroutine ask_posdef + + end subroutine ma77_enquire_posdef_double +!************************************************* + subroutine MA77_enquire_indef_double(piv_order,d,keep,control,info) + +! In indefinite case, the pivot sequence used will not necessarily be +! the same as that passed to ma77_factor (because of delayed pivots). This +! subroutine allows the user to obtain the pivot sequence that was +! actually used. +! also the entries of D^{-1} are returned using array d. + + type (MA77_keep), intent (inout) :: keep ! See derived-type declaration + type (MA77_control), intent (inout) :: control ! See derived-type declaration + type (MA77_info), intent (inout) :: info ! See derived-type declaration + + integer(short), intent (out) :: piv_order(:) ! +! If i is used to index a variable, its position in the pivot sequence will +! be placed in piv_order(i), with its sign negative if it is +! part of a 2 x 2 pivot; otherwise, piv_order(i) will be set to zero. + real(wp), intent (out) :: d(:,:) ! The diagonal entries of D^{-1} +! will be placed in d(1,:i) and the off-diagonal entries will +! be placed in d(2,:). The entries are held in pivot order. + +! Possible error returns: +! -1 Allocation error +! -3 Error in sequence of calls +! -5 Error from of01 (error in Fortran inquire) +! -6 Error from of01 (error in Fortran read) +! -7 Error from of01 (error in Fortran open) +! -16 -17 Error from of01_read or of01_write (Fortran open failed +! for all path) +! -34 Call does not follow a call to MA77_factor with pos_def = .false. +! -36 Error in size of piv_order +! -37 Error in size of d + + integer(short) :: depth ! depth in tree + integer(short) :: dreals ! set to 2*nelim + integer(short) :: flag ! local error flag + integer(short) :: i + integer(short) :: ir ! recursive do loop variable + integer(short) :: j ! temporary variable + integer(short) :: jj ! temporary variable + integer(short) :: kpiv + integer(short) :: k ! temporary variable + integer(short) :: maxlen ! holds largest number of variables in +! an element list + integer(short) :: n + integer(short) :: nchild ! number of children of node in tree + integer(short) :: node ! node in tree + integer(short) :: nelim ! number of eliminations at node + integer(short) :: nfront ! number of variables in node + integer(short) :: nout + integer(short) :: nroot ! number of roots (components) + integer(short) :: pnode ! parent node in tree + integer(short) :: root ! root of tree + integer(short) :: st ! stat parameter + integer(long) :: loc ! location in file to read from + integer(long) :: locint + integer(long) :: posdiag ! points to storage for diagonal entries + + integer(short), allocatable :: count(:) ! used for depth +! first search of tree to keep track of level we are at + integer(short), allocatable :: cnode(:) ! used for depth +! first search of tree + integer(short), allocatable :: varlist(:) ! used for variable lists + real(wp), allocatable :: d_copy(:) ! used for reading in entries of D + + nout = control%unit_error + if (control%print_level < 0) nout = -1 + keep%name = 'MA77_enquire_indef' + + n = keep%n +! make checks + if (keep%status /= 3) then + info%flag = -3 + call MA77_print_iflag(keep,nout,info%flag) + return + end if + + if (keep%pos_def) then + info%flag = -34 + call MA77_print_iflag(keep,nout,info%flag) + return + end if + + if (size(piv_order) < n) then + info%flag = -36 + call MA77_print_iflag(keep,nout,info%flag) + return + end if + piv_order(1:n) = 0 + + if (size(d,1) < 2 .or. size(d,2) < n) then + info%flag = -37 + call MA77_print_iflag(keep,nout,info%flag) + return + end if + + deallocate (varlist,stat=st) + deallocate (count,stat=st) + deallocate (cnode,stat=st) + deallocate (d_copy,stat=st) + + maxlen = keep%maxlen + if (.not. keep%pos_def) maxlen = max(maxlen,keep%maxfrontb) + allocate (count(0:keep%maxdepth),cnode(0:keep%maxdepth), & + varlist(maxlen+1),d_copy(2*keep%maxfrontb),stat=st) + if (st /= 0) go to 495 + + nroot = size(keep%roots) +! initialise posdiag/locint + posdiag = keep%posfac + locint = keep%posint + + d(1:2,1:n) = zero ! ensure do not returned with this undefined + + kpiv = 0 + do ir = 1, nroot + root = keep%roots(ir) + node = root + depth = 1 + count(depth) = 0 ! no. of visited children +! Visit each node in depth-first search order + do while(depth.gt.0) + cnode(depth) = node +! Visit children + nchild = size(keep%tree(node)%child) + if (count(depth) < nchild) then + count(depth) = count(depth) + 1 + if (keep%tree(node)%child(count(depth)) > keep%nelt) then +! The next child of node is not a leaf node so descend to it + node = keep%tree(node)%child(count(depth)) + depth = depth + 1 + count(depth) = 0 + cycle + end if + end if + +! Perform work at node. + call ask_indef(node,kpiv) + if (info%flag < 0) exit +! If we have reached the root, we are done + if (node == root) exit + +! Go to parent + depth = depth - 1 + pnode = cnode(depth) + node = pnode + + end do ! tree + if (info%flag < 0) go to 496 + end do ! roots + + go to 500 + +495 info%flag = -1 + info%stat = st + call MA77_print_iflag(keep,nout,info%flag,st=info%stat) + go to 500 + +496 call MA77_print_iflag(keep,nout,info%flag,ios=info%iostat) + +! Deallocate arrays we have done with. +500 deallocate (varlist,stat=st) + deallocate (count,stat=st) + deallocate (cnode,stat=st) + deallocate (d_copy,stat=st) + + contains + +!******************************* + + subroutine ask_indef(node,kpiv) + + integer(short), intent (in) :: node + integer(short), intent (inout) :: kpiv + +! Possible error returns: +! -5 Error from of01 (error in Fortran inquire) +! -6 Error from of01 (error in Fortran read) +! -7 Error from of01 (error in Fortran open) + +! Immediate return for leaf node. + if (node <= keep%nelt) return + +! The variable lists are held after the main integer lists + nfront = keep%size_ind(node) + loc = locint +! Increment locint so that it points to start of integer data for next node + locint = locint + nfront + 1 + if (keep%index(1) >= 0) then + call of01_read(keep%index(1),loc,nfront+1,varlist,flag, & + keep%idata,lp=-1) + if (flag < 0) go to 480 + nelim = varlist(nfront+1) + if (nelim == 0) return + else +! File not in use. Integers are held in keep%imain + nelim = keep%imain(loc+nfront) + if (nelim == 0) return +! Copy into varlist + varlist(1:nelim) = keep%imain(loc:loc+nelim-1) + end if + + dreals = 2*nelim + if (keep%index(2) >= 0) then +! read required part of d_copy + loc = posdiag + call of01_read(keep%index(2),loc,dreals,d_copy, & + flag,keep%rdata,lp=-1) + if (flag < 0) go to 485 + else +! data held in keep%rmain + d_copy(1:dreals) = keep%rmain(posdiag:posdiag+dreals-1) + end if + posdiag = posdiag + dreals + + j = 1 + jj = 1 + do i = 1,nelim + if (j > nelim) exit + kpiv = kpiv + 1 + k = varlist(j) + if (d_copy(jj+1) == zero) then +! 1x1 pivot (which could be zero) + d(1,kpiv) = d_copy(jj) + piv_order(k) = kpiv + j = j + 1; jj = jj + 2 + else + d(1,kpiv) = d_copy(jj) + d(2,kpiv) = d_copy(jj+1) + d(1,kpiv+1) = d_copy(jj+2) +! negative flags for 2x2 pivots + piv_order(k) = -kpiv + kpiv = kpiv + 1 + k = varlist(j+1) + piv_order(k) = -kpiv + j = j + 2; jj = jj + 4 + end if + end do + + if (info%flag >= 0) return + +480 info%iostat = keep%idata%iostat + info%stat = keep%idata%stat + info%flag = flag + if (flag == -17) info%flag = -16 + return + +485 info%iostat = keep%rdata%iostat + info%stat = keep%rdata%stat + info%flag = flag + if (flag == -17) info%flag = -16 + return + end subroutine ask_indef + + end subroutine ma77_enquire_indef_double +!************************************************* + subroutine MA77_alter_double(d,keep,control,info) + +! In indefinite case, the entries of D^{-1} may be changed + + type (MA77_keep), intent (inout) :: keep ! See derived-type declaration + type (MA77_control), intent (inout) :: control ! See derived-type declaration + type (MA77_info), intent (inout) :: info ! See derived-type declaration + + real(wp), intent (in) :: d(:,:) ! The required diagonal entries +! of D^{-1} must be placed in d(1,i) (i = 1,...n) +! and the off-diagonal entries must be placed in d(2,i) (i = 1,...n-1). + +! Possible error returns: +! -1 Allocatation error +! -3 Error in sequence of calls +! -5 Error from of01 (error in Fortran inquire) +! -6 Error from of01 (error in Fortran read) +! -7 Error from of01 (error in Fortran open) +! -16 -17 Error from of01_read or of01_write (Fortran open failed +! for all path) +! -34 Call does not follow a call to MA77_factor with pos_def = .false. +! -37 Error in size of d + + integer(short) :: depth ! depth in tree + integer(short) :: dreals ! set to 2*nelim + integer(short) :: flag ! local error flag + integer(short) :: i + integer(short) :: ir ! recursive do loop variable + integer(short) :: itemp(1) + integer(short) :: j ! temporary variable + integer(short) :: jj ! temporary variable + integer(short) :: kpiv + integer(short) :: n + integer(short) :: nchild ! number of children of node in tree + integer(short) :: nfront ! number of variables in node + integer(short) :: node ! node in tree + integer(short) :: nelim ! number of eliminations at node + integer(short) :: nout + integer(short) :: nroot ! number of roots (components) + integer(short) :: pnode ! parent node in tree + integer(short) :: root ! root of tree + integer(long) :: loc ! location in file to read from + integer(long) :: locw ! location in file to write to + integer(long) :: locint + integer(long) :: posdiag ! points to storage for diagonal entries + integer(short) :: st ! stat parameter + logical :: two ! set to .true. for 2x2 pivot + + integer(short), allocatable :: count(:) ! used for depth +! first search of tree to keep track of level we are at + integer(short), allocatable :: cnode(:) ! used for depth +! first search of tree + real(wp), allocatable :: d_copy(:) ! used for writing +! out changed entries on diagonal + + nout = control%unit_error + if (control%print_level < 0) nout = -1 + keep%name = 'MA77_enquire_indef' + + n = keep%n +! make checks + if (keep%status /= 3) then + info%flag = -3 + call MA77_print_iflag(keep,nout,info%flag) + return + end if + + if (keep%pos_def) then + info%flag = -34 + call MA77_print_iflag(keep,nout,info%flag) + return + end if + + if (size(d,1) < 2 .or. size(d,2) < n) then + info%flag = -37 + call MA77_print_iflag(keep,nout,info%flag) + return + end if + + deallocate (count,stat=st) + deallocate (cnode,stat=st) + deallocate (d_copy,stat=st) + + allocate (count(0:keep%maxdepth),cnode(0:keep%maxdepth), & + d_copy(1:2*keep%maxfrontb),stat=st) + if (st /= 0) go to 495 + + nroot = size(keep%roots) +! initialise posdiag + posdiag = keep%posfac + locint = keep%posint + + kpiv = 0 + do ir = 1, nroot + root = keep%roots(ir) + node = root + depth = 1 + count(depth) = 0 ! no. of visited children +! Visit each node in depth-first search order + do while(depth.gt.0) + cnode(depth) = node +! Visit children + nchild = size(keep%tree(node)%child) + if (count(depth) < nchild) then + count(depth) = count(depth) + 1 + if (keep%tree(node)%child(count(depth)) > keep%nelt) then +! The next child of node is not a leaf node so descend to it + node = keep%tree(node)%child(count(depth)) + depth = depth + 1 + count(depth) = 0 + cycle + end if + end if + +! Perform work at node. + call alter_indef(node,kpiv) + if (info%flag < 0) exit +! If we have reached the root, we are done + if (node == root) exit + +! Go to parent + depth = depth - 1 + pnode = cnode(depth) + node = pnode + + end do ! tree + if (info%flag < 0) go to 496 + end do ! roots + go to 500 + +495 info%flag = -1 + info%stat = st + call MA77_print_iflag(keep,nout,info%flag,st=info%stat) + go to 500 + +496 call MA77_print_iflag(keep,nout,info%flag,ios=info%iostat) + +! Deallocate arrays we have done with. +500 deallocate (count,stat=st) + deallocate (cnode,stat=st) + deallocate (d_copy,stat=st) + + contains + +!******************************* + subroutine alter_indef(node,kpiv) + + integer(short), intent (in) :: node + integer(short), intent (inout) :: kpiv ! pivot count. + +! Possible error returns: +! -5 Error from of01 (error in Fortran inquire) +! -6 Error from of01 (error in Fortran read) +! -7 Error from of01 (error in Fortran open) + +! Immediate return for leaf node. + if (node <= keep%nelt) return + +! The number of eliminations actually performed at node is +! held in the main integer lists + nfront = keep%size_ind(node) + loc = locint + nfront +! Increment locint so that it points to start of integer data for next node + locint = loc + 1 + if (keep%index(1) >= 0) then + call of01_read(keep%index(1),loc,1,itemp,flag,keep%idata,lp=-1) + if (flag < 0) go to 480 + nelim = itemp(1) + else +! File not in use. Integers are held in keep%imain + nelim = keep%imain(loc) + end if + if (nelim == 0) return + + j = 1 + jj = 1 + do i = 1,nelim + if (j > nelim) exit + kpiv = kpiv + 1 + two = .false. +! be careful! d(2,n) may not be defined + if (kpiv < n) then + if (d(2,kpiv) /= zero) two = .true. + end if + if (.not. two) then +! 1x1 pivot + d_copy(jj) = d(1,kpiv) + d_copy(jj+1) = zero + j = j + 1; jj = jj + 2 + else + d_copy(jj) = d(1,kpiv) + d_copy(jj+1) = d(2,kpiv) + d_copy(jj+2) = d(1,kpiv+1) + d_copy(jj+3) = zero + kpiv = kpiv + 1 + j = j + 2; jj = jj + 4 + end if + end do + + dreals = 2*nelim + if (keep%index(2) >= 0) then +! write required part of d + locw = posdiag + call of01_write(keep%index(2),locw,dreals,d_copy(1:dreals), & + flag,keep%rdata,lp=-1) + if (flag < 0) go to 485 + else +! data held in keep%rmain + keep%rmain(posdiag:posdiag+dreals-1) = d_copy(1:dreals) + end if + posdiag = posdiag + dreals + + if (info%flag >= 0) return + +480 info%iostat = keep%idata%iostat + info%stat = keep%idata%stat + info%flag = flag + if (flag == -17) info%flag = -16 + return + +485 info%iostat = keep%rdata%iostat + info%stat = keep%rdata%stat + info%flag = flag + if (flag == -17) info%flag = -16 + return + + end subroutine alter_indef + + end subroutine ma77_alter_double + +!************************************************* + + subroutine MA77_scale_double(scale,keep,control,info,anorm) + +! Scale matrix (equilibration). + +! For details of keep, control, info : see derived type description + type (MA77_keep), intent (inout) :: keep + type (MA77_control), intent (in) :: control + type (MA77_info), intent (inout) :: info + real(wp), intent(out),optional :: anorm ! on exit, holds infinity norm of A + + real (wp), intent(out) :: scale(:) ! on exit, scale(1:n) holds the +! scaling factors. + +! The following arrays are allocated by MA77_scale + integer(short), allocatable :: ijw(:) ! + real (wp), allocatable :: dew(:) ! + real (wp), allocatable :: wnorm(:) ! Work array (only if anorm present) + real (wp), allocatable :: fa(:) ! frontal matrix + real (wp), allocatable :: reals(:) ! used to hold a single col. +! of the frontal matrix. Also used for reading in +! a user-supplied element/row. + integer(short), allocatable :: count(:) ! used for depth +! first search of tree to keep track of level we are at + integer(short), allocatable :: cnode(:) ! used for depth +! first search of tree + integer(short), allocatable :: varlist(:) ! used for holding +! the variables at nodes in the tree. +! Allocated to be of length keep%maxlen. + integer(short), allocatable :: rlist(:) ! used for holding +! the row and column indices at nodes in the tree. +! They are allocated to be of length keep%maxlen. + integer(short), allocatable :: map(:) ! used to map between variables in +! a child and those in its parent. + integer(short), allocatable :: pos(:) ! Used for mapping into the front +! (only array of length n) +! Also used to hold column permutation in partial factorization + integer(long), allocatable :: ip(:) ! Used to hold +! positions of columns in the front. + + integer(short) :: cfront ! frontsize at node + integer(short) :: cnvar ! number of (uneliminated) variables at child node + integer(short) :: depth ! depth in tree + integer(short) :: flag + integer(short) :: ii ! temporary variable + integer(short) :: i ! temporary variable + integer(short) :: ic ! indicates which child of pnode node is + integer(long) :: ilong ! temporary variable + integer(short) :: ir ! temporary variable + integer(long) :: ipp ! points to start of a column + integer(long) :: ip1 ! points to position after delayed cols in frontal mx + integer(long) :: ipc ! points to position of start of frontal mx for cnode + integer(long) :: ipj2 ! temporary variable (used assemble) + integer(long) :: ipk ! temporary variable (used assemble) + integer(short) :: ivar ! a variable + integer(short) :: j1 ! temporary variable + integer(short) :: j2 ! temporary variable + integer(short) :: jc ! temporary variable + integer(short) :: jcnode ! jc-th child node + integer(short) :: jj ! temporary variable + integer(short) :: j ! temporary variable + integer(long) :: jlong ! temporary variable + integer(short) :: jvar ! a variable + integer(short) :: k ! temporary variable + integer(short) :: kk ! temporary variable + integer(long) :: klong ! temporary variable + integer(long) :: lfa ! size of array fa + integer(short) :: lreals ! length of array reals + integer(short) :: l ! temporary variable + integer(long) :: ln ! + integer(long) :: length ! length of list to be read + integer(long) :: loc ! location in real or integer superfile when reading + integer(long) :: locw ! location in real or integer superfile when writing + integer(short) :: lw + integer(short) :: maxlen ! set to keep%maxlen + integer(short) :: maxit ! number of iterations + integer(short) :: mvar ! copy of keep%mvar + integer(short) :: nchild ! number of children of root + integer(short) :: n ! set to keep%n + integer(short) :: niter ! iterations of equilibration algorithm + integer(short) :: nelim_jc + integer(short) :: ncand ! number of variables that are candidates +! for elimination at node + integer(short) :: nfront ! order of frontal matrix + integer(short) :: node ! node in tree + integer(short) :: non_leaf ! number of children of node that are not +! leaf nodes + integer(short) :: nout ! output unit for errors + integer(short) :: nroot ! number of roots (components) of the tree + integer(short) :: nvar ! no. variables associated with node during analyse + integer(long) :: nvar_long ! no. variables associated with node +! during analyse + integer(short) :: pnode ! parent node in tree + integer(short) :: root ! root node + integer(long) :: size_fa ! size of frontal array fa + integer(short) :: splitp ! split point at which space allocated for +! generated frontal matrix + integer(short) :: st ! stat parameter + integer(long) :: loc1 + integer(long) :: rtop ! points to the top of the main real stack + + real(wp) :: err + real(wp) :: thresh + + +! Possible error returns: +! -1 Allocation error +! -3 Error in sequence of calls +! -5 Error from of01 (error in Fortran inquire) +! -6 Error from of01 (error in Fortran read) +! -7 Error from of01 (error in Fortran open) +! -14 data for last element passed to MA77_input_reals was incomplete. +! -15 Error from of01 (error in Fortran write) +! -16 -17 Error from of01_read or of01_write (Fortran open failed +! for all path) +! -22 For one or more elements, MA77_input_vars was called but +! no corresponding call was made to MA77_input_reals. +! -30 front size is too large +! -39 size(scale) is too small + + +! write(*,*) 'entering MA77_scale with keep%status=', keep%status + + keep%name = 'MA77_scale' + +! Perform appropriate printing + if (control%print_level >= 1 .and. control%unit_diagnostics >= 0) then + write (control%unit_diagnostics,'(//a)') & + ' Entering MA77_scale' + write (control%unit_diagnostics, & + '(a,4(/a,i12),2(/a,i12),(/a,es12.4))') & + ' control parameters (control%) :', & + ' print_level Level of diagnostic printing = ', & + control%print_level, & + ' unit_diagnostics Unit for diagnostics = ', & + control%unit_diagnostics, & + ' unit_error Unit for errors = ', & + control%unit_error, & + ' unit_warning Unit for warnings = ', & + control%unit_warning, & + ' maxit Maximum number of iterations = ', & + control%maxit, & + ' infnorm Control for the scaling norm = ', & + control%infnorm, & + ' thresh Scaling stopping criteria = ', & + control%thresh + + end if + + nout = control%unit_error + if (control%print_level < 0) nout = -1 + + info%flag = 0 + +! Check status parameter + if (keep%status < 2) then + info%flag = -3 + call MA77_print_iflag(keep,nout,info%flag) + return + end if + + if (keep%n == 0) then + if (present(anorm)) anorm = zero + return + end if + +! check the last call to MA77_input_reals was complete. + if (keep%inelrs > 0) then +! data for last element/row not complete + info%flag = -14 + call MA77_print_iflag(keep,nout,info%flag) + return + end if + +! Deallocate arrays used by analyse but no longer needed. + deallocate (keep%clist,stat=st) + deallocate (keep%arow,stat=st) + deallocate (keep%aelt,stat=st) + deallocate (keep%iptr,stat=st) + + n = keep%n + + if (size(scale) < n) then + info%flag = -39 + call MA77_print_iflag(keep,nout,info%flag) + return + end if + + maxit = control%maxit + if (maxit < 1) maxit = 1 + thresh = control%thresh + +! Allocate arrays needed by scale + mvar = keep%mvar + maxlen = keep%maxlen + + deallocate (fa,stat=st) + lfa = keep%maxfront + lfa = (lfa*(lfa+1_long))/2 + if (lfa > keep%lup) then + info%flag = -30 + call MA77_print_iflag(keep,nout,info%flag) + go to 25 + end if + + allocate (fa(lfa),stat=st) + if (st /= 0) then +! if arrays are being used, we try and switch to using files + if (all(keep%index(1:4) > 0)) then +! files are being used so we have failed + go to 20 + else +! at least one array is being used. +! Try and write the integers to file. Have to do this in a loop +! since the amount of data to write is a long integer but each call +! to of01_write allows only short integer write. + if (keep%index(1) < 0) then + keep%index(1) = -keep%index(1) + loc1 = 1 + do jlong = 1,keep%ifree-1,huge(lw) + lw = int( min(int(huge(lw),long),keep%ifree-1-jlong)) + call of01_write(keep%index(1),loc1,lw,keep%imain, & + flag,keep%idata,lp=-1) + if (flag < 0) then + info%iostat = keep%idata%iostat + info%stat = keep%idata%stat + info%flag = flag + if (flag == -17) info%flag = -16 + go to 25 + end if + loc1 = loc1 + lw + end do + keep%used = keep%used - size(keep%imain) + deallocate (keep%imain,stat=st) + allocate (fa(lfa),stat=st) + if (st == 0) go to 10 + end if +! Try switching reals to a file + if (keep%index(2) < 0) then + keep%index(2) = -keep%index(2) + loc1 = 1 + do jlong = 1,keep%posfac-1,huge(lw) + lw = int( min(int(huge(lw),long),keep%posfac-1-jlong) ) + call of01_write(keep%index(2),loc1,lw,keep%rmain, & + flag,keep%rdata,lp=-1) + if (flag < 0) then + info%iostat = keep%rdata%iostat + info%stat = keep%rdata%stat + info%flag = flag + if (flag == -17) info%flag = -16 + go to 25 + end if + loc1 = loc1 + lw + end do + keep%used = keep%used - size(keep%rmain)*2 + deallocate (keep%rmain,stat=st) + allocate (fa(lfa),stat=st) + if (st == 0) go to 10 + end if +! Nothing yet written to the in-core arrays index(4) so switch to files + if (keep%index(4) < 0) then + deallocate(keep%rwdelay,stat=st) + keep%index(4) = -keep%index(4) + keep%used = keep%used - 2*control%storage_indef + allocate (fa(lfa),stat=st) + if (st == 0) go to 10 + end if +! Now try to write stack to file (at moment, nothing in the stack) + if (keep%index(3) < 0) then + keep%index(3) = -keep%index(3) + keep%used = keep%used - size(keep%rwork)*2 + deallocate (keep%rwork,stat=st) + allocate (fa(lfa),stat=st) + if (st == 0) go to 10 + end if +! Have not been able to allocate front + info%flag = -30; info%stat = st + call MA77_print_iflag(keep,nout,info%flag) + go to 25 + end if + end if +! frontal matrix has been allocated + 10 continue + size_fa = lfa + + deallocate (ip,stat=st) + allocate (ip(maxlen),stat=st) + if (st /= 0) go to 20 + + lreals = max(mvar,maxlen) + + deallocate (rlist,stat=st) + deallocate (varlist,stat=st) + deallocate (reals,stat=st) + deallocate (pos,stat=st) + deallocate (map,stat=st) + deallocate (count,stat=st) + deallocate (cnode,stat=st) + + allocate (count(0:keep%maxdepth),cnode(0:keep%maxdepth),stat=st) + if (st /= 0) goto 20 + + allocate (reals(lreals),rlist(maxlen+1),varlist(maxlen), & + map(maxlen),pos(1:n),stat=st) + if (st /= 0) go to 20 +! Initialise the array pos to zero + pos = 0 + +! reset keep%rfree and keep%ifree + keep%rfree = keep%posfac + keep%ifree = keep%posint + + keep%rtopmx = 1_long + +! Perform scaling. + + deallocate (ijw,stat=st) + deallocate (dew,stat=st) + allocate (ijw(n),dew(n),stat=st) + if (st /= 0) go to 20 + + niter = 0 + ijw(1:n) = 0 + scale(1:n) = one + info%niter = niter + + if (present(anorm)) then + deallocate (wnorm,stat=st) + allocate (wnorm(n),stat=st) + if (st /= 0) go to 20 + wnorm(1:n) = zero + end if + +iter: do + + niter = niter + 1 + + dew(1:n) = zero + + nroot = size(keep%roots) + do ir = 1, nroot + root = keep%roots(ir) +! Initialise the top of the real stack + rtop = 1 +! Visit each node in depth-first search order + node = root + depth = 1 + count(depth) = 0 ! no. of visited children + do while(depth.gt.0) + cnode(depth) = node +! Visit children + nchild = size(keep%tree(node)%child) + if (count(depth) < nchild) then + count(depth) = count(depth) + 1 + if (keep%tree(node)%child(count(depth)) > keep%nelt) then +! The next child of node is not a leaf node so descend to it + node = keep%tree(node)%child(count(depth)) + depth = depth + 1 + count(depth) = 0 + cycle + end if + end if + +! Perform work at node. Assemble contributions +! from children of node that are leaf nodes +! and then perform the work at node. +! Then either stack the contribution from node or +! assemble it into its parent (node is the ic-th child of its parent) + if (niter == 1 .and. present(anorm)) then + call scale77(node,n,cfront,scale,dew,ijw,wnorm) + else + call scale77(node,n,cfront,scale,dew,ijw) + end if + if (info%flag < 0 .or. depth <= 1) exit + depth = depth - 1 + pnode = cnode(depth) + ic = count(depth) + call assemble(pnode,node,ic,rtop) + if (info%flag < 0) exit +! If we have reached the root, we are done + if (node == root) exit + +! Go to parent + node = pnode + + end do ! tree + + if (info%flag < 0) then + keep%status = -1 + call MA77_print_iflag(keep,nout,info%flag,st=info%stat, & + ios=info%iostat) + go to 25 + end if + end do + + if (niter == 1 .and. present(anorm)) then + anorm = wnorm(1) + do i = 2,n + anorm = max(anorm,wnorm(i)) + end do + end if + +! Accumulate scaling factors + if (control%infnorm == 0) then +! infinity norm + do i = 1,n + if (ijw(i) > 0) scale(i) = scale(i)*sqrt(dew(i)) + end do + + k = 0 +! Loop over columns, checking to see if maximum in column j +! and row j is on the diagonal + do j = 1,n +! ijw(j) holds row index of largest entry in col. j + i = ijw(j) + if (i > 0) then +! ijw(i) holds column index of largest entry on row i + if (ijw(i) == j) then + ijw(i) = -ijw(i) + k = k + 1 + if (i /= j) then + ijw(j) = -ijw(j) + k = k + 1 + end if + end if + else + k = k + 1 + end if + end do + if (k == n) exit + else +! 1- norm + do i = 1,n + if (ijw(i) == 0) cycle + scale(i) = scale(i)*sqrt(dew(i)) + end do + + end if + + err = zero + do i = 1,n + if (ijw(i) > 0) err = max( err, abs(one-dew(i)) ) + end do + + if ( err <= thresh ) exit + if (niter == maxit) exit + + end do iter + info%niter = niter + +! Store the inverse scaling factor + do i = 1,n + if (ijw(i) == 0) cycle + scale(i) = one/scale(i) + end do + +20 if (st /= 0) then + info%flag = -1; keep%status = -1 + info%stat = st + call MA77_print_iflag(keep,nout,info%flag,st=info%stat) + end if + + 25 deallocate (reals,stat=st) + deallocate (map,stat=st) + deallocate (pos,stat=st) + deallocate (rlist,stat=st) + deallocate (varlist,stat=st) + deallocate (fa,stat=st) + deallocate (count,stat=st) + deallocate (cnode,stat=st) + deallocate (ijw,stat=st) + deallocate (dew,stat=st) + deallocate (wnorm,stat=st) + deallocate (ip,stat=st) + + info%index(1:4) = keep%index(1:4) + + keep%flag = info%flag + if (info%flag < 0) return + + if (control%print_level >= 1 .and. control%unit_diagnostics >= 0) then + write (control%unit_diagnostics,'(/a)') & + ' Completed scaling' + end if + if (present(anorm)) then + if (control%print_level >= 1 .and. control%unit_diagnostics >= 0) & + write (control%unit_diagnostics,'(/a,es12.4)') & + ' Leaving MA77_scale with anorm = ', anorm + end if + +contains + +!******************************* + + subroutine scale77(node,n,cfront,de,dew,ijw,wnorm) + +! This subroutine assembles contributions from any children of node +! that are leaf nodes, and then finds largest entries in fully summed +! part, and optionally computes row sums for fully summed rows. + + integer(short), intent(in) :: node ! node in tree + integer(short), intent(in) :: n + integer(short), intent(out) :: cfront ! frontsize at node + integer(short), intent(inout) :: ijw(n) + real(wp), intent(in) :: de(n) ! accumulated scaling factors + real(wp), intent(inout) :: dew(n) ! scaling factors on current iteration + real(wp), optional, intent(inout) :: wnorm(n) ! work array for +! computing matrix norm + +! Possible error returns: +! -5 Error from of01 (error in Fortran inquire) +! -6 Error from of01 (error in Fortran read) +! -7 Error from of01 (error in Fortran open) +! -15 Error from of01 (error in Fortran write) +! -22 For one or more elements/rows, MA77_input_vars was called but +! no corresponding call was made to MA77_input_reals. + + nvar = abs(keep%size(node)) + if (nvar == 0) return +! If node is a leaf, immediate return. + if (node <= keep%nelt) return + + nvar_long = nvar + nfront = nvar + ln = (nvar_long*(nvar_long+1))/2 + ip1 = 1 + size_fa - ln + lfa = ln + + nchild = size(keep%tree(node)%child) + non_leaf = nchild +! In element case, add up the number of children of node that are leaf nodes +! .... they are the last children (in row case, leaf nodes are original +! rows and they are not part of the tree) + if (keep%element_input) then + if (nchild == 0) return + do i = nchild,1,-1 + jcnode = keep%tree(node)%child(i) + if (jcnode > keep%nelt) exit + end do + non_leaf = i + end if +! If all the children of node are leaf children, initialize front + if (non_leaf == 0) fa(ip1:ip1+lfa-1) = zero + +! Read the variables for node from the main integer superfile into +! rlist and set mapping into front + loc = keep%ifile(node) + call MA77_read_integer(keep%index(1),keep%imain,loc,nvar,& + rlist(1:nvar),flag,keep%idata,-1) + if (flag < 0) go to 480 + do i = 1,nvar + rlist(i) = abs(rlist(i)) + ivar = rlist(i) + pos(ivar) = i + end do + +! In element case, must now deal with children that are leaf nodes +! and in row case, deal with original rows + +! Set ip(j) to point to start of jth col. + ip(1) = ip1 + do j = 2,nvar + ip(j) = ip(j-1) + nvar - j + 2 + end do + + if (keep%element_input) then + do ic = non_leaf+1,nchild + jcnode = keep%tree(node)%child(ic) +! Check reals were entered. + if (keep%rfile(jcnode) == -1 .and. keep%size(jcnode) /= 0) then +! User has not entered required reals + info%flag = -22; return + end if + loc = keep%ifile(jcnode) + cnvar = abs(keep%size(jcnode)) + call MA77_read_integer(keep%index(1),keep%imain,loc,cnvar, & + varlist,flag,keep%idata,-1) + if (flag < 0) go to 480 +! Set mapping from jcnode into the front using array pos. + do j = 1,cnvar + k = varlist(j) + map(j) = pos(k) + end do + +! Read reals from main file one column at a time + loc = cnvar + loc = keep%rfile(jcnode) - (loc*loc+loc)/2 + do j = 1,cnvar + lreals = cnvar - j + 1 + call MA77_read_real(keep%index(2),keep%rmain,loc,lreals, & + reals,flag,keep%rdata,-1) + if (flag < 0) go to 480 + +! Add the reals from the original element into the front + k = 1 + jj = map(j) + do i = j, cnvar + ii = map(i) + if (ii >= jj) then + klong = ip(jj) + ii - jj + else + klong = ip(ii) + jj - ii + end if + fa(klong) = fa(klong) + reals(k) + k = k + 1 + end do + loc = loc + lreals + end do + end do + + else +! For row entry, add into the front the original rows corresponding +! to the eliminated variables. + do j = 1, keep%tree(node)%nelim + jcnode = rlist(j) + cnvar = abs(keep%size(jcnode)) + if (cnvar == 0) cycle + if (keep%rfile(jcnode) == -1) then +! User has not entered required reals + info%flag = -22; return + end if + loc = keep%ifile(jcnode) +! Read in the variable list for row jcnode and its reals + call MA77_read_integer(keep%index(1),keep%imain,loc,cnvar,varlist,& + flag,keep%idata,-1) + if (flag < 0) go to 480 +! Recall that keep%rfile(jcnode) points to position in the main reals +! file after the last entry in the list of reals for jcnode + loc = keep%rfile(jcnode) - cnvar + call MA77_read_real(keep%index(2),keep%rmain,loc,cnvar,reals,flag,& + keep%rdata,-1) + if (flag < 0) go to 480 + +! Loop over entries in the row jcnode, putting +! them into row/col j of the frontal matrix (lower triangular part). +! ipp points to start of col. j + jlong = j + ipp = ip1 + (nvar_long+1)*(jlong-1) - (jlong*(jlong-1))/2 + do jj = 1, cnvar + jvar = varlist(jj) + i = pos(jvar) + if (i < j) cycle +! Put entry into col j, row i. + fa(ipp+i-j) = fa(ipp+i-j) + reals(jj) + end do + end do + end if + +! Restore pos to zero + do i = 1,nvar + ivar = rlist(i) + pos(ivar) = 0 + end do + +! Have now assembled the frontal matrix and are ready to find +! largest entries in fully summed rows/cols. It is of order nfront +! but we hold only the lower triangular part. +! ncand is no. of fully summed rows/cols + + ncand = keep%tree(node)%nelim + + if (control%infnorm == 0) then +! infinity norm + call getmx(nfront,ncand,fa(ip1),rlist,n,de,dew,ijw) + else + call get_norm1(nfront,ncand,fa(ip1:ip1),rlist,n,de,dew,ijw) + end if + if (present(wnorm)) & + call get_anorm(nfront,ncand,fa(ip1),rlist,n,wnorm) + + cfront = nfront + + if (info%flag >= 0) return + +480 info%iostat = keep%rdata%iostat + info%stat = keep%rdata%stat + info%flag = flag + + return + + end subroutine scale77 + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + subroutine assemble(node,cnode,ic,rtop) + +! This subroutine either stacks the contribution from cnode +! or assembles it into its parent node. cnode is the ic-th child of node. +! (it is same as assemble54) + + integer(short), intent(in) :: node ! node in tree + integer(short), intent(in) :: cnode ! child of node + integer(short), intent(in) :: ic ! position of ic in sibling list + integer(long), intent(inout) :: rtop ! points to top of main real stack + +! Possible error returns: +! -1 Allocation error +! -5 Error from of01 (error in Fortran inquire) +! -6 Error from of01 (error in Fortran read) +! -7 Error from of01 (error in Fortran open) +! -15 Error from of01 (error in Fortran write) +! -16 -17 Error from of01_read or of01_write (Fortran open +! failed for all path) + + nchild = size(keep%tree(node)%child) + non_leaf = nchild +! In element case, add up the number of children of node that are leaf nodes + if (keep%element_input) then + if (nchild == 0) return + do i = nchild,1,-1 + jcnode = keep%tree(node)%child(i) + if (jcnode > keep%nelt) exit + end do + non_leaf = i + end if + +! set ipc to point to first location in fa that was used for cnode + cnvar = keep%size(cnode) - keep%tree(cnode)%nelim + length = cnvar + length = (length*length + length)/2 + ipc = 1 + size_fa - length + + nvar = abs(keep%size(node)) + nfront = nvar + nvar_long = nvar + ln = (nvar_long*nvar_long + nvar_long)/2 +! set ip1 to point to first location in fa that will be used for front at node + ip1 = 1 + size_fa - ln + lfa = ln + splitp = keep%splitp(node) +! If we are not yet at the split point, write generated element for cnode onto +! top of the real stack and return + if (ic < splitp) then + locw = rtop + lreals = cnvar + ipp = ipc + do j = 1,cnvar + call MA77_write_real(keep%index(3),keep%size_rwork,keep%rwork, & + locw,lreals,fa(ipp:ipp+lreals-1),flag,keep%rdata,-1, & + keep%maxstore,keep%used) + if (flag < 0) go to 480 + ipp = ipp + lreals + locw = locw + lreals + lreals = lreals - 1 + end do +! Adjust top of stack + rtop = rtop + length + keep%rtopmx = max(keep%rtopmx,rtop) + return + end if + +! Read the variables for node from the main integer superfile. + loc = keep%ifile(node) + call MA77_read_integer(keep%index(1),keep%imain,loc,nvar,& + rlist,flag,keep%idata,-1) + if (flag < 0) go to 480 + do i = 1,nvar + ivar = abs(rlist(i)) + pos(ivar) = i + end do + +! Set ip(j) to point to start of col j in array fa. + ip(1) = ip1 + do j = 2,nvar + ip(j) = ip(j-1) + nvar - j + 2 + end do + +! read integer list for cnode from main integer file + loc = keep%ifile(cnode) + keep%tree(cnode)%nelim + call MA77_read_integer(keep%index(1),keep%imain,loc,cnvar, & + varlist,flag,keep%idata,-1) + if (flag < 0) go to 480 +! Set mapping from cnode into the front + do j = 1,cnvar + k = abs(varlist(j)) + map(j) = pos(k) + end do + + if (ic == splitp .or. ic == non_leaf) then + if (cnvar /= nvar) then +! Expand cnode into the front + j1 = 1 + do j = 1,cnvar + j2 = map(j) +! col. j of cnode maps to col. j2 of front +! set cols j1:j2-1 of front to zero + fa(ip(j1):ip(j2)-1) = zero +! Expand col. j of cnode into col. j2 of front. +! col j of cnode is currently at col k=j+nvar-cnvar of front + k = j + nvar - cnvar + if (j2 /= k) then + ipj2 = ip(j2) + ipk = ip(k) + fa(ipj2:ip(j2+1)-1) = zero + do l = j,cnvar + i = map(l) + fa(ipj2+i-j2) = fa(ipk+l-j) + end do + else +! j2 = k, so all columns are now in place + j1 = nvar + 1 + exit + end if + j1 = j2 + 1 + end do +! Check final cols are set to 0. + klong = size_fa + if (j1 <= nvar) fa(ip(j1):klong) = zero + end if + end if + + if (ic == splitp) then +! At split point. +! Merge children 1:splitp-1 into rows/columns 1:nfront of frontal matrix + do 160 jc = splitp-1, 1, -1 + jcnode = keep%tree(node)%child(jc) + nelim_jc = keep%tree(jcnode)%nelim + loc = keep%ifile(jcnode) + nelim_jc + cnvar = keep%size(jcnode) - nelim_jc + call MA77_read_integer(keep%index(1),keep%imain,loc,cnvar, & + varlist,flag,keep%idata,-1) + if (flag < 0) go to 480 +! Set mapping from jcnode into the front using array pos (length n) + do j = 1,cnvar + k = abs(varlist(j)) + map(j) = pos(k) + end do +! Read in reals for child from the top of stack, one col. at a time, +! using map to read directly into the front. + length = cnvar + length = (length*length + length)/2 + loc = rtop - length + lreals = cnvar +! move pointer to top of stack + rtop = loc + do j = 1, cnvar + ilong = map(j) + ipp = ip1 + nvar_long*(ilong-1) - (ilong*(ilong-1))/2 + call MA77_read_discard_real(keep%index(3),keep%rwork,loc,lreals,& + fa(ipp:ipp+nvar-1),flag,keep%rdata,-1,map=map(j:cnvar)) + if (flag < 0) go to 480 + loc = loc + lreals + lreals = lreals - 1 + end do +! End of loop over children +160 continue + +! At this point fa holds the reals in the frontal matrix in packed form. +! If split point is not also last non-leaf child, write fa onto the stack + if (ic /= non_leaf) then + lreals = nvar + loc = rtop + ipp = ip1 + do j = 1,nvar + call MA77_write_real(keep%index(3),keep%size_rmain,keep%rwork, & + loc,lreals,fa(ipp:ipp+lreals-1),flag,keep%rdata,-1, & + keep%maxstore,keep%used) + if (flag < 0) go to 480 + ipp = ipp + lreals + loc = loc + lreals + lreals = lreals - 1 + end do + rtop = rtop + (nvar_long*nvar_long+nvar_long)/2 + keep%rtopmx = max(keep%rtopmx,rtop) + end if + + else if (ic < non_leaf) then +! We have passed split point and not yet reached last non-leaf child. +! The reals for jcnode are still in fa. +! Loop over the cols of cnode, merging the child into its parent. + do j = 1,cnvar + i = map(j) +! Read column i of the frontal matrix from the stack. Find its position. + loc = rtop - (nvar*nvar+nvar)/2 +! loc now points to the first entry in the front on the stack. +! Set loc to point to first entry in col. i and +! lreals to number of entries in col. i. + loc = loc + nvar*(i-1) - ((i-2)*(i-1))/2 + lreals = nvar - i + 1 + call MA77_read_real(keep%index(3),keep%rwork,loc,lreals,reals,& + flag,keep%rdata,-1) + if (flag < 0) go to 480 +! ipp points to start of col. j of jcnode, which is held in fa + jlong = j + ipp = ipc + cnvar*(jlong-1) - ((jlong-2)*(jlong-1))/2 + do k = j,cnvar + kk = map(k) + reals(1+kk-i) = reals(1+kk-i) + fa(ipp+k-j) + end do +! Write the updated reals back onto the stack + call MA77_write_real(keep%index(3),keep%size_rmain,keep%rwork, & + loc,lreals,reals,flag,keep%rdata,-1,keep%maxstore,keep%used) + if (flag < 0) go to 480 + end do + + else if (ic == non_leaf) then +! Dealing with last non-leaf child (and it is not split point) +! Read frontal matrix from top of stack, one column at a time and add +! in with last non-leaf child (which we have already expanded in fa). + loc = rtop - (nvar_long*nvar_long+nvar_long)/2 + rtop = loc + ipp = ip1 + lreals = nvar + do j = 1,nvar + call MA77_read_discard_real(keep%index(3),keep%rwork,loc,& + lreals,reals,flag,keep%rdata,-1) + if (flag < 0) go to 480 + fa(ipp:ipp+lreals-1) = fa(ipp:ipp+lreals-1) + reals(1:lreals) + ipp = ipp + lreals + loc = loc + lreals + lreals = lreals - 1 + end do + + end if + +! reset pos + do i = 1,nvar + ivar = abs(rlist(i)) + pos(ivar) = 0 + end do + + if (info%flag >= 0) return + +480 info%iostat = keep%rdata%iostat + info%stat = keep%rdata%stat + info%flag = flag + if (flag == -17) info%flag = -16 + + end subroutine assemble +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + subroutine getmx(m,p,a,rlist,n,de,dew,ijw) + +! Accumulate the maximum entry in each row and column. +! Entries in a are unscaled +! de holds accumulated scaling factors (initialised to 1 before first call) + + integer(short), intent(in) :: m ! order frontal matrix + integer(short), intent(in) :: n ! global order + integer(short), intent(in) :: p ! number fully summed rows/cols + integer(short), intent(in) :: rlist(m) ! global indices + integer(short), intent(inout) :: ijw(n) + real(wp), intent(in) :: a(*) + real(wp), intent(in) :: de(n) ! accumulated scaling factors + real(wp), intent(inout) :: dew(n) ! scaling factors on current iteration + + integer :: i,j,k + integer :: ivar,jvar + real(wp) :: dtemp,s + +! Loop over first p columns + k = 1 + do j = 1,p + jvar = rlist(j) + dtemp = de(jvar) + if (ijw(jvar) >= 0) then +! Find maximum entry in the column on or below diag. + do i = j,m + ivar = rlist(i) + s = abs(a(k)) / (de(ivar)*dtemp) + if (dew(jvar) < s) then + dew(jvar) = s + ijw(jvar) = ivar + end if + if (ijw(ivar) >= 0) then + if (dew(ivar) < s) then + dew(ivar) = s + ijw(ivar) = jvar + end if + end if + k = k + 1 + end do + else + do i = j,m + ivar = rlist(i) + if (ijw(ivar) >= 0) then + s = abs(a(k)) / (de(ivar)*dtemp) + if (dew(ivar) < s) then + dew(ivar) = s + ijw(ivar) = jvar + end if + end if + k = k + 1 + end do + end if + end do + + end subroutine getmx +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + subroutine get_norm1(m,p,a,rlist,n,de,dew,ijw) + +! Accummulate 1-norm for the first p rows/columns + +! Entries in a are unscaled +! de holds accumulated scaling factors (initialised to 1 before first call) + + integer(short), intent(in) :: m ! order frontal matrix + integer(short), intent(in) :: n ! global order + integer(short), intent(in) :: p ! number fully summed rows/cols + integer(short), intent(in) :: rlist(m) ! global indices + integer(short), intent(inout) :: ijw(n) + real(wp), intent(in) :: a(*) + real(wp), intent(in) :: de(n) ! accumulated scaling factors + real(wp), intent(inout) :: dew(n) ! scaling factors on current iteration + + integer :: i,j,k + integer :: ivar,jvar + real(wp) :: s + + do i = 1,m + ivar = rlist(i) +! flag ivar as having been used + ijw(ivar) = 1 + end do + + k = 1 + do j = 1,p + jvar = rlist(j) +! deal with diagonal entry + s = abs(a(k)) / (de(jvar)*de(jvar)) + dew(jvar) = dew(jvar) + s + k = k + 1 +! deal with entries below diagonal + do i = j+1,m + ivar = rlist(i) + s = abs(a(k)) / (de(ivar)*de(jvar)) + dew(jvar) = dew(jvar) + s + dew(ivar) = dew(ivar) + s + k = k + 1 + end do + end do + + end subroutine get_norm1 + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + subroutine get_anorm(m,p,a,rlist,n,wnorm) + +! Accumulate row sums + + integer(short), intent(in) :: m ! order frontal matrix + integer(short), intent(in) :: n ! global order + integer(short), intent(in) :: p ! number fully summed rows/cols + integer(short), intent(in) :: rlist(m) ! global indices + real(wp), intent(in) :: a(*) + real(wp), intent(inout) :: wnorm(n) + + integer :: i,j,k + integer :: ivar,jvar + +! Loop over first p cols + k = 1 + do j = 1,p + jvar = rlist(j) + wnorm(jvar) = wnorm(jvar) + abs(a(k)) + k = k + 1 + do i = j+1,m + wnorm(jvar) = wnorm(jvar) + abs(a(k)) + ivar = rlist(i) + wnorm(ivar) = wnorm(ivar) + abs(a(k)) + k = k + 1 + end do + end do + + end subroutine get_anorm + +! End scale + + end subroutine MA77_scale_double + +!************************************************* + + subroutine MA77_print_iflag(keep,nout,iflag,ie,st,ios) + integer(short), intent (in) :: iflag, nout + integer(short), intent (in), optional :: ie, st, ios + + type (MA77_keep), intent (in) :: keep + + if (nout < 0) return + if (iflag < 0) then + write (nout,'(/3a,i3)') ' Error return from ',trim(keep%name),& + '. Error flag = ', iflag + if (present(ie)) write (nout,'(a,i8)') & + ' Error on input of element/row = ', ie + else + write (nout,'(/3a,i3)') ' Warning from ',trim(keep%name),& + '. Warning flag = ', iflag + if (present(ie)) write (nout,'(a,i8)') & + ' Warning on input of element/row = ', ie + end if + +! Errors + if (iflag == -1) then + if (present(st)) write (nout,'(a,i3)') & + ' Allocation error. stat parameter = ', st + else if (iflag == -3) then + write (nout,'(a)') ' Error in sequence of calls.' + else if (iflag == -4) then + write (nout,'(a,i10)') ' n = ', keep%n + else if (iflag == -5) then + write (nout,'(a)') ' Error in Fortran inquire' + if (present(st)) write (nout,'(a,i3)') & + ' iostat parameter = ', ios + else if (iflag == -6) then + write (nout,'(a)') ' Error in Fortran read' + if (present(st)) write (nout,'(a,i3)') & + ' iostat parameter = ', ios + else if (iflag == -7) then + write (nout,'(a)') ' Error in Fortran open' + if (present(st)) write (nout,'(a,i3)') & + ' iostat parameter = ', ios + else if (iflag == -9) then + write (nout,'(a,i10)') & + ' MA77_input_reals has already been called for element/row = ', ie + else if (iflag == -11) then + write (nout,'(a)') ' Either pos-def = .true. but matrix not positive or' + write (nout,'(a)') ' pos-def = .false. and matrix found to be singular' + else if (iflag == -12) then +! write (nout,'(a)') ' A file with a name supplied by user already exists' + else if (iflag == -13) then + write (nout,'(a)') ' len(filename) (or len(restart_file)) is too large' + else if (iflag == -14) then + write (nout,'(a)') & + ' Data for last element/row input to MA77_input_reals was incomplete' + else if (iflag == -15) then + write (nout,'(a)') ' Error in Fortran write' + if (present(st)) write (nout,'(a,i3)') & + ' iostat parameter = ', ios + else if (iflag == -16) then + write (nout,'(a)') & + ' len(path) too large or Fortran open unsuccessful for all elements of path' + else if (iflag == -17) then + write (nout,'(a)') & + ' Duplicates and/or out-of-range entries were detected by MA77_input_vars.' + write (nout,'(a)') & + ' Thus all reals for each element/row must be entered in a single call.' + else if (iflag == -18) then + write (nout,'(a,i10)') ' nelt = ', keep%nelt + else if (iflag == -19) then + write (nout,'(a)') ' length < 0' + else if (iflag == -20) then + write (nout,'(a,i10)') ' job out of range.' + else if (iflag == -21) then + write (nout,'(a)') ' Error in user-supplied elimination order' + else if (iflag == -22) then + write (nout,'(a)') & + ' MA77_input_reals was not called for one or more element/row' + else if (iflag == -23) then + write (nout,'(a)') ' control%buffer_lpage(1:2) out of range' + else if (iflag == -24) then + write (nout,'(a)') ' Error in size of x' + else if (iflag == -25) then + write (nout,'(a)') ' Error in size of resid' + else if (iflag == -26) then + write (nout,'(a)') ' control%buffer_npage(1:2) < 1' + else if (iflag == -27) then + write (nout,'(a)') ' control%maxstore out of range' + else if (iflag == -28) then + write (nout,'(a)') ' A file that is required does not exist' + else if (iflag == -29) then + write (nout,'(a)') & + ' pos_def = .true. but 2x2 pivots were supplied on the call to MA77_analyse' + else if (iflag == -30) then + write (nout,'(a)') ' The front size is too large for allocation' + else if (iflag == -31) then + write (nout,'(a)') ' All entries in element/row out-of-range' + else if (iflag == -32) then + write (nout,'(a)') ' Too many reals input for this element/row' + else if (iflag == -33) then + write (nout,'(a)') ' Number of entries in variable list is < 0' + else if (iflag == -34) then + write (nout,'(a)') ' On call to MA77_factor, pos_def = .true.' + else if (iflag == -35) then + write (nout,'(a)') ' On call to MA77_factor, pos_def = .false.' + else if (iflag == -36) then + write (nout,'(a)') ' Error in size of piv_order' + else if (iflag == -37) then + write (nout,'(a)') ' Error in size of d' + else if (iflag == -38) then + write (nout,'(a)') & + ' control%static < control%small and control%static /= 0.0' + else if (iflag == -39) then + write (nout,'(a)') ' Error involving scale' + else if (iflag == -40) then + write (nout,'(a)') ' IEEE infinities detected. Factorization terminated.' + else if (iflag == -41) then + write (nout,'(a)') ' Error in Fortran CLOSE statement.' + + +! Warnings + else if (iflag == 4) then + write (nout,'(a)') ' Matrix found to be singular' + end if + + end subroutine MA77_print_iflag + +!************************************************************************ + subroutine MA77_read_integer(ifile,keep_array,loc,length,read_array, & + flag,data,lp) + +! If files are in use (ifile >= 0), call of01_read to read into read_array. +! otherwise, copy from keep_array into read_array. + + integer(short), intent(in) :: ifile ! unit for reading from + integer(short), allocatable :: keep_array(:) ! if files not in use, +! we copy from this array into read_array + integer(long), intent(in) :: loc ! position in keep_array to read from + integer(short), intent(in) :: length ! number of reals to be read + integer(short), dimension(:), intent(out) :: read_array +! read into this array + integer(short), intent(out) :: flag ! error flag + type (of01_idata), intent(inout) :: data + integer(short), intent(in) :: lp ! unit for of01 error messages + + integer(short) :: i,k + + flag = 0 + if (length == 0) return + + if (ifile >= 0) then +! read using of01 + call of01_read(ifile,loc,length,read_array,flag,data,lp=lp) + else +! Copy from keep_array into read_array +! use loop unrolling to speed up the copying + k = mod(length,7) + read_array(1:k) = keep_array(loc:loc+k-1) + do i = k+1,length, 7 + read_array(i) = keep_array(loc-1+i) + read_array(i+1) = keep_array(loc+i) + read_array(i+2) = keep_array(loc+i+1) + read_array(i+3) = keep_array(loc+i+2) + read_array(i+4) = keep_array(loc+i+3) + read_array(i+5) = keep_array(loc+i+4) + read_array(i+6) = keep_array(loc+i+5) + end do +! read_array(1:length) = keep_array(loc:loc+length-1) + end if + + end subroutine MA77_read_integer + +!************************************************************************ + + subroutine MA77_read_real(rfile,keep_array,loc,length,read_array, & + flag,data,lp,map) + +! If files are in use (rfile >= 0), call of01_read to read into read_array. +! otherwise, copy from keep_array into read_array. + + integer(short), intent(in) :: rfile ! unit for reading from + real(wp), allocatable :: keep_array(:) ! if files not in use, +! we copy from this array into read_array + integer(long), intent(in) :: loc ! position in keep_array to read from + integer(short), intent(in) :: length ! number of reals to be read + real(wp), dimension(:), intent(inout) :: read_array ! read into this array + integer(short), intent(out) :: flag ! error flag + type (of01_rdata), intent(inout) :: data + integer(short), intent(in) :: lp ! unit for of01 error messages + integer(short), optional, intent (in) :: map(length) + +! Local scalars + integer(short) :: i,j,k + + flag = 0 + if (length == 0) return + + if (rfile >= 0) then +! read using of01 + if (present(map)) then + call of01_read(rfile,loc,length,read_array,flag,data,lp=lp,map=map) + else + call of01_read(rfile,loc,length,read_array,flag,data,lp=lp) + end if + else +! Copy from keep_array into read_array + if (present(map)) then +! use loop unrolling to speed up the copying + k = mod(length,7) + do j = 1,k + i = map(j) + read_array(i) = read_array(i) + keep_array(loc-1+j) + end do + do j = k+1,length, 7 + i = map(j) + read_array(i) = read_array(i) + keep_array(loc-1+j) + i = map(j+1) + read_array(i) = read_array(i) + keep_array(loc+j) + i = map(j+2) + read_array(i) = read_array(i) + keep_array(loc+j+1) + i = map(j+3) + read_array(i) = read_array(i) + keep_array(loc+j+2) + i = map(j+4) + read_array(i) = read_array(i) + keep_array(loc+j+3) + i = map(j+5) + read_array(i) = read_array(i) + keep_array(loc+j+4) + i = map(j+6) + read_array(i) = read_array(i) + keep_array(loc+j+5) + end do + +! else if (present(add)) then +! call daxpy(length,one,keep_array(loc),1,read_array,1) + else + call dcopy(length,keep_array(loc),1,read_array,1) + end if + end if + + end subroutine MA77_read_real +!************************************************************************ + + subroutine MA77_read_discard_real(rfile,keep_array,loc,length,read_array, & + flag,data,lp,map) + +! If files are in use (rfile >= 0), call of01_read to read into read_array +! with discard = .true. +! otherwise, copy from keep_array into read_array. + + integer(short), intent(in) :: rfile ! unit for reading from + real(wp), allocatable :: keep_array(:) ! if files not in use, +! we copy from this array into read_array + integer(long), intent(in) :: loc ! position in keep_array to read from + integer(short), intent(in) :: length ! number of reals to be read + real(wp), dimension(:), intent(inout) :: read_array ! read into this array + integer(short), intent(out) :: flag ! error flag + type (of01_rdata), intent(inout) :: data + integer(short), intent(in) :: lp ! unit for of01 error messages + integer(short), optional, intent (in) :: map(length) + +! Local scalars + integer(short) :: i,j,k + logical :: discard ! of01 discard parameter. Set to .true. + + flag = 0 + if (length == 0) return + + discard = .true. + + if (rfile >= 0) then +! read using of01 + if (present(map)) then + call of01_read(rfile,loc,length,read_array,flag,data, & + lp=lp,map=map,discard=discard) + else + call of01_read(rfile,loc,length,read_array,flag,data, & + lp=lp,discard=discard) + end if + + else +! Copy from keep_array into read_array + if (present(map)) then +! use loop unrolling to speed up the copying + k = mod(length,7) + do j = 1,k + i = map(j) + read_array(i) = read_array(i) + keep_array(loc-1+j) + end do + do j = k+1,length, 7 + i = map(j) + read_array(i) = read_array(i) + keep_array(loc-1+j) + i = map(j+1) + read_array(i) = read_array(i) + keep_array(loc+j) + i = map(j+2) + read_array(i) = read_array(i) + keep_array(loc+j+1) + i = map(j+3) + read_array(i) = read_array(i) + keep_array(loc+j+2) + i = map(j+4) + read_array(i) = read_array(i) + keep_array(loc+j+3) + i = map(j+5) + read_array(i) = read_array(i) + keep_array(loc+j+4) + i = map(j+6) + read_array(i) = read_array(i) + keep_array(loc+j+5) + end do + + else + call dcopy(length,keep_array(loc),1,read_array,1) + end if + end if + + end subroutine MA77_read_discard_real + +!************************************************************************ + + subroutine MA77_write_real(rfile,size_array,keep_array,loc,length, & + write_array,flag,data,lp,maxstore,used,inactive) + +! If files are in use (rfile > 0), call of01_write to write from write_array. +! otherwise, try and copy from write_array to keep_array. If +! keep_array is not long enough, try and reallocate. Otherwise, +! switch to using a file. + + integer(short), intent(inout) :: rfile +! index for writing to file or < 0 if in core + real(wp), allocatable :: keep_array(:) +! if files not in use, we copy from write_array into this array. + integer(long), intent(inout) :: size_array ! size of keep_array + integer(long), intent(in) :: loc ! position in keep_array to write to + integer(short), intent(in) :: length ! number of reals to be written + real(wp), intent(in) :: write_array(:) ! write from this array + integer(short), intent(out) :: flag ! error flag + type (of01_rdata), intent(inout) :: data + integer(short), intent(in) :: lp ! unit for of01 error messages + integer(long), intent(in) :: maxstore ! max storage available + integer(long), intent(inout) :: used ! storage used + integer(long), optional, intent(in) :: inactive ! of01 inactive parameter + + real(wp), allocatable :: temp(:) ! temporary array + +! Local scalars + integer(short):: i,lw1,nwrite,st + integer(long) :: klong,lkeep,loc1,lw,lw1_long,nwrite_long + + flag = 0 + if (length == 0) return + + if (rfile > 0) then +! write using of01 + if (present(inactive)) then + call of01_write(rfile,loc,length,write_array,flag,data, & + lp=lp,inactive=inactive) + else + call of01_write(rfile,loc,length,write_array,flag,data,lp=lp) + end if + return + end if + +! Try and copy from write_array into keep_array + lkeep = size_array + if (loc+length-1 <= lkeep) then + call dcopy(length,write_array,1,keep_array(loc),1) + return + end if + +! keep_array is not long enough ... try and reallocate provided the +! limit maxstore is not exceeded. + lw = loc - 1 + klong = max(2*lkeep,lw+length) + if ((used+(klong-lkeep)*2) < maxstore) then +! there is space to deallocate keep_array and reallocate with length klong + allocate (temp(lw),stat=st) + if (st == 0) then +! take a temporary copy of the contents of keep_array and then +! reallocate keep_array with longer length +! Remember that lw is a long integer so split this copy into chunks + if (lw > 0) then + lw1 = lup1 + nwrite_long = lw/lw1 + nwrite = int(nwrite_long) + loc1 = 1 + do i = 1,nwrite + call dcopy(lw1,keep_array(loc1),1,temp(loc1),1) + loc1 = loc1 + lw1 + end do + lw1_long = lw1 + lw1 = int((lw - nwrite*lw1_long),short) + call dcopy(lw1,keep_array(loc1),1,temp(loc1),1) + end if + + deallocate (keep_array,stat=st) + allocate (keep_array(klong),stat=st) + if (st == 0) then + size_array = klong + if (lw > 0) then + lw1 = lup1 + loc1 = 1 + do i = 1,nwrite + call dcopy(lw1,temp(loc1),1,keep_array(loc1),1) + loc1 = loc1 + lw1 + end do + lw1_long = lw1 + lw1 = int((lw - nwrite*lw1_long),short) + call dcopy(lw1,temp(loc1),1,keep_array(loc1),1) + end if + + call dcopy(length,write_array,1,keep_array(loc),1) + deallocate (temp,stat=st) + used = used + (klong - lkeep)*2 + return + else +! contents of keep_array are in temp but not enough room +! to allocate larger keep_array and copy back. +! Switch to using file. First write out contents of temp. +! write (6,*) 'switch to rfile 1', rfile + rfile = -rfile + if (lw > 0) then + lw1 = lup1 + nwrite_long = lw/lw1 + nwrite = int(nwrite_long) + loc1 = 1 + do i = 1,nwrite + call of01_write(rfile,loc1,lw1,temp(loc1:loc1+lw1-1), & + flag,data,lp=lp) + if (flag < 0) then + deallocate (temp,stat=st);return + end if + loc1 = loc1 + lw1 + end do + lw1_long = lw1 + lw1 = int((lw - nwrite*lw1_long),short) + call of01_write(rfile,loc1,lw1,temp(loc1:loc1+lw1-1), & + flag,data,lp=lp) + end if + + if (flag >= 0) then + if (present(inactive)) then + call of01_write(rfile,loc,length,write_array,flag,data, & + lp=lp,inactive=inactive) + else + call of01_write(rfile,loc,length,write_array,flag,data,lp=lp) + end if + end if +! freed up the space used by keep_array + used = used - lkeep*2 + deallocate (temp,stat=st) + return + end if + end if + deallocate (temp,stat=st) + end if + +! Insufficient space to write to keep_array so we must switch to +! using a file with index -rfile (we have already opened a file +! with this index). First write out contents of keep_array +! and then write_array. +! write (6,*) 'switch to rfile 2', rfile + rfile = -rfile + if (lw > 0) then + loc1 = 1 + lw1 = lup1 + nwrite_long = lw/lw1 + nwrite = int(nwrite_long) + do i = 1,nwrite + call of01_write(rfile,loc1,lw1,keep_array(loc1:loc1+lw1-1), & + flag,data,lp=lp) + if (flag < 0) return + loc1 = loc1 + lw1 + end do + lw1_long = lw1 + lw1 = int((lw - nwrite*lw1_long),short) + call of01_write(rfile,loc1,lw1,keep_array(loc1:loc1+lw1-1), & + flag,data,lp=lp) + if (flag < 0) return + end if + + if (present(inactive)) then + call of01_write(rfile,loc,length,write_array,flag,data, & + lp=lp,inactive=inactive) + else + call of01_write(rfile,loc,length,write_array,flag,data,lp=lp) + end if + + deallocate (keep_array,stat=st) + size_array = 0 +! freed up the space used by keep_array + used = used - lkeep*2 + + end subroutine MA77_write_real + +!************************************************************************ + + subroutine MA77_write_integer(ifile,size_array,keep_array,loc,length, & + write_array,flag,data,lp,maxstore,used) + +! If files are in use (ifile > 0), call of01_write to write from write_array. +! otherwise, try and copy from write_array to keep_array. If +! keep_array is not long enough, try and reallocate. Otherwise, +! switch to using a file on unit unit. + + integer(short), intent(inout) :: ifile +! index for writing to file or < 0 if in core + integer(short), allocatable :: keep_array(:) +! if files not in use, we copy from write_array into this array. + integer(long), intent(inout) :: size_array ! size of keep_array + integer(long), intent(in) :: loc ! position in keep_array to write to + integer(short), intent(in) :: length ! number of reals to be written + integer(short), intent(in) :: write_array(:) ! write from this array + integer(short), intent(out) :: flag ! error flag + type (of01_idata), intent(inout) :: data + integer(short), intent(in) :: lp ! unit for of01 error messages + integer(long), intent(in) :: maxstore ! max storage available + integer(long), intent(inout) :: used ! storage used + + integer(short), allocatable :: temp(:) ! temporary array + +! Local scalars + integer(short) :: i,k,lw1,nwrite,st + integer(long) :: ilong,klong,kk,lkeep,lw1_long,loc1,lw,nwrite_long + + flag = 0 + if (length == 0) return + + if (ifile > 0) then +! write (6,*) 'ifile,loc,length,loc+length-1',& +! ifile,loc,length,loc+length-1 +! write using of01 + call of01_write(ifile,loc,length,write_array,flag,data,lp=lp) + return + end if + +! Try and copy from write_array into keep_array + lkeep = size_array +! write (6,*) 'ifile,loc,length,loc+length-1,lkeep',& +! ifile,loc,length,loc+length-1,size(keep_array) + if (loc+length-1 <= lkeep) then + k = mod(length,7) + keep_array(loc:loc-1+k) = write_array(1:k) + do i = k+1,length, 7 + keep_array(loc-1+i) = write_array(i) + keep_array(loc+i) = write_array(i+1) + keep_array(loc+i+1) = write_array(i+2) + keep_array(loc+i+2) = write_array(i+3) + keep_array(loc+i+3) = write_array(i+4) + keep_array(loc+i+4) = write_array(i+5) + keep_array(loc+i+5) = write_array(i+6) + end do +! keep_array(loc:loc+length-1) = write_array(1:length) + return + end if + +! keep_array is not long enough ... try and reallocate with +! space for an extra lkeep integers (provided the +! limit maxstore is not exceeded). +! write (6,*) 'reallocate. ifile',ifile,loc+length-1,lkeep + lw = loc - 1 + kk = max(2*lkeep,lw+length) +! write (6,*) 'lw,used,lkeep',lw,used,lkeep + if ((used+(kk-lkeep)) < maxstore) then + allocate (temp(lw),stat=st) + if (st == 0) then +! take a temporary copy of the contents of keep_array and then +! reallocate keep_array with longer length + klong = mod(lw,7_long) + temp(1:klong) = keep_array(1:klong) + do ilong= klong+1,lw, 7_long + temp(ilong) = keep_array(ilong) + temp(ilong+1) = keep_array(ilong+1) + temp(ilong+2) = keep_array(ilong+2) + temp(ilong+3) = keep_array(ilong+3) + temp(ilong+4) = keep_array(ilong+4) + temp(ilong+5) = keep_array(ilong+5) + temp(ilong+6) = keep_array(ilong+6) + end do +! temp(1:lw) = keep_array(1:lw) + deallocate (keep_array,stat=st) + + allocate (keep_array(kk),stat=st) + if (st == 0) then + size_array = kk + klong = mod(lw,7_long) + keep_array(1:klong) = temp(1:klong) + do ilong = klong+1, lw, 7_long + keep_array(ilong) = temp(ilong) + keep_array(ilong+1) = temp(ilong+1) + keep_array(ilong+2) = temp(ilong+2) + keep_array(ilong+3) = temp(ilong+3) + keep_array(ilong+4) = temp(ilong+4) + keep_array(ilong+5) = temp(ilong+5) + keep_array(ilong+6) = temp(ilong+6) + end do +! keep_array(1:lw) = temp(1:lw) + + k = mod(length,7) + keep_array(loc:loc-1+k) = write_array(1:k) + do i = k+1,length, 7 + keep_array(loc-1+i) = write_array(i) + keep_array(loc+i) = write_array(i+1) + keep_array(loc+i+1) = write_array(i+2) + keep_array(loc+i+2) = write_array(i+3) + keep_array(loc+i+3) = write_array(i+4) + keep_array(loc+i+4) = write_array(i+5) + keep_array(loc+i+5) = write_array(i+6) + end do +! keep_array(loc:loc+length-1) = write_array(1:length) + + deallocate (temp,stat=st) + used = used + (kk - lkeep) + return + else +! contents of keep_array are in temp but not enough room +! to allocate larger keep_array and copy back. +! Switch to using file. First write out contents of temp. +! write (6,*) 'switch to ifile 1', ifile + ifile = -ifile + if (lw > 0_long) then + loc1 = 1 + lw1 = lup1 + nwrite_long = lw/lw1 + nwrite = int(nwrite_long) + do i = 1,nwrite + call of01_write(ifile,loc1,lw1,temp(loc1:loc1+lw1-1), & + flag,data,lp=lp) + if (flag < 0) then + deallocate (temp,stat=st); return + end if + loc1 = loc1 + lw1 + end do + lw1_long = lw1 + lw1 = int((lw - nwrite*lw1_long),short) + call of01_write(ifile,loc1,lw1,temp(loc1:loc1+lw1-1), & + flag,data,lp=lp) + end if + + if (flag >= 0) & + call of01_write(ifile,loc,length,write_array,flag,data,lp=lp) + used = used - lkeep + deallocate (temp,stat=st) + return + end if + end if + deallocate (temp,stat=st) + end if + +! Insufficient space to write to keep_array so we must switch to +! using a file with index -ifile (we have already opened a file +! with this index). First write out contents of keep_array(1:lw) +! and then write_array. +! Note: lw is long integer so need to write in short integer chunks +! write (6,*) 'switch to ifile 2', ifile + ifile = -ifile + if (lw > 0) then + loc1 = 1 + lw1 = lup1 + nwrite_long = lw/lw1 + nwrite = int(nwrite_long) + do i = 1,nwrite + call of01_write(ifile,loc1,lw1,keep_array(loc1:loc1+lw1-1), & + flag,data,lp=lp) + if (flag < 0) return + loc1 = loc1 + lw1 + end do + lw1_long = lw1 + lw1 = int((lw - nwrite*lw1_long),short) + call of01_write(ifile,loc1,lw1,keep_array(loc1:loc1+lw1-1), & + flag,data,lp=lp) + if (flag < 0) return + end if + + call of01_write(ifile,loc,length,write_array,flag,data,lp=lp) + deallocate (keep_array,stat=st) + size_array = 0 + used = used - lkeep + + end subroutine MA77_write_integer + +!************************************************************************ + + subroutine MA77_finalise_double(keep,control,info,restart_file) + +! This routine must be called after all other calls to routines +! in the package. +! Calls are made to of01_close and then to of01_end. +! If restart_file is not present, components of keep are deallocated +! and keep%status reset to 0 on successful return. +! Otherwise, data is written to a sequential access file +! so that future further solves are possible. + + type (MA77_keep), intent (inout) :: keep ! See derived-type declaration + type (MA77_control), intent (in) :: control ! See derived-type declaration + type (MA77_info), intent (out) :: info ! See derived-type declaration + + character (len=*), optional, intent (in) :: restart_file +! If present, must hold the name of the file to which data is written so +! that future solves are possible. + + integer(short), allocatable :: nchild(:) ! used to hold the +! number of children at each node of the tree. + integer(short), allocatable :: nelim(:) ! used to hold the + + integer(long) :: lenw ! temporary variable. + integer(long) :: ilenw ! length in pages of the part of +! the main integer virtual array that have been written. + integer(long) :: rlenw ! length in pages of the part of +! the main reals virtual array that have been written. + integer(short) :: flag ! error flag + logical :: ex ! exist variable for inquire + integer(short) :: i + integer(short) :: ios + integer(short) :: nout + logical :: open + integer(short) :: st ! stat parameter + integer(short) :: unit ! unit number for file + logical :: lkeep ! Set to .true. if files are to be kept on closure + +! Possible error returns: +! -1 Allocation error +! -3 Call with restart_file present but factorisation not performed +! -5 Error from of01_close (error in Fortran inquire) +! -7 Error from of01_close (error in Fortran open) +! -8 Deallocation error +! -12 A file with name restart_file already exists +! -13 len(restart_file) > 500 +! -15 Error in Fortran write +! -41 Error in Fortran CLOSE + +! immediate return if status = 0 (nothing to be done) +! write (6,*) 'final',keep%status +! if (present(restart_file)) write (6,*) 'restart_file ',restart_file + if (keep%status == 0) return + + nout = control%unit_error + if (control%print_level < 0) nout = -1 + keep%name = 'MA77_finalise' + if (control%print_level >= 2 .and. control%unit_diagnostics >= 0) then + if (present(restart_file)) then + write (control%unit_diagnostics,'(/a)') & + ' Entering MA77_finalise, with restart_file present' + else + write (control%unit_diagnostics,'(/a)') & + ' Entering MA77_finalise' + end if + end if + + st = 0 + +! If error occurred in MA77_open before of01 was called, all +! we have to do is deallocate components of keep + if (keep%status == -2) then + call final_deallocate + keep%status = 0 + return + end if + + lkeep = .false. + if (present(restart_file)) then +! Perform quick checks. If an error occurs at this point, we would +! want the user to be able to recall MA77_finalise so we do no deallocation +! before returning. +! Check factorisation was performed. + if (keep%status /= 3) then + info%flag = -3 + call MA77_print_iflag(keep,nout,info%flag) + if (nout >= 0) write (nout,'(a)') & + ' restart_file is present but factors not computed' + return + end if +! Check restart_file. + if (len(restart_file) > 500) then + info%flag = -13 + call ma77_print_iflag(keep,nout,info%flag) + return + end if + inquire (file=trim(restart_file),exist=ex) + if (ex) then + info%flag = -12 + call MA77_print_iflag(keep,nout,info%flag) + return + end if +! find suitable unit number on which to open file + do unit = 10, huge(0) + inquire (unit=unit,iostat=ios,opened=open) + if (ios /= 0) then +! Error in inquire + info%flag = -5; info%iostat = ios + call MA77_print_iflag(keep,nout,info%flag,ios=info%iostat) + return + end if + if (.not. open) exit + end do +! Open an unformatted sequential access file + info%unit_restart = unit + open (unit=unit,file=trim(restart_file),iostat=ios,status='new', & + form='unformatted') + if (ios /= 0 ) then + info%iostat = ios + info%flag = -7 + call MA77_print_iflag(keep,nout,info%flag,ios=info%iostat) + return + end if +! main integer and real files to be kept on closure + lkeep = .true. + end if + +! Write what is left in the buffers to the appropriate +! direct access files and close the files + call of01_close(abs(keep%index(1)),ilenw,info%num_file(1),flag, & + keep%idata,lp=-1,lkeep=lkeep) + if (flag < 0) then + info%flag = flag + if (flag == -14) info%flag = -41 + info%iostat = keep%idata%iostat + end if + + call of01_close(abs(keep%index(2)),rlenw,info%num_file(2),flag, & + keep%rdata,lp=-1,lkeep=lkeep) + if (flag < 0) then + info%flag = flag + if (flag == -14) info%flag = -41 + info%iostat = keep%rdata%iostat + end if + +! We do not want to keep the workspace files so close and delete. + call of01_close(abs(keep%index(3)),lenw,info%num_file(3),flag, & + keep%rdata,lp=-1,lkeep=.false.) + if (flag < 0) then + info%flag = flag + if (flag == -14) info%flag = -41 + info%iostat = keep%rdata%iostat + end if + + call of01_close(abs(keep%index(4)),lenw,info%num_file(4),flag, & + keep%rdata,lp=-1,lkeep=.false.) + if (flag < 0) then + info%flag = flag + if (flag == -14) info%flag = -41 + info%iostat = keep%rdata%iostat + end if + +! check whether an error was encountered in any of the above closure calls. + if (info%flag < 0) then +! write (6,*) 'info%flag =',info%flag + call error_finalise + return + end if + +! If restart is requested, +! write the integers in keep that we have to preserve to the file. + if (present(restart_file)) then +! First preserve data that is needed by of01 + write (unit=unit,iostat=ios,err=10) & + keep%lpage, & + keep%npage, & + keep%file_size, & + ilenw, & + rlenw, & + keep%index(1), & + keep%index(2), & + keep%n + + 10 if (ios /= 0) then + info%flag = -15; info%iostat = ios + call error_finalise + return + end if + + if (keep%n > 0) then + call inner_write(keep,keep%tree) + if (info%flag < 0) then + call error_finalise + return + end if + end if +! finished writing everything we need to restart. Close the file. + close (unit=unit,status='keep') + end if + +! deallocate components of the of01 derived types + call of01_end(flag,keep%idata,-1) + if (flag < 0) then + info%flag = flag + info%stat = keep%idata%stat + end if + call of01_end(flag,keep%rdata,-1) + if (flag < 0) then + info%flag = flag + info%stat = keep%rdata%stat + end if + if (flag < 0) then + info%flag = flag + call MA77_print_iflag(keep,nout,info%flag,st=info%stat) + end if + +! deallocate the components of tree that are finished with + if (keep%status > 1 .and. keep%n > 0) then + do i = keep%l1,keep%l2 + deallocate (keep%tree(i)%child,stat=st) + end do + end if + deallocate (keep%tree,stat=st) + + call final_deallocate + +! Set status parameter + keep%status = 0 + if (info%flag < 0) keep%status = -1 + + contains +!******************************************* + subroutine error_finalise + integer(short) :: flag + + call MA77_print_iflag(keep,nout,info%flag) + keep%status = -1 + + call of01_end(flag,keep%idata,-1) + info%stat = keep%idata%stat + + call of01_end(flag,keep%rdata,-1) + info%stat = keep%rdata%stat + +! deallocate all array components of keep + deallocate (keep%arow,stat=st) + deallocate (keep%aelt,stat=st) + deallocate (keep%clist,stat=st) + deallocate (keep%iptr,stat=st) + deallocate (keep%ifile,stat=st) + deallocate (keep%map,stat=st) + deallocate (keep%new,stat=st) + deallocate (keep%rfile,stat=st) + deallocate (keep%roots,stat=st) + deallocate (keep%size,stat=st) + deallocate (keep%size_ind,stat=st) + deallocate (keep%svar,stat=st) + deallocate (keep%splitp,stat=st) + deallocate (keep%vars,stat=st) + deallocate (keep%varflag,stat=st) + + deallocate (keep%imain,stat=st) + deallocate (keep%rmain,stat=st) + deallocate (keep%rwork,stat=st) + deallocate (keep%rwdelay,stat=st) + + if (keep%status > 1) then + do i = keep%l1,keep%l2 + deallocate (keep%tree(i)%child,stat=st) + end do + end if + deallocate (keep%tree,stat=st) + + end subroutine error_finalise +!******************************************* + subroutine final_deallocate + +! deallocate all array components of keep + deallocate (keep%arow,stat=st) + deallocate (keep%aelt,stat=st) + deallocate (keep%clist,stat=st) + deallocate (keep%iptr,stat=st) + deallocate (keep%ifile,stat=st) + deallocate (keep%map,stat=st) + deallocate (keep%new,stat=st) + deallocate (keep%rfile,stat=st) + deallocate (keep%roots,stat=st) + deallocate (keep%size,stat=st) + deallocate (keep%size_ind,stat=st) + deallocate (keep%splitp,stat=st) + deallocate (keep%svar,stat=st) + deallocate (keep%vars,stat=st) + deallocate (keep%varflag,stat=st) + + deallocate (keep%imain,stat=st) + deallocate (keep%rmain,stat=st) + deallocate (keep%rwork,stat=st) + deallocate (keep%rwdelay,stat=st) + + end subroutine final_deallocate +!******************************************* + subroutine inner_write(keep,tree) + + type (MA77_keep), intent (inout) :: keep + type (MA77_node), intent (inout) :: tree(keep%l1:keep%l2) + + integer(short) :: i + integer(short) :: ios + integer(short) :: nroot + integer(short) :: size_rfile + integer(short) :: st + +! Have to preserve keep%rfile(1:nelt) for possible residual calculations + nroot = size(keep%roots) + size_rfile = size(keep%rfile) + + keep%l1 = keep%nelt+1 + keep%l2 = keep%tnode + + write (unit=unit,iostat=ios,err=10) & + nroot, & + size_rfile, & + keep%l1, & + keep%l2, & + keep%ltree, & + keep%tnode, & + keep%nelt + +! store the number of children that each (non-leaf) node in the tree has. + deallocate (nchild,nelim,stat=st) + allocate (nchild(keep%l1:keep%l2),nelim(keep%l1:keep%l2),stat=st) + if (st /= 0) then + info%flag = -1; return + end if + nchild = 0 + nelim = 0 + do i = keep%l1,keep%l2 + if (allocated(keep%tree(i)%child)) & + nchild(i) = size(keep%tree(i)%child) + nelim(i) = keep%tree(i)%nelim + end do + + write (unit=unit,iostat=ios,err=10) & + keep%flag, & + keep%lup, & + keep%nb, & + keep%element_input, & + keep%pos_def, & + keep%dfree, & + keep%ifree, & + keep%inelrs, & + keep%mx_ifree, & + keep%mvar, & + keep%mmvar, & + keep%maxdepth, & + keep%maxelim_actual, & + keep%maxfa, & + keep%maxfront, & + keep%maxfrontb, & + keep%maxlen, & + keep%maxstore, & + keep%name, & + keep%ntwo, & + keep%null, & + keep%posfac, & + keep%posint, & + keep%rfree, & + keep%rtopmx, & + keep%rtopdmx, & + keep%rfile, & + keep%roots, & + keep%scale, & + keep%used, & + keep%size(1:keep%tnode), & + keep%ifile(1:keep%tnode), & + nchild(keep%l1:keep%l2), & + nelim(keep%l1:keep%l2), & + keep%splitp(keep%l1:keep%l2) + + do i = keep%l1,keep%l2 + if (nchild(i) > 0) write (unit=unit,iostat=ios,err=10) tree(i)%child + end do + + if (.not.keep%pos_def) then +! reuse nelim to hold keep%size_ind(keep%l1:keep%l2) +! (if we do not fo this, ifort gives a warning message about taking +! temporay copy) + do i = keep%l1,keep%l2 + nelim(i) = keep%size_ind(i) + end do + write (unit=unit,iostat=ios,err=10) nelim(keep%l1:keep%l2) + end if + deallocate (nchild,stat=st) + deallocate (nelim,stat=st) + + if (keep%index(1) < 0) & +! Integers are in imain + write (unit=unit,iostat=ios,err=10) keep%imain(1:keep%ifree-1) + if (keep%index(2) < 0) & +! Reals are in rmain + write (unit=unit,iostat=ios,err=10) keep%rmain(1:keep%rfree-1) + + 10 if (ios /= 0) then + info%flag = -15; info%iostat = ios; return + end if + + + end subroutine inner_write + + + end subroutine MA77_finalise_double +!*************************************************************** + + subroutine MA77_restart_double(restart_file,filename,keep,control,info,path) + +! This routine must be called if the user wants to restart, that is, perform +! further solves after a call to MA77_finalise. +! Data is written to the sequential access file restart_file. +! If direct access files were used for the factors, +! calls are made to of01_initialize and then to of01_open. + + type (MA77_keep), intent (out) :: keep ! See derived-type declaration + type (MA77_control), intent (in) :: control ! See derived-type declaration + type (MA77_info), intent (inout) :: info ! See derived-type declaration + + character (len=*), intent (in) :: restart_file +! Must hold the name of the file to which data was written by MA77_finalise. + character (len=*), optional, intent (in) :: path(:) + character (len=*), intent (in) :: filename(4) +! Must hold the name of the paths/files + + integer(short), allocatable :: nchild(:) ! used to hold the number of +! children at each node of the tree. + integer(short), allocatable :: nelim(:) ! used to hold the number of + + integer(long) :: ilenw ! length in pages of the part of +! the main integer virtual array that have been written. + integer(long) :: rlenw ! length in pages of the part of +! the main real virtual array that have been written. + logical :: ex ! exist variable for inquire + integer(short) :: file + integer(short) :: ind ! of01 index + integer(short) :: ios + integer(short) :: nout + integer(short) :: nroot ! size of keep%roots + logical :: open + integer(short) :: size_rfile ! size of keep%rfile + integer(short) :: st ! stat parameter + integer(short) :: unit ! unit number for file + +! Possible error returns: +! -1 Allocation error +! -5 Error in Fortran inquire +! -6 Error in Fortran read +! -7 Error in Fortran open +! -8 Deallocation error +! -12 File with name filename(3:5) already exists +! -13 len(filename) > 400 +! -16 len(path) > 400 or open unsuccessful for all elements of path +! -28 Files with names restart_file and/or filename(1:2) do not exist. + + nout = control%unit_error + if (control%print_level < 0) nout = -1 + keep%name = 'MA77_restart' + + st = 0 + info%flag = 0 + + if (present(path)) then + if (len(path) > 400) then + info%flag = -16 + call MA77_print_iflag(keep,nout,info%flag) + return + end if + end if + if (len(filename) > 400) then + info%flag = -13 + call MA77_print_iflag(keep,nout,info%flag) + return + end if + +! Check restart file + inquire (file=trim(restart_file),exist=ex) + if (.not. ex) then + info%flag = -28 + call MA77_print_iflag(keep,nout,info%flag) +! if (nout >= 0) write (nout,*) ' restart_file = ',trim(restart_file) + return + end if +! find suitable unit number on which to open file + do unit = 10, huge(0) + inquire (unit=unit,iostat=ios,opened=open) + if (ios /= 0) then +! Error in inquire + info%flag = -5; info%iostat = ios + call MA77_print_iflag(keep,nout,info%flag,ios=info%iostat) + return + end if + if (.not. open) exit + end do + info%unit_restart = unit +! Open the sequential access file restart_file + open (unit=unit,file=trim(restart_file),iostat=ios,status='old', & + form='unformatted') + if (ios /= 0) then + info%iostat = ios + info%flag = -7 + call MA77_print_iflag(keep,nout,info%flag,ios=info%iostat) + close (unit=unit,status='keep') + return + end if + +! Read in of01 data + read (unit=unit,iostat=ios,err=10) & + keep%lpage, & + keep%npage, & + keep%file_size, & + ilenw, & + rlenw, & + keep%index(1), & + keep%index(2), & + keep%n + + if (present(path)) then + call of01_initialize(info%flag,keep%idata,path=path,npage=keep%npage(1),& + lpage=keep%lpage(1),file_size=keep%file_size,lp=-1) + else + call of01_initialize(info%flag,keep%idata,npage=keep%npage(1), & + lpage=keep%lpage(1),file_size=keep%file_size,lp=-1) + end if + if (info%flag == -1) then + info%stat = keep%idata%stat + call MA77_print_iflag(keep,nout,info%flag,st=info%stat) + close (unit=unit,status='keep') + return + end if + + if (present(path)) then + call of01_initialize(info%flag,keep%rdata,path=path,npage=keep%npage(2),& + lpage=keep%lpage(2),file_size=keep%file_size,lp=-1) + else + call of01_initialize(info%flag,keep%rdata,npage=keep%npage(2), & + lpage=keep%lpage(2),file_size=keep%file_size,lp=-1) + end if + if (info%flag == -1) then + call MA77_print_iflag(keep,nout,info%flag,st=info%stat) + info%stat = keep%rdata%stat + close (unit=unit,status='keep') + return + end if + +! Open direct access files with of01. +! If files were used for the factorization, the first two contain saved +! integer and real data, respectively. + if (keep%index(1) > 0 .and. keep%n > 0) then + call of01_open(filename(1),ind,info%flag,keep%idata,lenw=ilenw,lp=-1) + if (info%flag >= 0) keep%index(1) = ind + else + call of01_open(filename(1),ind,info%flag,keep%idata,lp=-1) + if (info%flag >= 0)keep%index(1) = -ind + end if + if (info%flag < 0) then + info%iostat = keep%idata%iostat; file = 1 + call restart_error; return + end if + + if (keep%index(2) > 0 .and. keep%n > 0) then + call of01_open(filename(2),ind,info%flag,keep%rdata,lenw=rlenw,lp=-1) + if (info%flag >= 0)keep%index(2) = ind + else + call of01_open(filename(2),ind,info%flag,keep%rdata,lp=-1) + if (info%flag >= 0)keep%index(2) = -ind + end if + if (info%flag < 0) then + info%iostat = keep%rdata%iostat; file = 2 + call restart_error; return + end if + + call of01_open(filename(3),keep%index(3),info%flag,keep%rdata,lp=-1) + if (info%flag < 0) then + info%iostat = keep%rdata%iostat; file = 3 + call restart_error; return + end if + +! Secondary work array needed in the indefinite case + call of01_open(filename(4),keep%index(4),info%flag,keep%rdata,lp=-1) + if (info%flag < 0) then + info%iostat = keep%rdata%iostat; file = 4 + call restart_error; return + end if + + info%index(1:4) = keep%index(1:4) + if (keep%n == 0) go to 30 + + read (unit=unit,iostat=ios,err=10) & + nroot, & + size_rfile, & + keep%l1, & + keep%l2, & + keep%ltree, & + keep%tnode, & + keep%nelt + + deallocate (keep%tree,stat=st) + allocate (keep%tree(keep%l1:keep%l2),stat=st) + if (st /= 0) go to 20 + + deallocate (keep%roots,stat=st) + allocate (keep%roots(nroot),stat=st) + if (st /= 0) go to 20 + + deallocate (keep%rfile,stat=st) + allocate (keep%rfile(size_rfile),stat=st) + if (st /= 0) go to 20 + + deallocate (keep%size,stat=st) + allocate (keep%size(1+keep%tnode),stat=st) + if (st /= 0) go to 20 + + deallocate (keep%ifile,stat=st) + allocate (keep%ifile(1+keep%tnode),stat=st) + if (st /= 0) go to 20 + +! allocate space for the number of children that each +!(non-leaf) node in the tree has. + deallocate (nchild,nelim,stat=st) + allocate (nchild(keep%l1:keep%l2),nelim(keep%l1:keep%l2),stat=st) + if (st /= 0) go to 20 + +! allocate space for the splitp points. + deallocate (keep%splitp,stat=st) + allocate (keep%splitp(keep%l1:keep%l2),stat=st) + if (st /= 0) go to 20 + +! Read keep plus read into tree + call inner_read(keep,keep%tree) + + deallocate (nchild,stat=st) + deallocate (nelim,stat=st) + if (info%flag < 0) then + keep%status = -1 + return + end if + + if (keep%index(1) < 0) then +! Read integers into imain + deallocate (keep%imain,stat=st) + allocate (keep%imain(1:keep%ifree-1),stat=st) + if (st /= 0) go to 20 + read (unit=unit,iostat=ios,err=10) keep%imain(1:keep%ifree-1) + keep%size_imain = keep%ifree-1 + end if + if (keep%index(2) < 0) then +! Read reals into rmain + deallocate (keep%rmain,stat=st) + allocate (keep%rmain(1:keep%rfree-1),stat=st) + if (st /= 0) go to 20 + read (unit=unit,iostat=ios,err=10) keep%rmain(1:keep%rfree-1) + keep%size_rmain = keep%rfree-1 + end if + if (keep%index(3) < 0) then +! Allocate rwork + deallocate (keep%rwork,stat=st) + allocate (keep%rwork(1:keep%rtopmx),stat=st) + if (st /= 0) go to 20 + keep%size_rwork = keep%rtopmx + end if + if (keep%index(4) < 0) then +! Allocate rwdelay + deallocate (keep%rwdelay,stat=st) + allocate (keep%rwdelay(1:keep%rtopdmx),stat=st) + if (st /= 0) go to 20 + keep%size_rwdelay = keep%rtopdmx + end if + + 10 if (ios /= 0) then + info%flag = -6 + info%iostat = ios + call MA77_print_iflag(keep,nout,info%flag,ios=info%iostat) + deallocate (nchild,stat=st) + deallocate (nelim,stat=st) + keep%status = -1 + return + end if + + 20 if (st /= 0) then + info%flag = -1 + info%stat = st + call MA77_print_iflag(keep,nout,info%flag,st=info%stat) + deallocate (nchild,stat=st) + deallocate (nelim,stat=st) + keep%status = -1 + return + end if + +! finished reading everything we need to restart. Close the file and delete. + 30 rewind (unit=unit) + close (unit=unit,status='delete') + +! set keep%status to show restart been called successfully + keep%status = 3 + if (control%print_level >= 1 .and. control%unit_diagnostics >= 0) & + write (control%unit_diagnostics,'(/a,i4/a,4i4)') & + ' Leaving MA77_restart with error flag info%flag = ', info%flag, & + ' File indices info%index(1:4) = ',info%index(1:4) + + + contains +!******************************************* + subroutine restart_error + integer(short) :: flag,num_file + integer(long) :: lenw + + keep%status = -2 + if (info%flag == -11) info%flag = -28 + if (info%flag == -17) info%flag = -16 + call MA77_print_iflag(keep,nout,info%flag) +! close any files that had already been opened +! (keep them if they hold factor data) + if (file > 1) then + if (keep%index(1) > 0) then + call of01_close(keep%index(1),lenw,num_file,flag, & + keep%idata,lp=-1,lkeep=.true.) + else + call of01_close(-keep%index(1),lenw,num_file,flag, & + keep%idata,lp=-1,lkeep=.false.) + end if + end if + if (file > 2) then + if (keep%index(2) > 0) then + call of01_close(keep%index(2),lenw,num_file,flag, & + keep%rdata,lp=-1,lkeep=.true.) + else + call of01_close(-keep%index(2),lenw,num_file,flag, & + keep%rdata,lp=-1,lkeep=.false.) + end if + end if + if (file > 3) call of01_close(keep%index(3),lenw,num_file,flag, & + keep%rdata,lp=-1,lkeep=.false.) + if (file > 4) call of01_close(keep%index(4),lenw,num_file,flag, & + keep%idata,lp=-1,lkeep=.false.) + + close (unit=unit,status='keep') + + end subroutine restart_error + +!******************************************* + subroutine inner_read(keep,tree) + + type (MA77_keep), intent (inout) :: keep + type (MA77_node), intent (inout) :: tree(keep%l1:keep%l2) + + integer(short) :: i + integer(short) :: ios + integer(short) :: nc + integer(short) :: st + + read (unit=unit,iostat=ios,err=10) & + keep%flag, & + keep%lup, & + keep%nb, & + keep%element_input, & + keep%pos_def, & + keep%dfree, & + keep%ifree, & + keep%inelrs, & + keep%mx_ifree, & + keep%mvar, & + keep%mmvar, & + keep%maxdepth, & + keep%maxelim_actual, & + keep%maxfa, & + keep%maxfront, & + keep%maxfrontb, & + keep%maxlen, & + keep%maxstore, & + keep%name, & + keep%ntwo, & + keep%null, & + keep%posfac, & + keep%posint, & + keep%rfree, & + keep%rtopmx, & + keep%rtopdmx, & + keep%rfile, & + keep%roots, & + keep%scale, & + keep%used, & + keep%size(1:keep%tnode), & + keep%ifile(1:keep%tnode), & + nchild(keep%l1:keep%l2), & + nelim(keep%l1:keep%l2), & + keep%splitp(keep%l1:keep%l2) + + do i = keep%l1,keep%l2 + tree(i)%nelim = nelim(i) + nc = nchild(i) + allocate (tree(i)%child(nc),stat=st) + if (st /= 0) go to 20 + if (nc > 0) read (unit=unit,iostat=ios,err=10) tree(i)%child + end do + + if (.not.keep%pos_def) then + allocate (keep%size_ind(keep%l1:keep%l2),stat=st) + if (st /= 0) go to 20 +! make temporary use of nelim to avoid warning message from ifort about +! making temporary copy + read (unit=unit,iostat=ios,err=10) nelim(keep%l1:keep%l2) + keep%size_ind(keep%l1:keep%l2) = nelim(keep%l1:keep%l2) + end if + + 10 if (ios /= 0) then + info%flag = -6 + info%iostat = ios + call MA77_print_iflag(keep,nout,info%flag,ios=info%iostat) + return + end if + + 20 if (st /= 0) then + info%flag = -1 + info%stat = st + call MA77_print_iflag(keep,nout,info%flag,st=info%stat) + return + end if + + end subroutine inner_read + + end subroutine MA77_restart_double + +!******************************************* + +!!! This is using the ma54 solve code, adapted for forming the product +! y = Lx +! (we need to retain ma54 data structures) + + +subroutine ma54_multiplyL1(n,p,nb,ap,y,z,info) + +! Computes y = ( L ) x +! ( M ) +! given a partial Cholesky factorization in blocked hybrid format. +! L is non-unit triangular + + integer, intent (in) :: n ! Specifies the matrix order + integer, intent (in) :: p ! Number of columns + integer, intent (in) :: nb ! Block size for the blocked hybrid format. + real (wp), intent (in) :: ap(0:(p*(n*2-p+1_long))/2-1) ! Holds the matrix. + real (wp), intent (inout) :: y(n) ! holds x +! on entry and is overwritten. + real (wp), intent (out) :: z(n) ! holds y on exit + integer, intent (out) :: info ! set to one of these values: +! 0 Successful solution. +! < 0 The value of argument -info is not valid. + +! Local variables + integer j ! First column of current block column + integer jb ! Number of columns in current block column + integer(long) jbt ! Size of packed triangle of order jb + integer(long) jd ! size of current trapezoid / increment for jj + integer(long) jj ! Position in ap of start of current diagonal block + integer(long) nb2 ! nb*int(nb,long) + integer(long) nbt ! Size of packed triangle of order nb + +! .. Executable Statements .. + info = 0 + if (p>n) info = -3 + if (n<0) info = -1 + if (p<0) info = -2 + if (nb<1) info = -5 + + if (info/=0 .or. n==0) return + + z(1:n) = zero + jj = 0 + nb2 = nb*int(nb,long) + nbt = (nb2+nb)/2 + jd = n*int(nb,long) - nbt + nb + +! Form U'*X = Y + do j = 1, p - nb, nb + call dgemv('T',nb,n+1-j-nb,one,ap(jj+nbt),nb,y(j),1,one,z(j+nb),1) + + call dtpmv('U','T','N',nb,ap(jj),y(j),1) + + call daxpy(nb,one,y(j),1,z(j),1) + + jj = jj + jd + jd = jd - nb2 + end do + + jb = p - j + 1 + jbt = (jb*(jb+1_long))/2 + + if (n>=j+jb) then + call dgemv('T',jb,n+1-j-jb,one,ap(jj+jbt),jb,y(j),1,one,z(j+jb),1) + end if + + call dtpmv('U','T','N',jb,ap(jj),y(j),1) + + call daxpy(jb,one,y(j),1,z(j),1) + +end subroutine ma54_multiplyL1 + +!******************************************* +!!! This is using the ma54 solve code, adapted for forming the product +! y = L'x +! (we need to retain ma54 data structures) + + subroutine ma54_multiplyLT1(n,p,nb,ap,y,z,info) + +! Computes y = ( L' M') x + +! given a partial Cholesky factorization in blocked hybrid format. +! L is non-unit triangular + + integer, intent (in) :: n ! Specifies the matrix order + integer, intent (in) :: p ! Number of columns + integer, intent (in) :: nb ! Block size for the blocked hybrid format. + real (wp), intent (in) :: ap(0:(p*(n*2-p+1_long))/2-1) ! Holds the matrix. + real (wp), intent (inout) :: y(n) ! holds x +! on entry and is overwritten by y. + real (wp), intent (out) :: z(n) ! holds copy of y as is on input + integer, intent (out) :: info ! set to one of these values: +! 0 Successful solution. +! < 0 The value of argument -info is not valid. + + integer i ! Temporary variable + integer j ! First column of current block column + integer jb ! Number of columns in current block column + integer(long) jbt ! Size of packed triangle of order jb + integer(long) jd ! size of current trapezoid / increment for jj + integer(long) jj ! Position in ap of start of current diagonal block + integer(long) nb2 ! nb*int(nb,long) + integer(long) nbt ! Size of packed triangle of order nb + + info = 0 + if (p>n) info = -3 + if (n<0) info = -1 + if (p<0) info = -2 + if (nb<1) info = -5 + if (info/=0 .or. n==0) return + + + jj = 0 + nb2 = nb*int(nb,long) + nbt = (nb2+nb)/2 + jd = n*int(nb,long) - nbt + nb + do j = 1, p - nb, nb + jj = jj + jd + jd = jd - nb2 + end do + + z(1:n) = y(1:n) + + jb = p - j + 1 + jbt = (jb*(jb+1_long))/2 + call dtpmv('U','N','N',jb,ap(jj),y(j),1) + if (n>=j+jb) then + call dgemv('N',jb,n+1-j-jb,one,ap(jj+jbt),jb,z(j+jb),1,one,y(j),1) + end if + + i = j - nb + do j = i, 1, -nb + jd = jd + nb2 + jj = jj - jd + call dtpmv('U','N','N',nb,ap(jj),y(j),1) + call dgemv('N',nb,n+1-j-nb,one,ap(jj+nbt),nb,z(j+nb),1,one,y(j),1) + end do + +end subroutine ma54_multiplyLT1 + +!******************************************* +!!! This is using the ma64 solve code, adapted for forming the product +! y = Lx +! (we need to retain ma64 data structures) + + subroutine ma64_multiplyL1(n,q,nb,y,z,flag,a,ll) + +! Computes y = ( L ) x +! ( M ) +! where L is unit lower triangular of size q. + + integer, intent (in) :: n ! Matrix order + integer, intent (in) :: q ! Order of L (and D) + integer, intent (in) :: nb ! The block size used for the blocked hybrid +! format. + real (wp), intent (inout) :: y(n) ! y holds x +! on entry and is overwritten. + real (wp), intent (out) :: z(n) ! z holds y on exit + integer, intent (out) :: flag + integer(long), intent (in) :: ll ! Size of a + real (wp), intent (in) :: a( ll ) +! Holds ( L ) packed by columns. +! ( M ) + +! .. Locals .. + integer j ! Column index + integer jb ! Width of block + integer(long) k, k1 ! Position in array + integer lj ! Length of block + + flag = 0 + if (n < 0) then + flag = -1 + else if (nb <= 1) then + flag = -4 + else if (q < 0) then + flag = -8 + else if (q > n) then + flag = -9 + end if + if (flag/=0 .or. q==0) return + + z(1:n) = zero + k = 1 + lj = n + do j = 1, q, nb + jb = min(nb,q-j+1) + + k1 = k + (jb*(jb+1_long))/2 + lj = lj - jb + if (lj>0) call dgemv('N',lj,jb,one,a(k1),lj,y(j),1,one,z(j+jb),1) + + call dtpmv('L','N','U',jb,a(k),y(j),1) + + call daxpy(jb,one,y(j),1,z(j),1) + k = k1 + jb*lj + end do + + + end subroutine ma64_multiplyL1 + +!******************************************* +!!! This is using the ma64 solve code, adapted for forming the product +! y = L'x +! (we need to retain ma64 data structures) + + subroutine ma64_multiplyLT1(n,q,nb,y,flag,a,ll) + +! Computes y = ( L' M') x + +! where L is unit lower triangular of size q. + + integer, intent (in) :: n ! Matrix order + integer, intent (in) :: q ! Order of L (and D) + integer, intent (in) :: nb ! The block size used for the blocked hybrid +! format. + real (wp), intent (inout) :: y(n) ! y holds x +! on entry and is overwritten by y. + integer, intent (out) :: flag + integer(long), intent (in) :: ll ! Size of a + real (wp), intent (in) :: a( ll ) +! Holds ( L ) packed by columns. +! ( M ) + +! .. Locals .. + integer j ! Column index + integer jb ! Width of block + integer j1 ! First column of block + integer(long) k,k1 ! Position in array + integer lj ! Length of block + integer m ! + + flag = 0 + if (n < 0) then + flag = -1 + else if (nb <= 1) then + flag = -4 + else if (q < 0) then + flag = -8 + else if (q > n) then + flag = -9 + end if + if (flag/=0 .or. q==0) return + + m = nb*((q-1)/nb) + k = 1 + ll + j1 = 1 + m + lj = n - q + do j = j1, 1, -nb + jb = min(nb,q-j+1) + k = k - lj*jb + k1 = k - (jb*(jb+1_long))/2 + call dtpmv('L','T','U',jb,a(k1),y(j),1) + + if (lj>0) call dgemv('T',lj,jb,one,a(k),lj,y(j+jb),1,one,y(j),1) + k = k1 + lj = lj + jb + end do + + end subroutine ma64_multiplyLT1 +!******************************************* + +end module hsl_MA77_double diff --git a/coinhsl/hsl_ma77/hsl_ma77d.lo b/coinhsl/hsl_ma77/hsl_ma77d.lo new file mode 100644 index 0000000..0ecd8f5 --- /dev/null +++ b/coinhsl/hsl_ma77/hsl_ma77d.lo @@ -0,0 +1,12 @@ +# coinhsl/hsl_ma77/hsl_ma77d.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4.6 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/hsl_ma77d.o' + +# Name of the non-PIC object +non_pic_object=none + diff --git a/coinhsl/hsl_ma86/.deps/.dirstamp b/coinhsl/hsl_ma86/.deps/.dirstamp new file mode 100644 index 0000000..e69de29 diff --git a/coinhsl/hsl_ma86/.dirstamp b/coinhsl/hsl_ma86/.dirstamp new file mode 100644 index 0000000..e69de29 diff --git a/coinhsl/hsl_ma86/.libs/hsl_ma86d.o b/coinhsl/hsl_ma86/.libs/hsl_ma86d.o new file mode 100644 index 0000000000000000000000000000000000000000..aab798f57c3292dd3a1da502a65277f90e6270c3 GIT binary patch literal 164104 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 L{J&2Hea`>?K;z$? literal 0 HcmV?d00001 diff --git a/coinhsl/hsl_ma86/C/.deps/.dirstamp b/coinhsl/hsl_ma86/C/.deps/.dirstamp new file mode 100644 index 0000000..e69de29 diff --git a/coinhsl/hsl_ma86/C/.dirstamp b/coinhsl/hsl_ma86/C/.dirstamp new file mode 100644 index 0000000..e69de29 diff --git a/coinhsl/hsl_ma86/C/.libs/hsl_ma86d_ciface.o b/coinhsl/hsl_ma86/C/.libs/hsl_ma86d_ciface.o new file mode 100644 index 0000000000000000000000000000000000000000..2995d2ee0f9566325e0574791ac114be592d2258 GIT binary patch literal 16016 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 literal 0 HcmV?d00001 diff --git a/coinhsl/hsl_ma86/C/hsl_ma86d.h b/coinhsl/hsl_ma86/C/hsl_ma86d.h new file mode 100644 index 0000000..590453e --- /dev/null +++ b/coinhsl/hsl_ma86/C/hsl_ma86d.h @@ -0,0 +1,145 @@ +/* + * COPYRIGHT (c) 2011 Science and Technology Facilities Council (STFC) + * Original date 25 Feburary 2011 + * All rights reserved + * + * Written by: Jonathan Hogg + * + * THIS FILE ONLY may be redistributed under the below modified BSD licence. + * All other files distributed as part of the HSL_MA86 package + * require a licence to be obtained from STFC and may NOT be redistributed + * without permission. Please refer to your licence for HSL_MA86 for full terms + * and conditions. STFC may be contacted via hsl(at)stfc.ac.uk. + * + * Modified BSD licence (this header file only): + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of STFC nor the names of its contributors may be used + * to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL STFC BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef HSL_MA86D_H +#define HSL_MA86D_H + +#ifndef ma86_default_control +#define ma86_control ma86_control_d +#define ma86_info ma86_info_d +#define ma86_default_control ma86_default_control_d +#define ma86_analyse ma86_analyse_d +#define ma86_factor ma86_factor_d +#define ma86_factor_solve ma86_factor_solve_d +#define ma86_solve ma86_solve_d +#define ma86_finalise ma86_finalise_d +#endif + +typedef double ma86pkgtype_d_; +typedef double ma86realtype_d_; + +/* Data type for user controls */ +struct ma86_control_d { + /* Note: 0 is false, non-zero is true */ + + /* C/Fortran interface related controls */ + int f_arrays; /* Treat arrays as 1-based (Fortran) if true or 0-based (C) if + false. */ + + /* Printing controls */ + int diagnostics_level; /* Controls diagnostic printing.*/ + /* Possible values are: + < 0: no printing. + 0: error and warning messages only. + 1: as 0 plus basic diagnostic printing. + 2: as 1 plus some more detailed diagnostic messages. + 3: as 2 plus all entries of user-supplied arrays. */ + int unit_diagnostics; /* unit for diagnostic messages + Printing is suppressed if unit_diagnostics < 0. */ + int unit_error; /* unit for error messages + Printing is suppressed if unit_error < 0. */ + int unit_warning; /* unit for warning messages + Printing is suppressed if unit_warning < 0. */ + + /* Controls used by ma86_analyse */ + int nemin; /* Node amalgamation parameter. A child node is merged with its + parent if they both involve fewer than nemin eliminations.*/ + int nb; /* Controls the size of the blocks used within each node (used to + set nb within node_type)*/ + + /* Controls used by ma86_factor and ma86_factor_solve */ + int action; /* Keep going even if matrix is singular if true, or abort + if false */ + int nbi; /* Inner block size for use with ma64*/ + int pool_size; /* Size of task pool arrays*/ + ma86realtype_d_ small_; /* Pivots less than small are treated as zero*/ + ma86realtype_d_ static_;/* Control static pivoting*/ + ma86realtype_d_ u; /* Pivot tolerance*/ + ma86realtype_d_ umin; /* Minimum pivot tolerance*/ + int scaling; /* Scaling algorithm to use */ +}; + +/***************************************************/ + +/* data type for returning information to user.*/ +struct ma86_info_d { + ma86realtype_d_ detlog; /* Holds logarithm of abs det A (or 0) */ + int detsign; /* Holds sign of determinant (+/-1 or 0) */ + int flag; /* Error return flag (0 on success) */ + int matrix_rank; /* Rank of matrix */ + int maxdepth; /* Maximum depth of the tree. */ + int num_delay; /* Number of delayed pivots */ + long num_factor; /* Number of entries in the factor. */ + long num_flops; /* Number of flops for factor. */ + int num_neg; /* Number of negative pivots */ + int num_nodes; /* Number of nodes */ + int num_nothresh; /* Number of pivots not satisfying u */ + int num_perturbed; /* Number of perturbed pivots */ + int num_two; /* Number of 2x2 pivots */ + int pool_size; /* Maximum size of task pool used */ + int stat; /* STAT value on error return -1. */ + ma86realtype_d_ usmall; /* smallest threshold parameter used */ +}; + +/* Initialise control with default values */ +void ma86_default_control_d(struct ma86_control_d *control); +/* Analyse the sparsity pattern and prepare for factorization */ +void ma86_analyse_d(const int n, const int ptr[], const int row[], int order[], + void **keep, const struct ma86_control_d *control, + struct ma86_info_d *info); +/* To factorize the matrix */ +void ma86_factor_d(const int n, const int ptr[], const int row[], + const ma86pkgtype_d_ val[], const int order[], void **keep, + const struct ma86_control_d *control, struct ma86_info_d *info, + const ma86realtype_d_ scale[]); +/* To factorize the matrix AND solve AX = B */ +void ma86_factor_solve_d(const int n, const int ptr[], const int row[], + const ma86pkgtype_d_ val[], const int order[], void **keep, + const struct ma86_control_d *control, struct ma86_info_d *info, + const int nrhs, const int ldx, ma86pkgtype_d_ x[], + const ma86realtype_d_ scale[]); +/* To solve AX = B using the computed factors */ +void ma86_solve_d(const int job, const int nrhs, const int ldx, + ma86pkgtype_d_ *x, const int order[], void **keep, + const struct ma86_control_d *control, struct ma86_info_d *info, + const ma86realtype_d_ scale[]); +/* To clean up memory in keep */ +void ma86_finalise_d(void **keep, const struct ma86_control_d *control); + +#endif diff --git a/coinhsl/hsl_ma86/C/hsl_ma86d_ciface.f90 b/coinhsl/hsl_ma86/C/hsl_ma86d_ciface.f90 new file mode 100644 index 0000000..3a807f4 --- /dev/null +++ b/coinhsl/hsl_ma86/C/hsl_ma86d_ciface.f90 @@ -0,0 +1,409 @@ +! +! COPYRIGHT (c) 2011 Science and Technology Facilities Council +! Original date 25 Feburary 2011 +! +! Written by: Jonathan Hogg and Jennifer Scott +! + +module hsl_ma86d_ciface + use iso_c_binding + use hsl_ma86_double, only : & + f_ma86_keep => ma86_keep, & + f_ma86_control => ma86_control, & + f_ma86_info => ma86_info, & + f_ma86_analyse => ma86_analyse, & + f_ma86_factor => ma86_factor, & + f_ma86_factor_solve => ma86_factor_solve, & + f_ma86_solve => ma86_solve, & + f_ma86_finalise => ma86_finalise, & + f_ma86_get_n__ => ma86_get_n__ + implicit none + + ! Data type for user controls + type, bind(C) :: ma86_control + ! C/Fortran interface related controls + integer(C_INT) :: f_arrays ! 0 is false, otherwise is true + ! Printing controls + integer(C_INT) :: diagnostics_level + integer(C_INT) :: unit_diagnostics + integer(C_INT) :: unit_error + integer(C_INT) :: unit_warning + ! Controls used by ma86_analyse + integer(C_INT) :: nemin + integer(C_INT) :: nb + ! Controls used by ma86_factor and ma86_factor_solve + integer(C_INT) :: action ! 0 is false, otherwise is true + integer(C_INT) :: nbi + integer(C_INT) :: pool_size + real(C_DOUBLE) :: small + real(C_DOUBLE) :: static + real(C_DOUBLE) :: u + real(C_DOUBLE) :: umin + integer(C_INT) :: scaling + end type ma86_control + + !************************************************* + + ! data type for returning information to user. + type, bind(C) :: ma86_info + real(C_DOUBLE) :: detlog + integer(C_INT) :: detsign + integer(C_INT) :: flag + integer(C_INT) :: matrix_rank + integer(C_INT) :: maxdepth + integer(C_INT) :: num_delay + integer(C_LONG) :: num_factor + integer(C_LONG) :: num_flops + integer(C_INT) :: num_neg + integer(C_INT) :: num_nodes + integer(C_INT) :: num_nothresh + integer(C_INT) :: num_perturbed + integer(C_INT) :: num_two + integer(C_INT) :: pool_size + integer(C_INT) :: stat + real(C_DOUBLE) :: usmall + end type ma86_info +contains + subroutine copy_control_in(ccontrol, fcontrol, f_arrays) + type(ma86_control), intent(in) :: ccontrol + type(f_ma86_control), intent(out) :: fcontrol + logical, intent(out) :: f_arrays + + f_arrays = (ccontrol%f_arrays .ne. 0) + fcontrol%diagnostics_level = ccontrol%diagnostics_level + fcontrol%unit_diagnostics = ccontrol%unit_diagnostics + fcontrol%unit_error = ccontrol%unit_error + fcontrol%unit_warning = ccontrol%unit_warning + fcontrol%nemin = ccontrol%nemin + fcontrol%nb = ccontrol%nb + fcontrol%action = (ccontrol%action .ne. 0) + fcontrol%nbi = ccontrol%nbi + fcontrol%pool_size = ccontrol%pool_size + fcontrol%small = ccontrol%small + fcontrol%static = ccontrol%static + fcontrol%u = ccontrol%u + fcontrol%umin = ccontrol%umin + fcontrol%scaling = ccontrol%scaling + end subroutine copy_control_in + + subroutine copy_info_out(finfo, cinfo) + type(f_ma86_info), intent(in) :: finfo + type(ma86_info), intent(out) :: cinfo + + cinfo%detlog = finfo%detlog + cinfo%detsign = finfo%detsign + cinfo%flag = finfo%flag + cinfo%matrix_rank = finfo%matrix_rank + cinfo%maxdepth = finfo%maxdepth + cinfo%num_delay = finfo%num_delay + cinfo%num_factor = finfo%num_factor + cinfo%num_flops = finfo%num_flops + cinfo%num_neg = finfo%num_neg + cinfo%num_nodes = finfo%num_nodes + cinfo%num_nothresh = finfo%num_nothresh + cinfo%num_perturbed = finfo%num_perturbed + cinfo%num_two = finfo%num_two + cinfo%pool_size = finfo%pool_size + cinfo%stat = finfo%stat + cinfo%usmall = finfo%usmall + end subroutine copy_info_out +end module hsl_ma86d_ciface + +subroutine ma86_default_control_d(ccontrol) bind(C) + use hsl_ma86d_ciface + implicit none + + type(ma86_control), intent(out) :: ccontrol + + type(f_ma86_control) :: fcontrol + + ccontrol%f_arrays = 0 ! false + ccontrol%diagnostics_level = fcontrol%diagnostics_level + ccontrol%unit_diagnostics = fcontrol%unit_diagnostics + ccontrol%unit_error = fcontrol%unit_error + ccontrol%unit_warning = fcontrol%unit_warning + ccontrol%nemin = fcontrol%nemin + ccontrol%nb = fcontrol%nb + if( fcontrol%action ) then + ccontrol%action = 1 ! true + else + ccontrol%action = 0 ! false + endif + ccontrol%nbi = fcontrol%nbi + ccontrol%pool_size = fcontrol%pool_size + ccontrol%small = fcontrol%small + ccontrol%static = fcontrol%static + ccontrol%u = fcontrol%u + ccontrol%umin = fcontrol%umin + ccontrol%scaling = fcontrol%scaling +end subroutine ma86_default_control_d + +subroutine ma86_analyse_d(n, cptr, crow, corder, ckeep, ccontrol, cinfo) bind(C) + use hsl_ma86d_ciface + implicit none + + integer(C_INT), value, intent(in) :: n + type(C_PTR), value, intent(in) :: cptr + type(C_PTR), value, intent(in) :: crow + type(C_PTR), value, intent(in) :: corder + type(C_PTR), intent(inout) :: ckeep + type(ma86_control), intent(in) :: ccontrol + type(ma86_info), intent(inout) :: cinfo + + integer(C_INT), dimension(:), pointer :: fptr + integer, dimension(:), allocatable, target :: fptr_alloc + integer(C_INT), dimension(:), pointer :: frow + integer, dimension(:), allocatable, target :: frow_alloc + integer(C_INT), dimension(:), pointer :: forder + integer, dimension(:), allocatable, target :: forder_alloc + type(f_ma86_keep), pointer :: fkeep + type(f_ma86_control) :: fcontrol + type(f_ma86_info) :: finfo + logical :: f_arrays + + ! Copy data in and associate pointers correctly + call copy_control_in(ccontrol, fcontrol, f_arrays) + call C_F_POINTER(cptr, fptr, shape = (/ n+1 /) ) + if(.not.f_arrays) then + allocate(fptr_alloc(n+1)) + fptr_alloc(:) = fptr(:) + 1 + fptr => fptr_alloc + endif + call C_F_POINTER(crow, frow, shape = (/ fptr(n+1)-1 /) ) + if(.not.f_arrays) then + allocate(frow_alloc(fptr_alloc(n+1)-1)) + frow_alloc(:) = frow(:) + 1 + frow => frow_alloc + endif + call C_F_POINTER(corder, forder, shape = (/ n /) ) + if(.not.f_arrays) then + allocate(forder_alloc(n)) + forder_alloc(:) = forder(:) + 1 + forder => forder_alloc + endif + + ! Allocate space to store keep and arrange a C pointer to it + allocate(fkeep) + ckeep = c_loc(fkeep) + + ! Call the Fortran routine + call f_ma86_analyse(n, fptr, frow, forder, fkeep, fcontrol, finfo) + + ! Copy information out to C structure + call copy_info_out(finfo, cinfo) + + ! Copy order out if using C indexing + if(.not.f_arrays) then + call C_F_POINTER(corder, forder, shape = (/ n /) ) + forder(:) = forder_alloc(:) - 1 + endif +end subroutine ma86_analyse_d + +subroutine ma86_factor_d(n, cptr, crow, cval, corder, ckeep, ccontrol, cinfo, & + cscale) bind(C) + use hsl_ma86d_ciface + implicit none + + integer(C_INT), value, intent(in) :: n + type(C_PTR), value, intent(in) :: cptr + type(C_PTR), value, intent(in) :: crow + type(C_PTR), value, intent(in) :: cval + type(C_PTR), value, intent(in) :: corder + type(C_PTR), intent(inout) :: ckeep + type(ma86_control), intent(in) :: ccontrol + type(ma86_info), intent(inout) :: cinfo + type(C_PTR), value, intent(in) :: cscale + + integer(C_INT), dimension(:), pointer :: fptr + integer, dimension(:), allocatable, target :: fptr_alloc + integer(C_INT), dimension(:), pointer :: frow + integer, dimension(:), allocatable, target :: frow_alloc + real(C_DOUBLE), dimension(:), pointer :: fval + integer(C_INT), dimension(:), pointer :: forder + integer, dimension(:), allocatable, target :: forder_alloc + type(f_ma86_keep), pointer :: fkeep + type(f_ma86_control) :: fcontrol + type(f_ma86_info) :: finfo + logical :: f_arrays + real(C_DOUBLE), dimension(:), pointer :: fscale + + ! Copy data in and associate pointers correctly + call copy_control_in(ccontrol, fcontrol, f_arrays) + call C_F_POINTER(cptr, fptr, shape = (/ n+1 /) ) + if(.not.f_arrays) then + allocate(fptr_alloc(n+1)) + fptr_alloc(:) = fptr(:) + 1 + fptr => fptr_alloc + endif + call C_F_POINTER(crow, frow, shape = (/ fptr(n+1)-1 /) ) + if(.not.f_arrays) then + allocate(frow_alloc(fptr_alloc(n+1)-1)) + frow_alloc(:) = frow(:) + 1 + frow => frow_alloc + endif + call C_F_POINTER(cval, fval, shape = (/ fptr(n+1) /) ) + call C_F_POINTER(corder, forder, shape = (/ n /) ) + if(.not.f_arrays) then + allocate(forder_alloc(n)) + forder_alloc(:) = forder(:) + 1 + forder => forder_alloc + endif + call C_F_POINTER(ckeep, fkeep) + if(C_ASSOCIATED(cscale)) then + call C_F_POINTER(cscale, fscale, shape = (/ n /) ) + else + nullify(fscale) + endif + + ! Call the Fortran routine + if(associated(fscale)) then + call f_ma86_factor(n, fptr, frow, fval, forder, fkeep, fcontrol, finfo, & + scale=fscale) + else + call f_ma86_factor(n, fptr, frow, fval, forder, fkeep, fcontrol, finfo) + endif + + ! Copy information out to C structure + call copy_info_out(finfo, cinfo) +end subroutine ma86_factor_d + +subroutine ma86_factor_solve_d(n, cptr, crow, cval, corder, ckeep, ccontrol, & + cinfo, nrhs, ldx, cx, cscale) bind(C) + use hsl_ma86d_ciface + implicit none + + integer(C_INT), value, intent(in) :: n + type(C_PTR), value, intent(in) :: cptr + type(C_PTR), value, intent(in) :: crow + type(C_PTR), value, intent(in) :: cval + type(C_PTR), value, intent(in) :: corder + type(C_PTR), intent(inout) :: ckeep + type(ma86_control), intent(in) :: ccontrol + type(ma86_info), intent(inout) :: cinfo + integer(C_INT), value, intent(in) :: nrhs + integer(C_INT), value, intent(in) :: ldx + type(C_PTR), value, intent(in) :: cx + type(C_PTR), value, intent(in) :: cscale + + integer(C_INT), dimension(:), pointer :: fptr + integer, dimension(:), allocatable, target :: fptr_alloc + integer(C_INT), dimension(:), pointer :: frow + integer, dimension(:), allocatable, target :: frow_alloc + real(C_DOUBLE), dimension(:), pointer :: fval + integer(C_INT), dimension(:), pointer :: forder + integer, dimension(:), allocatable, target :: forder_alloc + real(C_DOUBLE), dimension(:,:), pointer :: fx + type(f_ma86_keep), pointer :: fkeep + type(f_ma86_control) :: fcontrol + type(f_ma86_info) :: finfo + logical :: f_arrays + real(C_DOUBLE), dimension(:), pointer :: fscale + + ! Copy data in and associate pointers correctly + call copy_control_in(ccontrol, fcontrol, f_arrays) + call C_F_POINTER(cptr, fptr, shape = (/ n+1 /) ) + if(.not.f_arrays) then + allocate(fptr_alloc(n+1)) + fptr_alloc(:) = fptr(:) + 1 + fptr => fptr_alloc + endif + call C_F_POINTER(crow, frow, shape = (/ fptr(n+1)-1 /) ) + if(.not.f_arrays) then + allocate(frow_alloc(fptr_alloc(n+1)-1)) + frow_alloc(:) = frow(:) + 1 + frow => frow_alloc + endif + call C_F_POINTER(cval, fval, shape = (/ fptr(n+1)-1 /) ) + call C_F_POINTER(corder, forder, shape = (/ n /) ) + if(.not.f_arrays) then + allocate(forder_alloc(n)) + forder_alloc(:) = forder(:) + 1 + forder => forder_alloc + endif + call C_F_POINTER(ckeep, fkeep) + call C_F_POINTER(cx, fx, shape = (/ ldx, nrhs /)) + if(C_ASSOCIATED(cscale)) then + call C_F_POINTER(cscale, fscale, shape = (/ n /) ) + else + nullify(fscale) + endif + + ! Call the Fortran routine + if(associated(fscale)) then + call f_ma86_factor_solve(n, fptr, frow, fval, forder, fkeep, & + fcontrol, finfo, nrhs, ldx, fx, scale=fscale) + else + call f_ma86_factor_solve(n, fptr, frow, fval, forder, fkeep, & + fcontrol, finfo, nrhs, ldx, fx) + endif + + ! Copy information out to C structure + call copy_info_out(finfo, cinfo) +end subroutine ma86_factor_solve_d + +subroutine ma86_solve_d(job, nrhs, ldx, cx, corder, ckeep, ccontrol, cinfo, & + cscale) bind(C) + use hsl_ma86d_ciface + implicit none + + integer(C_INT), value, intent(in) :: job + integer(C_INT), value, intent(in) :: nrhs + integer(C_INT), value, intent(in) :: ldx + type(C_PTR), value, intent(in) :: cx + type(C_PTR), value, intent(in) :: corder + type(C_PTR), intent(inout) :: ckeep + type(ma86_control), intent(in) :: ccontrol + type(ma86_info), intent(inout) :: cinfo + type(C_PTR), value, intent(in) :: cscale ! deprecated, ignored + + integer :: n + real(C_DOUBLE), dimension(:,:), pointer :: fx + integer(C_INT), dimension(:), pointer :: forder + integer, dimension(:), allocatable, target :: forder_alloc + type(f_ma86_keep), pointer :: fkeep + type(f_ma86_control) :: fcontrol + type(f_ma86_info) :: finfo + logical :: f_arrays + + ! Copy data in and associate pointers correctly + call copy_control_in(ccontrol, fcontrol, f_arrays) + call C_F_POINTER(ckeep, fkeep) + call C_F_POINTER(cx, fx, shape = (/ nrhs, ldx /) ) + n = f_ma86_get_n__(fkeep) + call C_F_POINTER(corder, forder, shape = (/ n /) ) + if(.not.f_arrays) then + allocate(forder_alloc(n)) + forder_alloc(:) = forder(:) + 1 + forder => forder_alloc + endif + ! Note: scale is ignored - it has been removed from Fortran version + + ! Call the Fortran routine + call f_ma86_solve(nrhs, ldx, fx, forder, fkeep, fcontrol, finfo, job=job) + + ! Copy information out to C structure + call copy_info_out(finfo, cinfo) +end subroutine ma86_solve_d + +subroutine ma86_finalise_d(ckeep, ccontrol) bind(C) + use hsl_ma86d_ciface + implicit none + + type(C_PTR), intent(inout) :: ckeep + type(ma86_control), intent(in) :: ccontrol + + type(f_ma86_keep), pointer :: fkeep + type(f_ma86_control) :: fcontrol + logical :: f_arrays + + ! Copy data in and associate pointers correctly + call copy_control_in(ccontrol, fcontrol, f_arrays) + call C_F_POINTER(ckeep, fkeep) + + ! Call the Fortran routine + call f_ma86_finalise(fkeep, fcontrol) + + ! Free memory + deallocate(fkeep) + ckeep = C_NULL_PTR +end subroutine ma86_finalise_d diff --git a/coinhsl/hsl_ma86/C/hsl_ma86d_ciface.lo b/coinhsl/hsl_ma86/C/hsl_ma86d_ciface.lo new file mode 100644 index 0000000..88bfe52 --- /dev/null +++ b/coinhsl/hsl_ma86/C/hsl_ma86d_ciface.lo @@ -0,0 +1,12 @@ +# coinhsl/hsl_ma86/C/hsl_ma86d_ciface.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4.6 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/hsl_ma86d_ciface.o' + +# Name of the non-PIC object +non_pic_object=none + diff --git a/coinhsl/hsl_ma86/hsl_ma86d.f90 b/coinhsl/hsl_ma86/hsl_ma86d.f90 new file mode 100644 index 0000000..7b6858a --- /dev/null +++ b/coinhsl/hsl_ma86/hsl_ma86d.f90 @@ -0,0 +1,6495 @@ +! COPYRIGHT (c) 2010 Science and Technology Facilities Council +! Original date 13 December 2010, Version 1.0.0 +! +! Written by: Jonathan Hogg and Jennifer Scott +! +! Version 1.5.0 +! See ChangeLog for history +! + +! +! To convert from double: +! * Change wp +! * Change _double +! * Change BLAS calls: dgemv, dgemm, dtrsm, dtrsv, dcopy, daxpy, dswap +! * Change HSL calls: mc77id, mc77ad, mc64wd +! * Change control%u default to 0.1 +! + +module hsl_MA86_double +!$ use omp_lib + use hsl_mc78_integer + use hsl_mc34_double + implicit none + + private + public :: ma86_keep, ma86_control, ma86_info + public :: ma86_analyse, ma86_factor, ma86_factor_solve, ma86_solve, & + ma86_finalise + ! Following line contains symbols that should be used by HSL interfaces only + public :: ma86_get_n__ + +!************************************************* + ! Parameters (all private) + ! Data kinds + integer, parameter :: wp = kind(0d0) + integer, parameter :: long = selected_int_kind(18) + + ! Numerical constants + real(wp), parameter :: one = 1.0_wp + real(wp), parameter :: zero = 0.0_wp + + ! Default values + integer, parameter :: nemin_default = 32 + ! node amalgamation parameter + integer, parameter :: nb_default = 256 + ! Block size with dense kernel + integer, parameter :: nbi_default = 16 ! Default inner block size. + integer, parameter :: pool_default = 25000 + ! size of task pool + + ! Symbolic constants + ! These flag the different tasks within factor and solve + integer, parameter :: TASK_DONE = -1 + integer, parameter :: TASK_NONE = 0 + integer, parameter :: TASK_FACTORIZE_COLUMN = 2 + integer, parameter :: TASK_UPDATE_INTERNAL = 3 + integer, parameter :: TASK_UPDATE_BETWEEN = 4 + integer, parameter :: TASK_SLV_FSLV = 6 + ! Fwds solve on diag block + integer, parameter :: TASK_SLV_BSLV = 8 + ! Bwds solve on diag block + + ! Types of solve job + integer, parameter :: SOLVE_JOB_ALL = 0 + integer, parameter :: SOLVE_JOB_FWD = 1 + integer, parameter :: SOLVE_JOB_D = 2 + integer, parameter :: SOLVE_JOB_BWD = 3 + integer, parameter :: SOLVE_JOB_D_AND_BWD = 4 + + ! How processors share cache Example + integer, parameter :: CACHE_COMPACT = 1 + ! [0,1], [2,3], [4,5], [6,7] + integer, parameter :: CACHE_SCATTER = 2 + ! [0,4]. [1,5], [2,6], [3,7] + integer, parameter :: CACHE_IDENTITY = 3 + ! 0, 1, 2, 3, 4, 5, 6, 7 + + ! Error flags + integer, parameter :: MA86_SUCCESS = 0 + integer, parameter :: MA86_ERROR_ALLOCATION = -1 + integer, parameter :: MA86_ERROR_ORDER = -2 + integer, parameter :: MA86_ERROR_SINGULAR = -3 + integer, parameter :: MA86_ERROR_X_SIZE = -4 + integer, parameter :: MA86_ERROR_INFINITY = -5 + integer, parameter :: MA86_ERROR_JOB_OOR = -6 + integer, parameter :: MA86_ERROR_STATIC_SMALL = -7 + !integer, parameter :: MA86_ERROR_NO_SCALE = -9 + integer, parameter :: MA86_ERROR_UNKNOWN = -99 + + ! warning flags + integer, parameter :: MA86_WARNING_POOL_SMALL = 1 + integer, parameter :: MA86_WARNING_SINGULAR = 2 + integer, parameter :: MA86_WARNING_POOL_SING = 3 + + !************************************************* + + interface MA86_analyse + module procedure MA86_analyse_double + end interface + + interface MA86_factor + module procedure MA86_factor_double + end interface + + interface MA86_factor_solve + module procedure MA86_factor_solve_one_double, & + MA86_factor_solve_mult_double + end interface + + interface MA86_solve + module procedure MA86_solve_one_double, & + MA86_solve_mult_double + end interface + + interface MA86_finalise + module procedure MA86_finalise_double + end interface + + interface MA86_get_n__ + module procedure ma86_get_n_double + end interface MA86_get_n__ + + !************************************************* + + ! Data type for storing information for each block (BLK) + ! The blocks are numbered 1,2,..., keep%final_blk + type block_type + ! Static info, which is set in ma86_analayse + integer :: bcol ! block column that blk belongs to + integer :: blkm ! height of block (number of rows in blk) + integer :: blkn ! width of block (number of columns in blk) + integer(long) :: dblk ! id of the block on the diagonal within the + ! block column to which blk belongs + integer :: dep_initial ! initial dependency count for block, + ! In indef case, countdown occurs in bcol on a block column basis + integer(long) :: id ! The block identitifier (ie, its number blk) + integer(long) :: last_blk ! id of the last block within the + ! block column to which blk belongs + integer :: node ! node to which blk belongs + integer :: sa ! posn of the first entry of the + ! block blk within the array that holds the block column of L + ! that blk belongs to. + + ! Non-static info + logical :: touched ! is this the first time block is touched + integer :: sa_new ! posn of the first entry of the + ! block blk within the array that holds the block column of L + ! that blk belongs to, after delays have been allowed for. + ! This is computed during factorize. +!$ integer(omp_lock_kind) :: lock ! Lock for altering dep +!$ integer(omp_lock_kind) :: alock ! Lock for altering values in keep%lfact + ! for this block. + ! Note: locks initialised in ma86_analyse and destroyed + ! in ma86_finalise + end type block_type + + !************************************************* + + ! Derived type for holding data for each node. + ! This information is set up by ma86_analyse once the assembly tree + ! has been constructed. + type node_type + integer(long) :: blk_sa ! identifier of the first block in node + integer(long) :: blk_en ! identifier of the last block in node + + integer :: nb ! Block size for nodal matrix + ! If number of cols nc in nodal matrix is less than control%nb but + ! number of rows is large, the block size for the node is taken as + ! control%nb**2/nc, rounded up to a multiple of 8. The aim is for + ! the numbers of entries in the blocks to be similar to those in the + ! normal case. + + integer :: sa ! index (in pivotal order) of the first column of the node + integer :: en ! index (in pivotal order) of the last column of the node + + integer, allocatable :: index(:) ! holds the permuted variable + ! list for node. They are sorted into increasing order. + ! index is set up by ma86_analyse + + integer :: nchild ! number of children node has in assembly tree + integer, allocatable :: child(:) ! holds children of node + integer :: num_delay = 0 ! number of delayed eliminations to + ! pass to parent + integer :: parent ! Parent of node in assembly tree + integer :: least_desc ! Least descendant in assembly tree + + ! next pointer in linked list of delay sources + integer :: delay_next + end type node_type + + !************************************************* + + ! This type stores overall values that this thread has encountered. It + ! must be combined across all threads to be meaningful. + type thread_info + integer :: num_delay = 0 ! number of delayed pivots + integer(long) :: num_flops = 0 ! number of floating point operations + integer(long) :: num_factor = 0 ! number of entries in factors + integer :: num_neg = 0 ! number of negative pivots in the real + ! or complex Hermitian case. + integer :: num_nothresh = 0 ! number of pivots not satisfying + ! pivot threshold test with control%u + integer :: num_perturbed = 0 ! number of perturbed pivots + integer :: num_two = 0 ! number of 2x2 pivots + integer :: num_zero_pivots = 0 ! number of zero pivots + real(wp) :: usmall = -one ! Set to zero if num_perturbed > 0. + ! Otherwise, if q < p, it holds the value of cntl%umin that + ! would have led to a greater value of q and if q = p, it holds + ! the smallest relative pivot value of the chosen pivots. + + real(wp) :: detlog = zero ! logarithm of abs value of det A + integer :: detsign = 1 ! in the real or complex Hermitian case, + ! holds sign of determinant or 0 if A is singular + end type thread_info + + + !************************************************* + + ! Data type that represents a single block column in L and corresponding + ! entries in the indefinite case (allocated by ma86_analyse) + type lfactor + integer :: blkn_new ! number of columns in block column incl delays + integer(long) :: dblk ! identifier of diagonal block in block col. + integer :: dep ! dependency count + integer :: local ! local index of block column within node. + integer :: nelim ! number of eliminations performed in block column. + integer :: nrow ! number of rows in block column at start of factorize + ! ie number of rows in lcol. Number of rows after delays is + ! nrow + num_delay (num_delay = blkn_new - blkn, where blkn is no. + ! cols in lcol and can be found from blocks using dblk) + integer :: col ! start position of bcol in rhs vector for solve + + ! Linked list of columns to draw delays from + integer :: delay_head + + integer, allocatable :: index_new(:) ! holds index list within + ! factorize (will include delays) +!$ integer(omp_lock_kind) :: lock ! lock so only one thread at a time + ! can alter the block column + real(wp), dimension(:), allocatable :: lcol ! holds block column + real(wp) , dimension(:), allocatable :: d ! holds block of D. + end type lfactor + + !************************************************* + + ! Data type for storing mapping from user's matrix values into + ! block columns of L + type lmap_type + integer(long) :: len_map ! length of map + integer(long), allocatable :: map(:,:) ! holds map from user's val + ! array into lfact(:)%lcol values as follows: + ! lcol( map(1,i) ) += val( map(2,i) ) i = 1:lmap + ! map is set at end of analyse phase using subroutines make_map + ! and lcol_map, and is used in factorization phase by blk_col_add_a + end type lmap_type + + !************************************************* + + ! Data type that contains counts and locks for the solve + ! (one per a block column) + type slv_count_type + integer :: dep + integer :: dblk +!$ integer(kind=omp_lock_kind) :: lock + end type slv_count_type + + !************************************************* + + ! Data type for user controls + type MA86_control + + logical :: action = .true. ! Do we keep + ! going even if matrix is singular (abort if .false.) + integer :: diagnostics_level = 0 ! Controls diagnostic printing. + ! Possible values are: + ! < 0: no printing. + ! 0: error and warning messages only. + ! 1: as 0 plus basic diagnostic printing. + ! 2: as 1 plus some more detailed diagnostic messages. + ! 3: as 2 plus all entries of user-supplied arrays. + integer :: nb = nb_default ! Controls the size of the + ! blocks used within each node (used to set nb within node_type) + integer :: nbi = nbi_default ! Inner block size for use with ma64 + integer :: nemin = nemin_default + ! Node amalgamation parameter. A child node is merged with its parent + ! if they both involve fewer than nemin eliminations. + integer :: pool_size = pool_default ! Size of task pool arrays + real(wp) :: small = 1e-20 ! Pivots less than small are + ! treated as zero + real(wp) :: static = zero ! Control static pivoting + real(wp) :: u = 0.01 ! Pivot tolerance + real(wp) :: umin = one ! Minimum pivot tolerance + integer :: unit_diagnostics = 6 ! unit for diagnostic messages + ! Printing is suppressed if unit_diagnostics < 0. + integer :: unit_error = 6 ! unit for error messages + ! Printing is suppressed if unit_error < 0. + integer :: unit_warning = 6 ! unit for warning messages + ! Printing is suppressed if unit_warning < 0. + integer :: scaling = 0 ! scaling routine to use + ! 0 = none or user defined (user iff scale is present) + ! 1 = mc64 + ! 2 = mc77 + + !!!! Undocumented + !** integer :: time_out = -1 ! If >= 0 some internal timings + !** are printed on unit time_out. For HSL 2011 these are commented + !** using comments !** so easy to search and uncomment + !%%% integer :: unit_log = -1 ! For profiling log output + !%%% commented out for HSL 2011 using !%%% + !%%% integer :: log_level = 1 ! Level of profiling information + !!! Note: commenting out use of time_out and unit_log means + !%%% commented out for HSL 2011 using !%%% + + !!! As a result, some subroutines have unused dummy arguments that + !!! give warnings at compile time. We have not removed them + !!! since uncommenting the above controls would then be more tedious. + + integer :: cache_tq_sz = 100 ! Size of local task stack + integer :: cache_layout = CACHE_COMPACT ! Proc <=> cache mapping + integer :: cache_cores = 2 ! Number of cores per cache + integer :: min_width_blas = 8 ! Minimum width of source block + ! before we use an indirect update_between + + end type MA86_control + + !************************************************* + + ! data type for returning information to user. + type MA86_info + real(wp) :: detlog = zero ! Holds logarithm of abs det A (or 0) + integer :: detsign = 0 ! Holds sign of determinant (+/-1 or 0) + integer :: flag = 0 ! Error return flag (0 on success) + integer :: matrix_rank = 0 ! Rank of matrix + integer :: maxdepth = 0 ! Maximum depth of the tree. + integer :: num_delay = 0 ! Number of delayed pivots + integer(long) :: num_factor = 0_long ! Number of entries in the factor. + integer(long) :: num_flops = 0_long ! Number of flops for factor. + integer :: num_neg = 0 ! Number of negative pivots + integer :: num_nodes = 0 ! Number of nodes + integer :: num_nothresh = 0 ! Number of pivots not satisfying u + integer :: num_perturbed = 0 ! Number of perturbed pivots + integer :: num_two = 0 ! Number of 2x2 pivots + integer :: pool_size = pool_default ! Maximum size of task pool used + integer :: stat = 0 ! STAT value on error return -1. + real(wp) :: usmall = zero ! smallest threshold parameter used + end type MA86_info + + !************************************************* + + ! Data type for communication between threads and routines + type ma86_keep + private + type(block_type), dimension(:), allocatable :: blocks ! block info + integer, dimension(:), allocatable :: flag_array ! allocated to + ! have size equal to the number of threads. For each thread, holds + ! error flag + integer(long) :: final_blk = 0 ! Number of blocks. Used for destroying + ! locks in finalise + type(ma86_info) :: info ! Holds copy of info + integer :: maxm ! holds largest block row dimension + integer :: maxn ! holds largest block col dimension + integer :: n ! Order of the system. + type(node_type), dimension(:), allocatable :: nodes ! nodal info + integer :: nbcol = 0 ! number of block columns in L + type(lfactor), dimension(:), allocatable :: lfact + ! holds block cols of L + type(lmap_type), dimension(:), allocatable :: lmap + ! holds mapping from matrix values into lfact + real(wp), dimension(:), allocatable :: scaling + end type ma86_keep + + !************************************************* + + ! Data type for a task + type dagtask + integer :: task_type ! One of TASK_FACTORIZE_COLUMN, ... + integer(long) :: dest ! id of the target (destination) block + integer(long) :: src1 ! + ! if task_type = TASK_UPDATE_INTERNAL, src1 holds the id of the first + ! source block + ! if task_type = TASK_UPDATE_BETWEEN, src1 holds the id of a block + ! in the block column of the source node that is used + ! in updating dest. + integer(long) :: src2 + ! if task_type = TASK_UPDATE_INTERNAL, src2 holds the id of the second + ! source block + ! (src1 and src2 are blocks belonging to the same block column + ! of the source node with src1 .le. src2) + ! src2 is not used by the other tasks + integer :: csrc(2) + integer :: rsrc(2) + ! for an UPDATE_BETWEEN task, we need to hold some additional + ! information, which locates the source blocks rsrc and csrc + ! within the source block col. + ! This info. is set up the subroutine add_between_updates + end type dagtask + + !************************************************* + + ! Data type for storing tasks we need to do. + ! Task pool is held as a collection of 4 stacks for different priorities + ! using the same space. + ! Each stack is a linked list with its head given by an element of prihead. + ! There are also local stacks for each cache. + + type taskstack + integer :: max_pool_size = 0 ! max. number of tasks that are in + ! the task pool at any one time during the factorization. + logical :: abort = .false. ! true if we have aborted + integer :: active ! Number of active threads + ! (number of tasks in execution) + type(dagtask), dimension(:,:), allocatable :: ctasks ! local task stacks. + ! allocated to have size (control%cache_tq_sz, ncache), where + ! ncache is number of caches + integer, dimension(:), allocatable :: cheads ! Heads for local stacks. + ! allocated to have size equal to number of caches +!$ integer(omp_lock_kind), dimension(:), allocatable :: clocks + ! Locks for local stacks. + integer :: freehead ! Holds the head of linked list of + ! entries in the task pool that are free +!$ integer(omp_lock_kind) :: lock ! lock so only one thread at a time + ! can read/alter the task pool + integer :: lowest_priority_value = huge(0) ! + ! lowest priority value of the tasks in the pool. + ! The priority value for each of the different types of task is + ! 1. factor Highest priority + ! 2. solve + ! 3. update_internal + ! 4. update_between Lowest priority + integer, dimension(:), allocatable :: next ! next task in linked list. + ! allocated to have size pool_size. Reallocated if initial setting + ! for pool_size found to be too small. + integer :: pool_size ! sizes of task pool arrays next and tasks. + ! Initialised to control%pool_size + integer :: prihead(4) ! Holds the heads of the linked lists for tasks + ! with priority values 1,2,3,4. + type(dagtask), dimension(:), allocatable :: tasks ! Holds tasks. + ! allocated to have size pool_size. Reallocated if initial setting + ! for pool_size found to be too small. + integer :: total ! Total number of tasks in pool +!** real, dimension(:), allocatable :: waiting ! Allocated to have size +!** ! equal to the number of threads. Used to hold times the threads spent +!** ! waiting if control%time_out >= 0 + + end type taskstack + +contains + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +! +! Analyse phase. +! The user inputs the pivot order and lower +! triangular parts of A. Structure is expanded. +! Supervariables are computed +! and then the assembly tree is constructed and the data structures +! required by the factorization are set up. +! There is no checking of the user's data. +! +subroutine MA86_analyse_double(n, ptr, row, order, keep, control, info) + integer, intent(in) :: n ! order of A + integer, intent(in) :: row(:) ! row indices of lower triangular part + integer, intent(in) :: ptr(:) ! col pointers for lower triangular part + integer, intent(inout), dimension(:) :: order + ! order(i) must hold position of i in the pivot sequence. + ! On exit, holds the pivot order to be used by MA86_factor. + ! For details of keep, control, info : see derived type descriptions + type(MA86_keep), intent(out) :: keep + type(MA86_control), intent(in) :: control + type(MA86_info), intent(inout) :: info + + ! Local arrays + integer, allocatable :: amap(:) ! map from user a to reordered a + integer, allocatable :: aptr(:) ! column pointers of expanded matrix + integer, allocatable :: arow(:) ! row pointers of expanded matrix + integer, allocatable :: iw(:) ! work array + integer, allocatable :: map(:) ! Allocated to have size n. + ! used in computing dependency counts. For each row k in + ! j-th block column of a node, map(k1) is set to j + integer, allocatable :: perm(:) ! inverse permutation. + ! perm(i) holds the variable that is i-th in the pivot sequence. + ! Also used for checking user-supplied permutation. + + ! Local scalars. + integer :: a_nb ! block size of anode + integer :: anode ! ancestoral node of snode in tree + integer(long) :: blk ! temporary variable for holding block number + integer :: blkn ! number of columns within block column + integer :: cptr ! pointer into rows of snode that correspond + ! to columns of an ancestor anode + integer :: cb ! index of block column within node + integer :: col_used ! used in computing number of cols in block col. + integer :: ci ! do loop variable. current block col. + integer(long) :: dblk ! diagonal block within block column + integer :: en ! holds keep%nodes(snode)%en + integer :: i ! temporary variable + integer :: j ! temporary variable + integer :: jj ! temporary variable + integer :: jb ! block index in anode + integer :: k + integer :: k1 ! temporary variable + integer :: l_nb ! set to block size of snode (keep%nodes(snode)%nb) + integer :: mp ! copy of control%unit_diagnostics + integer :: ne ! set to ptr(n+1) - 1 + integer :: nemin ! min. number of eliminations (see control%nemin) + integer :: node ! a node in tree + integer :: num_nodes ! number of nodes in tree + integer :: numcol ! number of cols in node (en-sa+1) + integer :: numrow ! number of rows in a block column + integer :: row_used ! used in computing number of rows in a block. + integer :: sa ! holds keep%nodes(snode)%sa + integer :: size_anode ! size(keep%nodes(anode)%index) + integer :: st ! stat parameter + integer :: sz ! number of blocks in a block column of node + integer :: swidth ! number of block columns in node +!**integer :: t_start, t_end, t_rate + + type(mc78_control) :: control78 + integer :: par + integer :: info78 + integer, dimension(:), allocatable :: sptr, sparent, rlist + integer(long), dimension(:), allocatable :: rptr + + ! Possible error returns: + ! MA86_ERROR_ALLOCATION Allocation error + ! MA86_ERROR_ORDER Error in order + + ! initialise + info%flag = 0 + info%num_factor = 0_long + info%num_flops = 0_long + info%num_nodes = 0 + info%maxdepth = 0 + info%stat = 0 + + keep%n = n + ne = ptr(n+1) - 1 + + ! Perform appropriate printing + mp = control%unit_diagnostics + if (control%diagnostics_level>=1 .and. mp>=0) then + write (mp,'(/a)') ' On entry to MA86_analyse:' + write (mp,'(a,i15)') ' control%diagnostics_level = ', & + control%diagnostics_level + write (mp,'(a,i15)') ' control%unit_diagnostics = ',mp + write (mp,'(a,i15)') ' control%unit_error = ',control%unit_error + write (mp,'(a,i15)') ' control%unit_warning = ',control%unit_warning + write (mp,'(a,i15)') ' control%nemin = ',control%nemin + write (mp,'(a,i15)') ' control%nb = ',control%nb + write (mp,'(a,i15)') ' n = ',n + end if + + if (control%diagnostics_level > 2 .and. mp>=0) then + + write (mp,'(a)') ' ptr = ' + write (mp,'(5i15)') ptr(1:n+1) + + write (mp,'(a)') ' row = ' + write (mp,'(5i15)') row(1:ne) + + ! Print out pivot order. + write (mp,'(a)') ' User-supplied elimination order :' + i = min(size(order),n) + write (mp,'(5i15)') order(1:i) + + else if (control%diagnostics_level==2 .and. mp>=0) then + + write (mp,'(a)') ' ptr(1:min(5,n+1)) = ' + write (mp,'(5i15)') ptr(1:min(5,n+1)) + + write (mp,'(a)') ' row(1:min(5,ne)) = ' + write (mp,'(5i15)') row(1:min(5,ne)) + + i = min(10,n) + i = min(size(order),i) + write (mp,'(a,2(/5i12))') & + ' User-supplied elimination order :', order(1:i) + if (i < n) write (mp,'(a)') ' . . . . . .' + + end if + + ! immediate return if n = 0 + if (n == 0) return + + ! expand the matrix + + ! allocate space for expanded matrix (held in aptr,arow) + allocate (arow(2*ne),aptr(n+3),iw(n+1),stat=st) + if (st /= 0) go to 490 + + arow(1:ne) = row(1:ne) + aptr(1:n+1) = ptr(1:n+1) + call mc34_expand(n, arow, aptr, iw) + + deallocate(iw,stat=st) + + nemin = control%nemin + ! Check nemin (a node is merged with its parent if both involve + ! fewer than nemin eliminations). If out of range, use the default + if (nemin < 1) nemin = nemin_default + + ! Check the user-supplied array order and set the inverse in perm. + if (size(order).lt.n) then + info%flag = MA86_ERROR_ORDER + call MA86_print_flag(info%flag, control, context='MA86_analyse') + go to 500 + end if + + deallocate (perm,stat=st) + allocate (perm(n),stat=st) + if (st /= 0) go to 490 + perm(:) = 0 + k1 = 0 + do i = 1, n + jj = order(i) + if (jj < 1 .or. jj > n) exit + if (perm(jj) /= 0) exit ! Duplicate found + perm(jj) = i + end do + if (i-1 /= n) then + info%flag = MA86_ERROR_ORDER + call MA86_print_flag(info%flag, control, context='MA86_analyse') + go to 500 + end if + + control78%nemin = nemin + control78%sort = .true. + control78%lopt = .true. + call mc78_analyse(n, aptr, arow, order, num_nodes, & + sptr, sparent, rptr, rlist, control78, info78, nfact=info%num_factor, & + nflops=info%num_flops, stat=st) + select case (info78) + case(0) + ! success, do nothing + case(-1) + ! allocation error + goto 490 + case(1) + ! symbolically singular + if(control%action) then + ! issue warning and continue + info%flag = MA86_WARNING_SINGULAR + else + ! abort with error + info%flag = MA86_ERROR_SINGULAR + goto 500 + endif + case default + ! panic + info%flag = MA86_ERROR_UNKNOWN + goto 500 + end select + + info%num_nodes = num_nodes + !************************************** + ! Set up nodal data structures + ! For each node, hold data in keep%nodes(node) + deallocate(keep%nodes, stat=st) + + allocate(keep%nodes(-1:num_nodes),stat=st) + if (st /= 0) go to 490 + + keep%nodes(0)%blk_en = 0 + keep%nodes(1)%blk_sa = 1 + keep%nodes(1)%sa = 1 + + ! loop over nodes + keep%nodes(:)%nchild = 0 + do node = 1, num_nodes + keep%nodes(node)%sa = sptr(node) + keep%nodes(node)%en = sptr(node+1)-1 + + par = sparent(node) + keep%nodes(node)%parent = par + if(par .le. num_nodes) then + keep%nodes(par)%nchild = keep%nodes(par)%nchild + 1 + else + keep%nodes(node)%parent = -1 + endif + + ! determine and record the block size for node + ! note we are careful in case l_nb**2 overflows (in fact 1+l_nb must + ! not overflow at the end), and limit the answer to huge(l_nb)/2 + l_nb = control%nb + if (l_nb < 1) l_nb = nb_default + l_nb = min(huge(l_nb)/2_long, & + (l_nb**2_long) / min(sptr(node+1)-sptr(node), l_nb) ) + l_nb = (l_nb-1) / 8 + 1 + l_nb = 8 * l_nb + keep%nodes(node)%nb = l_nb + + ! Copy row list into keep%nodes + allocate(keep%nodes(node)%index(rptr(node+1)-rptr(node)),stat=st) + if (st /= 0) go to 490 + j = 1 + do i = rptr(node), rptr(node+1)-1 + keep%nodes(node)%index(j) = rlist(i) + j = j + 1 + end do + + ! Allocate space to store child nodes + allocate(keep%nodes(node)%child(keep%nodes(node)%nchild), stat=st) + if(st.ne.0) goto 490 + + ! Calculate number j of blocks in node and set + ! keep%nodes(node)%blk_en + sz = (rptr(node+1)-rptr(node) - 1) / l_nb + 1 + j = 0 + do i = keep%nodes(node)%sa, keep%nodes(node)%en, l_nb + j = j + sz + sz = sz - 1 + end do + keep%nodes(node)%blk_en = keep%nodes(node-1)%blk_en + j + + ! if node is not the final node, record first block + ! for the next node (node+1) + if (node < num_nodes) & + keep%nodes(node+1)%blk_sa = keep%nodes(node)%blk_en + 1 + end do + + ! set keep%final_blk to hold total number of blocks. + keep%final_blk = keep%nodes(num_nodes)%blk_en + + ! Add children to nodes, use sptr as a counter as it has fufilled its purpose + sptr(:) = 0 + do node = 1, num_nodes + par = sparent(node) + if(par.gt.num_nodes) cycle + sptr(par) = sptr(par) + 1 + keep%nodes(par)%child(sptr(par)) = node + end do + + ! Setup least descendants, to allow easy walk of subtrees + do node = -1, num_nodes + ! initialise least descendat to self + keep%nodes(node)%least_desc = node + end do + do node = 1, num_nodes + ! walk up tree from leaves. A parent's least descendant is either this + ! nodes least descendant (itself in case of a leaf), or its existing + ! one if that is smaller. + anode = keep%nodes(node)%parent + keep%nodes(anode)%least_desc = & + min(keep%nodes(node)%least_desc, keep%nodes(anode)%least_desc) + end do + + !************************************** + ! Fill out block information. + +!**call system_clock(t_start) + + deallocate(keep%blocks,stat=st) + allocate(keep%blocks(keep%final_blk),stat=st) + if(st.ne.0) go to 490 + + ! Loop over the nodes. Number the blocks in the first node + ! contiguously, then those in the second node, and so on. + ! Each node has a number of block columns; the blocks within + ! each block column are numbered contiguously. + ! Also add up the number of block columns and store largest block dimension. + blk = 1 + keep%nbcol = 0 + keep%maxm = 0 + keep%maxn = 0 + do node = 1, num_nodes + + sa = keep%nodes(node)%sa + en = keep%nodes(node)%en + numcol = en - sa + 1 + numrow = size(keep%nodes(node)%index) + + ! l_nb is the size of the blocks + l_nb = keep%nodes(node)%nb + + ! sz is number of blocks in the current block column + sz = (numrow - 1) / l_nb + 1 + + ! cb is the index of the block col. within node + cb = 0 + col_used = 0 + + ! Loop over the block columns in node. + do ci = sa, en, l_nb + k = 1 ! use k to hold position of block within block column + ! increment count of block columns + keep%nbcol = keep%nbcol + 1 + + cb = cb + 1 + + ! blkn is the number of columns in the block column. + ! For all but the last block col. blkn = l_nb. + blkn = min(l_nb, numcol-col_used) + col_used = col_used + blkn + + dblk = blk + + ! loop over the row blocks (that is, loop over blocks in block col) + row_used = 0 + do blk = dblk, dblk+sz-1 + ! store identity of block + keep%blocks(blk)%id = blk + + ! store number of rows in the block. + ! For all but the last block, the number of rows is l_nb + keep%blocks(blk)%blkm = min(l_nb, numrow-row_used) + row_used = row_used + keep%blocks(blk)%blkm + + ! store number of columns in the block. + keep%blocks(blk)%blkn = blkn + + keep%maxm = max(keep%maxm, keep%blocks(blk)%blkm) + keep%maxn = max(keep%maxn, keep%blocks(blk)%blkn) + + ! store position of the first entry of the block within the + ! block column of L + keep%blocks(blk)%sa = k + + ! store identity of diagonal block within current block column + keep%blocks(blk)%dblk = dblk + + ! store identity of last block within current block column + keep%blocks(blk)%last_blk = dblk + sz - 1 + + ! store node the blk belongs to + keep%blocks(blk)%node = node + + ! initialise dependency count + keep%blocks(blk)%dep_initial = cb + + ! store identity of block column that blk belongs to + keep%blocks(blk)%bcol = keep%nbcol + +!$ call omp_init_lock(keep%blocks(blk)%alock) + + ! increment k by number of entries in block + k = k + keep%blocks(blk)%blkm * keep%blocks(blk)%blkn + + end do + + ! Diagonal block has no dependency for factor(dblk) + keep%blocks(dblk)%dep_initial = cb - 1 + + ! decrement number of row blocks and rows in next block column + sz = sz - 1 + numrow = numrow - l_nb + end do + end do + +!**if(control%time_out.ge.0) then +!** call system_clock(t_end, t_rate) +!** write(control%time_out,"(a,es12.4)") "fill block took ", & +!** (t_end - t_start) / real(t_rate) +!**end if + + ! + ! Compute dependency counts + ! Note: This might be more efficient if implemented in left-looking + ! (all descendants) rather than right-looking (all ancestors) fashion. + ! +!**call system_clock(t_start) + allocate (map(n),stat=st) + if(st.ne.0) go to 490 + + ! loop over nodes + ! FIXME: this loop can be particuarly expensive, and should perhaps be + ! reordered so the map biulding loop only occurs once for each node. + ! (eg PARSEC/Ga41As41H72 is particularly bad) + do node = 1, num_nodes + ! anode is initially the parent of node. Later it will be the + ! grandparent, then great grandparent as we move up the tree to the root + anode = keep%nodes(node)%parent + ! numcol is number of columns in node + numcol = keep%nodes(node)%en - keep%nodes(node)%sa + 1 + + ! initialise cptr + cptr = 1 + numcol + + ! set swidth to number of block columns in node + l_nb = keep%nodes(node)%nb + swidth = (numcol-1)/l_nb + 1 + + ! loop over ancestors of node + do while(anode.gt.0) + ! if we have finished with node, move to next node + if(cptr.gt.size(keep%nodes(node)%index)) exit + + ! If we have skipped an anode (eg if its only a parent because of + ! other nodes in the subtree) we skip the current anode + if(keep%nodes(node)%index(cptr).gt.keep%nodes(anode)%en) then + anode = keep%nodes(anode)%parent + cycle + endif + + ! Build a map of anode's blocks. + ! Within the matrix for anode, the block columns are numbered + ! 1,2,3... For each row k1 in jb-th block column, + ! map(k1) is set to jb. + + a_nb = keep%nodes(anode)%nb + jb = 1 ! Block + ! loop over the block columns in anode + size_anode = size(keep%nodes(anode)%index) + do i = 1, size_anode, a_nb + ! loop over the rows in the block column + do k = i, min(i+a_nb-1, size_anode) + k1 = keep%nodes(anode)%index(k) + map(k1) = jb + end do + jb = jb + 1 + end do + !print *, " map = ", map + + ! Loop over affected block columns + call calc_dep(cptr, node, anode, keep%nodes, keep%blocks, & + swidth, map) + + ! Move up the tree to the parent of anode + anode = keep%nodes(anode)%parent + end do + end do + + allocate(amap(ptr(n+1)-1), keep%lmap(keep%nbcol), stat=st) + if(st.ne.0) goto 490 + ! The output is keep%lmap, which holds mapping from user's matrix values + ! into the block columns of the matrix factor + call make_map(n, order, ptr, row, aptr, arow, amap) + call lcol_map(aptr, arow, num_nodes, keep%nodes, keep%blocks, & + keep%lmap, map, amap, st) + if(st.ne.0) goto 490 + +!**if(control%time_out.ge.0) then +!** call system_clock(t_end) +!** write(control%time_out,"(a,es12.4)") & +!** "calculating initial dependencies took ", & +!** (t_end - t_start) / real(t_rate) +!**end if + + if (mp < 0) go to 500 + + if (control%diagnostics_level >= 1) then + write (mp,'(/a)') ' Leaving MA86_analyse with:' + write (mp,'(a,i15)') ' flag = ',info%flag + write (mp,'(a,i15)') ' maxdepth = ',info%maxdepth + write (mp,'(a,es15.5)') ' num_factor = ',real(info%num_factor) + write (mp,'(a,i15)') ' num_nodes = ',info%num_nodes + write (mp,'(a,i15)') ' stat = ',info%stat + end if + if (control%diagnostics_level>2) then + ! Print out pivot order. + write (mp,'(a)') ' On exit, elimination order :' + write (mp,'(5i15)') order(1:n) + else if (control%diagnostics_level==2) then + i = min(10,n) + write (mp,'(a,2(/5i12))') & + ' On exit, elimination order :', order(1:i) + if (i < n) write (mp,'(a)') ' . . . . . .' + end if + + go to 500 + + 490 info%flag = MA86_ERROR_ALLOCATION + info%stat = st + call MA86_print_flag(info%flag, control, context='MA86_analyse',st=st) + + 500 continue + ! before returning take copy of components of info set by MA86_analyse + keep%info%flag = info%flag + keep%info%num_factor = info%num_factor + keep%info%num_flops = info%num_flops + keep%info%num_nodes = info%num_nodes + keep%info%maxdepth = info%maxdepth + keep%info%stat = info%stat + + deallocate (arow,stat=st) + deallocate (aptr,stat=st) + deallocate (amap,stat=st) + deallocate (iw,stat=st) + deallocate (map,stat=st) + deallocate (perm,stat=st) + +end subroutine MA86_analyse_double + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +! Make a map from original A to reordered half matrix A +! The reordered half matrix's pattern is returned in nptr and nrow +subroutine make_map(n, perm, optr, orow, nptr, nrow, map) + integer, intent(in) :: n + integer, dimension(n), intent(in) :: perm + integer, dimension(n+1), intent(in) :: optr + integer, dimension(optr(n+1)-1), intent(in) :: orow + integer, dimension(n+3), intent(out) :: nptr ! extra space used for tricks + integer, dimension(optr(n+1)-1), intent(out) :: nrow + integer, dimension(optr(n+1)-1), intent(out) :: map + + integer :: i, k, l + integer(long) :: j + + nptr(:) = 0 + + ! Count number of entries in each column of new matrix (at offset 2) + do i = 1, n + l = perm(i) + do j = optr(i), optr(i+1)-1 + k = perm(orow(j)) + if(k=1 .and. mp>=0) then + write (mp,'(/a)') ' On entry to MA86_factor:' + write (mp,'(a,i15)') ' control%diagnostics_level = ', & + control%diagnostics_level + write (mp,'(a,i15)') ' control%unit_diagnostics = ',mp + write (mp,'(a,i15)') ' control%unit_error = ',control%unit_error + write (mp,'(a,i15)') ' control%unit_warning = ',control%unit_warning + write (mp,'(a,i15)') ' control%pool_size = ', & + control%pool_size + write (mp,'(a,i15)') ' control%nbi = ', control%nbi + write (mp,'(a,i15)') ' control%scaling = ', control%scaling + write (mp,'(a,es15.5)') ' control%small = ', control%small + write (mp,'(a,es15.5)') ' control%static = ', control%static + write (mp,'(a,i15)') ' n = ',n + end if + + if (control%diagnostics_level > 2 .and. mp>=0) then + + write (mp,'(a)') ' ptr = ' + write (mp,'(5i15)') ptr(1:n+1) + + write (mp,'(a)') ' row = ' + write (mp,'(5i15)') row(1:ne) + + write (mp,'(a)') ' val = ' + write (mp,'(4es14.6)') val(1:ne) + + write (mp,'(a)') ' Elimination order :' + write (mp,'(5i15)') order(1:n) + + else if (control%diagnostics_level==2 .and. mp>=0) then + + write (mp,'(a)') ' ptr(1:min(5,n+1)) = ' + write (mp,'(5i15)') ptr(1:min(5,n+1)) + + write (mp,'(a)') ' row(1:min(5,ne)) = ' + write (mp,'(5i15)') row(1:min(5,ne)) + + write (mp,'(a)') ' val(1:min(5,ne)) = ' + write (mp,'(4es14.6)') val(1:min(5,ne)) + + i = min(10,n) + write (mp,'(a,2(/5i12))') & + ' Elimination order :', order(1:i) + if (i < n) write (mp,'(a)') ' . . . . . .' + + end if + + if(control%static.lt.abs(control%small) .and. control%static.ne.zero) then + info%flag = MA86_ERROR_STATIC_SMALL + call MA86_print_flag(info%flag, control, context='MA86_factor') + return + endif + + ! immediate return if n = 0 + if (n == 0) return + + ! Handle scaling + deallocate(keep%scaling, stat=st) + if(control%scaling.gt.0 .or. present(scale)) then + allocate(keep%scaling(n), stat=st) + if(st.ne.0) then + info%flag = MA86_ERROR_ALLOCATION + info%stat = st + call MA86_print_flag(info%flag, control, & + context='MA86_factor', st=st) + return + endif + endif + select case (control%scaling) + case(:0) ! user supplied (scale present) or none (scale not present) + st = 0 + if(present(scale)) keep%scaling(1:n) = scale(1:n) + case(1) ! mc64 scaling + call mc64_scale(n, ptr, row, val, keep%scaling, control, info%flag, st) + if(info%flag.lt.0) return + if(present(scale)) scale(1:n) = keep%scaling(1:n) + case(2:) ! mc77 scaling + call mc77_scale(n, ptr, row, val, keep%scaling, st) + if(present(scale)) scale(1:n) = keep%scaling(1:n) + end select + if(st.ne.0) then + info%flag = MA86_ERROR_ALLOCATION + info%stat = st + call MA86_print_flag(info%flag, control, & + context='MA86_factor', st=st) + return + endif + + ! Ready to perform the sparse factorization +!**call system_clock(t_start) + + if(allocated(keep%scaling)) then + call factorize_indef(val, order, keep, control, info, & + 0, 0, soln, scale=keep%scaling) + else + call factorize_indef(val, order, keep, control, info, & + 0, 0, soln) + endif + + if (info%flag < 0) then + keep%info%flag = info%flag + return + end if + +!**if(control%time_out.ge.0) then +!** call system_clock(t_end, t_rate) +!** write(control%time_out,"(a,es12.4)") "factorization took ", & +!** (t_end - t_start) / real(t_rate) +!**end if + + if (control%diagnostics_level >= 1 .and. mp >= 0) then + write (mp,'(/a)') ' Leaving MA86_factor with:' + write (mp,'(a,i15)') ' flag = ',info%flag + write (mp,'(a,i15)') ' matrix_rank = ',info%matrix_rank + write (mp,'(a,i15)') ' num_delay = ',info%num_delay + write (mp,'(a,i15)') ' num_nodes = ',info%num_nodes + write (mp,'(a,i15)') ' num_factor = ',info%num_factor + write (mp,'(a,i15)') ' num_flops = ',info%num_flops + write (mp,'(a,i15)') ' num_two = ',info%num_two + write (mp,'(a,i15)') ' num_neg = ',info%num_neg + write (mp,'(a,i15)') ' num_perturbed = ',info%num_perturbed + write (mp,'(a,i15)') ' pool_size = ',info%pool_size + write (mp,'(a,i15)') ' stat = ',info%stat + write (mp,'(a,es12.5)') ' usmall = ',info%usmall + end if + + ! Take a copy of any components of info that may have changed + keep%info%flag = info%flag + keep%info%matrix_rank = info%matrix_rank + keep%info%num_delay = info%num_delay + keep%info%num_nodes = info%num_nodes + keep%info%num_factor = info%num_factor + keep%info%num_flops = info%num_flops + keep%info%num_two = info%num_two + keep%info%num_neg = info%num_neg + keep%info%num_perturbed = info%num_perturbed + keep%info%pool_size = info%pool_size + keep%info%stat = info%stat + keep%info%usmall = info%usmall + +end subroutine MA86_factor_double + +!**************************************************************************** + +! +! Combined factor+solve (simplified interface for single rhs). +! +subroutine MA86_factor_solve_one_double(n, ptr, row, & + val, order, keep, control, info, x, scale) + integer, intent(in) :: n ! order of A + integer, intent(in) :: row(:) ! row indices of lower triangular part + integer, intent(in) :: ptr(:) ! col pointers for lower triangular part + real(wp), intent(in) :: val(:) ! matrix values + integer, intent(in) :: order(:) ! holds pivot order (must be unchanged + ! since the analyse phase) + type(MA86_keep), intent(inout) :: keep ! see description of derived type + type(MA86_control), intent(in) :: control ! see description of derived type + type(MA86_info), intent(out) :: info ! see description of derived type + real(wp), intent(inout) :: x(keep%n) ! On entry, x must + ! be set so that if i has been used to index a variable, + ! x(i) is the corresponding component of the right-hand side. + ! On exit, if i has been used to index a variable, + ! x(i) holds solution for variable i. + real(wp), optional, intent(inout) :: scale(*) ! optional scaling factors + + call MA86_factor_solve_mult_double(n, ptr, row, & + val, order, keep, control, info, 1, keep%n, x, scale=scale) + +end subroutine MA86_factor_solve_one_double + +!**************************************************************************** + +! +! Combined factor+solve. +! +subroutine MA86_factor_solve_mult_double(n, ptr, row, & + val, order, keep, control, info, nrhs, lx, x, scale) + integer, intent(in) :: n ! order of A + integer, intent(in) :: row(:) ! row indices of lower triangular part + integer, intent(in) :: ptr(:) ! col pointers for lower triangular part + real(wp), intent(in) :: val(:) ! matrix values + integer, intent(in) :: order(:) ! holds pivot order (must be unchanged + ! since the analyse phase) + type(MA86_keep), intent(inout) :: keep ! see description of derived type + type(MA86_control), intent(in) :: control ! see description of derived type + type(MA86_info), intent(out) :: info ! see description of derived type + integer, intent(in) :: nrhs ! number of right-hand sides to solver for. + integer, intent(in) :: lx ! first dimension of x + real(wp), intent(inout) :: x(lx,nrhs) ! On entry, x must + ! be set so that if i has been used to index a variable, + ! x(i,j) is the corresponding component of the + ! right-hand side for the jth system (j = 1,2,..., nrhs). + ! On exit, if i has been used to index a variable, + ! x(i,j) holds solution for variable i to system j + real(wp), optional, intent(inout) :: scale(*) ! optional scaling factors + + integer :: i ! temporary variable + integer :: j ! temporary variable + integer :: mp ! copy of control%unit_diagnostics + integer :: ne ! set to ptr(n+1) - 1 +!**integer :: t_start, t_end, t_rate + integer :: st ! stat parameter + + real(wp), dimension(:), allocatable :: soln ! allocated to have + ! size n*nrhs. + ! used to hold reordered rhs and then overwritten by reordered solution. + + ! Reset components of info and return if an error was encountered earlier + select case (keep%info%flag) + case(MA86_ERROR_ALLOCATION, MA86_ERROR_ORDER) + ! Previous call was an analyse or unrecoverable error + return ! Cannot do factorize + case default + ! In all other cases we can do a factorize, reset flag to 0 and proceed + info%flag = 0 + end select + info%num_factor = keep%info%num_factor + info%num_flops = keep%info%num_flops + info%num_nodes = keep%info%num_nodes + info%maxdepth = keep%info%maxdepth + info%stat = keep%info%stat + + ne = ptr(n+1) - 1 + ! Perform appropriate printing + mp = control%unit_diagnostics + if (control%diagnostics_level>=1 .and. mp>=0) then + write (mp,'(/a)') ' On entry to MA86_factor:' + write (mp,'(a,i15)') ' control%diagnostics_level = ', & + control%diagnostics_level + write (mp,'(a,i15)') ' control%unit_diagnostics = ',mp + write (mp,'(a,i15)') ' control%unit_error = ',control%unit_error + write (mp,'(a,i15)') ' control%unit_warning = ',control%unit_warning + write (mp,'(a,i15)') ' control%pool_size = ', & + control%pool_size + write (mp,'(a,i15)') ' control%nbi = ', control%nbi + write (mp,'(a,i15)') ' control%scaling = ', control%scaling + write (mp,'(a,es15.5)') ' control%small = ', control%small + write (mp,'(a,es15.5)') ' control%static = ', control%static + write (mp,'(a,i15)') ' n = ',n + end if + + if (control%diagnostics_level > 2 .and. mp>=0) then + + write (mp,'(a)') ' ptr = ' + write (mp,'(5i15)') ptr(1:n+1) + + write (mp,'(a)') ' row = ' + write (mp,'(5i15)') row(1:ne) + + write (mp,'(a)') ' val = ' + write (mp,'(4es14.6)') val(1:ne) + + write (mp,'(a)') ' Elimination order :' + write (mp,'(5i15)') order(1:n) + + else if (control%diagnostics_level==2 .and. mp>=0) then + + write (mp,'(a)') ' ptr(1:min(5,n+1)) = ' + write (mp,'(5i15)') ptr(1:min(5,n+1)) + + write (mp,'(a)') ' row(1:min(5,ne)) = ' + write (mp,'(5i15)') row(1:min(5,ne)) + + write (mp,'(a)') ' val(1:min(5,ne)) = ' + write (mp,'(4es14.6)') val(1:min(5,ne)) + + i = min(10,n) + write (mp,'(a,2(/5i12))') & + ' Elimination order :', order(1:i) + if (i < n) write (mp,'(a)') ' . . . . . .' + + end if + + if(control%static.lt.abs(control%small) .and. control%static.ne.zero) then + info%flag = MA86_ERROR_STATIC_SMALL + call MA86_print_flag(info%flag, control, context='MA86_factor') + return + endif + + ! immediate return if n = 0 + if (n == 0) return + + if (lx < n .or. nrhs < 1) then + info%flag = MA86_ERROR_X_SIZE + call MA86_print_flag(info%flag, control, context='MA86_factor_solve') + return + end if + + deallocate (soln,stat=st) + + allocate (soln(n*nrhs),stat=st) + if (st.ne.0) then + info%flag = MA86_ERROR_ALLOCATION + info%stat = st + call MA86_print_flag(info%flag, control, context='MA86_factor_solve', & + st=st) + return + end if + + ! Handle scaling + deallocate(keep%scaling, stat=st) + if(control%scaling.gt.0 .or. present(scale)) then + allocate(keep%scaling(n), stat=st) + if(st.ne.0) then + info%flag = MA86_ERROR_ALLOCATION + info%stat = st + call MA86_print_flag(info%flag, control, & + context='MA86_factor', st=st) + return + endif + endif + select case (control%scaling) + case(:0) ! user supplied (scale present) or none (scale not present) + st = 0 + if(present(scale)) keep%scaling(1:n) = scale(1:n) + case(1) ! mc64 scaling + call mc64_scale(n, ptr, row, val, keep%scaling, control, info%flag, st) + if(info%flag.lt.0) return + if(present(scale)) scale(1:n) = keep%scaling(1:n) + case(2:) ! mc77 scaling + call mc77_scale(n, ptr, row, val, keep%scaling, st) + if(present(scale)) scale(1:n) = keep%scaling(1:n) + end select + if(st.ne.0) then + info%flag = MA86_ERROR_ALLOCATION + info%stat = st + call MA86_print_flag(info%flag, control, & + context='MA86_factor', st=st) + return + endif + + ! + ! Scale right hand side if required + ! + if(allocated(keep%scaling)) then + do i = 1, nrhs + x(1:keep%n,i) = x(1:keep%n,i)*keep%scaling(1:keep%n) + end do + endif + + ! Reorder rhs + + do i = 1, nrhs + do j = 1, n + soln((i-1)*n + order(j)) = x(j, i) + end do + end do + + ! Ready to perform the sparse factorization +!**call system_clock(t_start) + + if(allocated(keep%scaling)) then + call factorize_indef(val, order, keep, control, info, & + nrhs, n, soln, scale=keep%scaling) + else + call factorize_indef(val, order, keep, control, info, & + nrhs, n, soln) + endif + if (info%flag < 0) go to 10 + +!**if(control%time_out.ge.0) then +!** call system_clock(t_end, t_rate) +!** write(control%time_out,"(a,es12.4)") "factorization took ", & +!** (t_end - t_start) / real(t_rate) +!**end if + + ! Perform back substitution + call solve_indef(SOLVE_JOB_D_AND_BWD, nrhs, soln, n, keep, & + control, info) + + if (info%flag.lt.0) go to 10 + + ! Reorder soln + + do i = 1, nrhs + do j = 1, n + x(j, i) = soln((i-1)*n + order(j)) + end do + end do + + ! + ! Scale right hand side if required + ! + if(allocated(keep%scaling)) then + do i = 1, nrhs + x(1:keep%n,i) = x(1:keep%n,i)*keep%scaling(1:keep%n) + end do + endif + + if (control%diagnostics_level >= 1 .and. mp >= 0) then + write (mp,'(/a)') ' Leaving MA86_factor with:' + write (mp,'(a,i15)') ' flag = ',info%flag + write (mp,'(a,i15)') ' matrix_rank = ',info%matrix_rank + write (mp,'(a,i15)') ' num_delay = ',info%num_delay + write (mp,'(a,i15)') ' num_nodes = ',info%num_nodes + write (mp,'(a,i15)') ' num_factor = ',info%num_factor + write (mp,'(a,i15)') ' num_flops = ',info%num_flops + write (mp,'(a,i15)') ' num_two = ',info%num_two + write (mp,'(a,i15)') ' num_neg = ',info%num_neg + write (mp,'(a,i15)') ' num_perturbed = ',info%num_perturbed + write (mp,'(a,i15)') ' pool_size = ',info%pool_size + write (mp,'(a,i15)') ' stat = ',info%stat + write (mp,'(a,es15.5)') ' usmall = ',info%usmall + end if + + if (control%diagnostics_level > 2 .and. mp>=0) then + write (mp,'(a)') ' Computed solution for first right-hand side :' + write (mp,'(4es14.6)') x(1:n,1) + else if (control%diagnostics_level==2 .and. mp>=0) then + i = min(10,n) + write (mp,'(a)') ' Computed solution for first right-hand side :' + write (mp,'(4es14.6)') x(1:i,1) + if (i < n) write (mp,'(a)') ' . . . . . .' + end if + + 10 deallocate(soln,stat=st) + + ! Take a copy of any components of info that may have changed + keep%info%flag = info%flag + keep%info%matrix_rank = info%matrix_rank + keep%info%num_delay = info%num_delay + keep%info%num_nodes = info%num_nodes + keep%info%num_factor = info%num_factor + keep%info%num_flops = info%num_flops + keep%info%num_two = info%num_two + keep%info%num_neg = info%num_neg + keep%info%num_perturbed = info%num_perturbed + keep%info%pool_size = info%pool_size + keep%info%stat = info%stat + keep%info%usmall = info%usmall + +end subroutine MA86_factor_solve_mult_double + +!************************************************* + +! +! Solve phase. simplified interface for a single rhs +! +subroutine MA86_solve_one_double(x,order,keep,control,info,job,scale) + type(MA86_keep), intent(inout) :: keep + real(wp), intent(inout) :: x(keep%n) ! On entry, x must + ! be set so that if i has been used to index a variable, + ! x(i) is the corresponding component of the right-hand side. + ! On exit, if i has been used to index a variable, + ! x(i) holds solution for variable i. + integer, intent(in) :: order(:) ! pivot order. must be unchanged + ! For details of keep, control, info : see derived type description + type(MA86_control), intent(in) :: control + type(MA86_info), intent(out) :: info + integer, optional, intent(in) :: job ! used to indicate whether + ! partial solution required + ! job = 0 or absent: complete solve performed + ! job = 1 : forward eliminations only (PLx = b) + ! job = 2 : backsubs only ((PL)^Tx = b) + real(wp), optional, intent(in) :: scale(*) ! deprecated, ignored + + call MA86_solve_mult_double(1, keep%n, x, order, keep, & + control, info, job) + +end subroutine MA86_solve_one_double + +!************************************************* + +! +! Solve phase. Optionally performs only the forward, diagonal or backward sub. +! +subroutine MA86_solve_mult_double(nrhs,lx,x,order,keep, & + control,info,job,scale) + integer, intent(in) :: nrhs ! number of right-hand sides to solver for. + integer, intent(in) :: lx ! first dimension of x + real(wp), intent(inout) :: x(lx,nrhs) ! On entry, x must + ! be set so that if i has been used to index a variable, + ! x(i,j) is the corresponding component of the + ! right-hand side for the jth system (j = 1,2,..., nrhs). + ! On exit, if i has been used to index a variable, + ! x(i,j) holds solution for variable i to system j + integer, intent(in) :: order(:) ! pivot order. must be unchanged + ! For details of keep, control, info : see derived type description + type(MA86_keep), intent(inout) :: keep + type(MA86_control), intent(in) :: control + type(MA86_info), intent(out) :: info + integer, optional, intent(in) :: job ! used to indicate whether + ! partial solution required + ! job = 0 or absent: complete solve performed + ! job = 1 : forward eliminations only (PLX = B). + ! job = 2 : diagonal solve (DX = B) + ! job = 3 : backsubs only ((PL)^TX = B) + ! job = 4 : backsubs and diag solve only (D(PL)^TX = B). + real(wp), optional, intent(in) :: scale(*) ! deprecated, ignored + + integer :: i + integer :: j + integer :: local_job ! set to job or 0 if job not present + integer :: mp ! set to control%unit_diagnostics + integer :: n ! order of system + integer :: st ! stat parameter + real(wp), dimension(:), allocatable :: soln ! allocated to have size + ! n*nrhs. used to hold reordered rhs and then overwritten by reorder + ! solution. + + ! Reset components of info and return if an error was encountered earlier + info%flag = keep%info%flag + if (info%flag < 0) return + info%matrix_rank = keep%info%matrix_rank + info%maxdepth = keep%info%maxdepth + info%num_delay = keep%info%num_delay + info%num_factor = keep%info%num_factor + info%num_flops = keep%info%num_flops + info%num_nodes = keep%info%num_nodes + info%num_two = keep%info%num_two + info%num_neg = keep%info%num_neg + info%num_perturbed = keep%info%num_perturbed + info%pool_size = keep%info%pool_size + info%stat = keep%info%stat + info%usmall = keep%info%usmall + + ! Perform appropriate printing + mp = control%unit_diagnostics + if (control%diagnostics_level>=1 .and. mp>=0) then + write (mp,'(/a)') ' On entry to MA86_solve:' + write (mp,'(a,i15)') ' control%diagnostics_level = ', & + control%diagnostics_level + write (mp,'(a,i15)') ' control%unit_diagnostics = ',mp + write (mp,'(a,i15)') ' control%unit_error = ',control%unit_error + write (mp,'(a,i15)') ' control%unit_warning = ',control%unit_warning + write (mp,'(a,i15)') ' control%pool_size = ', & + control%pool_size + write (mp,'(a,i15)') ' nrhs = ',nrhs + write (mp,'(a,i15)') ' lx = ',lx + if (present(job)) & + write (mp,'(a,i15)') ' job = ',job + end if + + local_job = 0 + if (present(job)) then + select case (job) + case (SOLVE_JOB_ALL,SOLVE_JOB_FWD,SOLVE_JOB_BWD) + ! everything OK + case (SOLVE_JOB_D,SOLVE_JOB_D_AND_BWD) + ! also OK + case default + info%flag = MA86_ERROR_JOB_OOR + call MA86_print_flag(info%flag, control, context='MA86_solve') + return + end select + local_job = job + end if + + n = keep%n + + ! immediate return if n = 0 + if (n == 0) return + + if (lx < n .or. nrhs < 1) then + info%flag = MA86_ERROR_X_SIZE + call MA86_print_flag(info%flag, control, context='MA86_solve') + return + end if + + ! + ! Scale right hand side if required + ! + if(allocated(keep%scaling) .and. & + (local_job.eq.SOLVE_JOB_ALL.or.local_job.eq.SOLVE_JOB_FWD)) then + do i = 1, nrhs + x(1:keep%n,i) = x(1:keep%n,i)*keep%scaling(1:keep%n) + end do + endif + + ! + ! Reorder rhs + ! + deallocate(soln,stat=st) + allocate(soln(n*nrhs),stat=st) + if (st.ne.0) then + info%flag = MA86_ERROR_ALLOCATION + info%stat = st + call MA86_print_flag(info%flag, control, context='MA86_solve',st=st) + return + end if + + do i = 1, nrhs + do j = 1, n + soln((i-1)*n + order(j)) = x(j, i) + end do + end do + + call solve_indef(local_job, nrhs, soln, n, keep, control, & + info) + + if (info%flag.lt.0) go to 10 + + ! + ! Reorder soln + ! + do i = 1, nrhs + do j = 1, n + x(j, i) = soln((i-1)*n + order(j)) + end do + end do + + ! + ! Scale right hand side if required + ! + if(allocated(keep%scaling) .and. & + (local_job.eq.SOLVE_JOB_ALL .or. local_job.eq.SOLVE_JOB_BWD & + .or. local_job.eq.SOLVE_JOB_D_AND_BWD) ) then + do i = 1, nrhs + x(1:keep%n,i) = x(1:keep%n,i)*keep%scaling(1:keep%n) + end do + endif + + if (control%diagnostics_level >= 1 .and. mp >= 0) then + write (mp,'(/a)') ' Leaving MA86_solve with:' + write (mp,'(a,i15)') ' flag = ',info%flag + write (mp,'(a,i15)') ' stat = ',info%stat + end if + + if (control%diagnostics_level > 2 .and. mp>=0) then + write (mp,'(a)') ' Computed solution for first right-hand side :' + write (mp,'(4es14.6)') x(1:n,1) + else if (control%diagnostics_level==2 .and. mp>=0) then + i = min(10,n) + write (mp,'(a)') ' Computed solution for first right-hand side :' + write (mp,'(4es14.6)') x(1:i,1) + if (i < n) write (mp,'(a)') ' . . . . . .' + end if + + 10 deallocate(soln,stat=st) + + ! Take a copy of any components of info that may have changed + keep%info%flag = info%flag + keep%info%stat = info%stat + +end subroutine MA86_solve_mult_double + +!************************************************* + +! +! This routine must be called after all other calls to routines +! in the package. +! +subroutine MA86_finalise_double(keep, control) + type(MA86_keep), intent(inout) :: keep ! See derived-type declaration + type(MA86_control), intent(in) :: control ! See derived-type declaration + + integer :: i + integer :: st ! stat parameter + + if (control%diagnostics_level >= 1 .and. control%unit_diagnostics >= 0) then + write (control%unit_diagnostics,'(/a)') & + ' Entering MA86_finalise' + end if + + if(allocated(keep%lfact)) then + do i = 1, keep%nbcol + ! Note: we need to be careful if we've failed to allocate sufficient + ! memory then we may not have initialized all the lfact locks. +!$ if(allocated(keep%lfact(i)%lcol)) & +!$ call omp_destroy_lock(keep%lfact(i)%lock) + deallocate(keep%lfact(i)%lcol,stat=st) + deallocate(keep%lfact(i)%d,stat=st) + end do + deallocate(keep%lfact,stat=st) + keep%nbcol=0 + endif + + if(allocated(keep%blocks)) then +!$ do i = 1, keep%final_blk +!$ call omp_destroy_lock(keep%blocks(i)%alock) +!$ end do + keep%final_blk = 0 + deallocate(keep%blocks) + endif + + deallocate(keep%nodes,stat=st) + deallocate(keep%flag_array,stat=st) + +end subroutine MA86_finalise_double + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +! +! Call mc64 to get a scaling, then symmetrize it +! +subroutine mc64_scale(n, ptr, row, val, scaling, control, flag, st) + integer, intent(in) :: n + integer, dimension(n+1), intent(in) :: ptr + integer, dimension(ptr(n+1)-1), intent(in) :: row + real(wp), dimension(ptr(n+1)-1), intent(in) :: val + real(wp), dimension(n), intent(out) :: scaling + type(ma86_control), intent(in) :: control + integer, intent(out) :: flag + integer, intent(out) :: st + + integer :: i, j, k, ndiag + integer, dimension(:), allocatable :: ptr2, row2, iw, cperm + real(wp), dimension(:), allocatable :: val2, dw + + real(wp) :: colmax + + ! Initialise return values + flag = 0 + st = 0 + + ! Expand out, removing any explicit zeroes + allocate(ptr2(n+1), row2(2*ptr(n+1)), val2(2*ptr(n+1)), stat=st) + if(st.ne.0) return + allocate(iw(5*n), cperm(n), dw(3*n+2*ptr(n+1)), stat=st) + if(st.ne.0) return + + k = 1 + do i = 1, n + ptr2(i) = k + do j = ptr(i), ptr(i+1)-1 + if(val(j).eq.zero) cycle + row2(k) = row(j) + val2(k) = abs(val(j)) + k = k + 1 + end do + end do + ptr2(n+1) = k + call mc34_expand(n, row2, ptr2, iw, a=val2) + + ! Call mc64 + do i = 1,n + colmax = maxval(val2(ptr2(i):ptr2(i+1)-1)) + if (colmax.ne.0) colmax = log(colmax) + dw(2*n+i) = colmax + val2(ptr2(i):ptr2(i+1)-1) = colmax - log(val2(ptr2(i):ptr2(i+1)-1)) + end do + call mc64wd(n,ptr2(n+1)-1,ptr2,row2,val2,cperm,ndiag, & + iw(1),iw(n+1),iw(2*n+1),iw(3*n+1),iw(4*n+1), & + dw(1),dw(n+1)) + if (ndiag.eq.n) then + do i = 1,n + if (dw(2*n+i).ne.zero) then + dw(n+i) = dw(n+i) - dw(2*n+i) + else + dw(n+i) = zero + endif + end do + elseif(.not. control%action) then + ! Matrix is singular, abort + flag = MA86_ERROR_SINGULAR + call MA86_print_flag(flag, control, context='MA86_factor') + return + endif + + do i = 1, n + scaling(i) = exp( ( dw(i) + dw(n+i) ) / 2 ) + ! Just ignore badly scaled rows/columns. (Probably due to singular matrix) + !if(scaling(i).ge.1e10) scaling(i) = 1.0 + end do +end subroutine mc64_scale + +! Following Ruiz and Ucar +! "A symmetry preserving algorithm for matrix scaling" +! we do one iteration of the inf norm and then 3 of the one norm. +subroutine mc77_scale(n, ptr, row, val, scaling, st) + integer, intent(in) :: n + integer, dimension(n+1), intent(in) :: ptr + integer, dimension(ptr(n+1)-1), intent(in) :: row + real(wp), dimension(ptr(n+1)-1), intent(in) :: val + real(wp), dimension(n), intent(out) :: scaling + integer, intent(out) :: st + + integer :: i, j, k + + integer, allocatable, dimension(:) :: iw + real(wp), allocatable, dimension(:) :: dw + integer :: icntl(10), info(10) + real(wp) :: cntl(10), rinfo(10) + + real(wp), dimension(:), allocatable :: val2 + + ! Take absolute value of matrix to avoid overheads + allocate(val2(ptr(n+1)-1), stat=st) + if(st.ne.0) return + val2(1:ptr(n+1)-1) = abs(val(1:ptr(n+1)-1)) + + ! Set controls + call mc77id(icntl, cntl) + !icntl(1) = -1 ! error messages + !icntl(2) = -1 ! warning messages + !icntl(3) = -1 ! diagnostic messages + icntl(4) = -1 ! disable checking + icntl(5) = -1 ! absolute value precomputed + icntl(6) = -1 ! symmetric matrix + + allocate(iw(2*n), dw(2*n), stat=st) + if(st.ne.0) return + + ! Single iteration of inf norm + icntl(7) = 1 ! max number of iterations + call mc77ad(0, n, n, ptr(n+1)-1, ptr, row, val2, iw, size(iw), & + dw, size(dw), icntl, cntl, info, rinfo) + + ! Apply scaling + ! Note: we could modify mc77 to take an input vector of scaling to make + ! this step unnesscary + do i = 1, n + do j = ptr(i), ptr(i+1)-1 + k = row(j) + val2(j) = val2(j) / (dw(i) * dw(k)) + end do + end do + scaling(1:n) = 1/dw(1:n) + + ! Up to 3 iterations of one norm + icntl(7) = 3 ! max number of iterations + call mc77ad(1, n, n, ptr(n+1)-1, ptr, row, val2, iw, size(iw), & + dw, size(dw), icntl, cntl, info, rinfo) + + scaling(1:n) = scaling(1:n) / dw(1:n) + +end subroutine mc77_scale + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +! +! Perform a sparse factorization. Called by the driver MA86_factor. +! +subroutine factorize_indef(val, order, keep, control, & + info, nrhs, ldr, rhs, scale) + real(wp), dimension(*), intent(in) :: val ! matrix values (lower triangle) + integer, intent(in) :: order(:) ! holds pivot order + type(MA86_keep), intent(inout) :: keep ! see description of derived type + type(MA86_control), intent(in) :: control ! see description of derived type + type(MA86_info), intent(inout) :: info ! see description of derived type + integer, intent(in) :: nrhs ! number of right-hand sides (maybe = 0) + integer, intent(in) :: ldr ! leading extent of rhs + real(wp), intent(inout) :: rhs(ldr*nrhs) ! On entry holds rhs data. + ! Overwritten by partial solution (forward substitution performed). + real(wp), optional, intent(in) :: scale(*) + + ! local derived types + type(dagtask) :: task ! see description of derived type + type(taskstack) :: stack ! see description of derived type + + ! local arrays + integer, dimension(:), allocatable :: invp ! used to hold inverse ordering + integer, dimension(:), allocatable :: map ! allocated to have size n. + ! used in copying entries of user's matrix a into factor storage + ! (keep%fact). + integer, dimension(:), allocatable :: pos ! allocated to have size n. + ! used in copying from a child into its parent. + real(wp), dimension(:,:), allocatable :: rhs_local ! Local right-hand + ! side arrays. allocated to have size (nrhs*ldr,0:total_threads) + + ! local scalars + integer :: bcol ! block col. + integer(long) :: blk ! block identity + integer(long) :: dblk ! diagonal block within block column + integer :: dest ! destination column for calculating delay destination + integer :: en ! holds keep%nodes(snode)%en + integer :: flag ! Error flag + integer(long) :: i + integer :: l_nb ! set to block size of snode (keep%nodes(snode)%nb) + integer :: local ! used to set local index of block col. within snode + integer :: nbcol ! number of block column + integer :: nnodes ! number of nodes + integer :: nrow ! used to count no. of rows in block col. + integer :: parent ! parent of snode + integer :: pool_size ! Normally set to control%pool_size + integer :: sa ! holds keep%nodes(snode)%sa + integer :: size_bcol ! number of entries in the block column (sum over the + ! row blocks in the column) + integer :: snode + integer :: st ! stat parameter + integer :: sz ! number of blocks in a block column of snode +!**integer :: t_start, t_end, t_rate + integer :: this_thread + integer :: total_threads ! number of threads being used + real(wp) :: u + + ! array for accumulating ma64 statistics + type(thread_info), dimension(:), allocatable :: thread_stats + + ! Initialise + flag = 0 + + total_threads = 1 +!$ total_threads = omp_get_max_threads() + + deallocate(thread_stats,stat=st) + allocate(thread_stats(0:total_threads-1),stat=st) + if(st.ne.0) go to 10 + + u = control%u + u = min(u, 0.5_wp) + u = max(u, zero) + thread_stats(:)%usmall = u + + call zero_task(task) + + nnodes = keep%info%num_nodes + +!**call system_clock(t_start) + + ! Initialize task pool + pool_size = control%pool_size + if (pool_size < 1) pool_size = pool_default + + call init_stack(stack, pool_size, control, flag, st) + + ! check for allocation error + if (flag == MA86_ERROR_ALLOCATION) go to 10 + + ! Set up inverse permutation + deallocate (invp,stat=st) + allocate (invp(keep%n),stat=st) + if(st.ne.0) go to 10 + + do i = 1, keep%n + invp(order(i)) = i + end do + + ! Allocate factor storage (in keep%lfact) + ! Be careful to unitialise locks in any preexisting factorization! + if(allocated(keep%lfact)) then +!$ do i = 1, keep%nbcol +!$ if(allocated(keep%lfact(i)%lcol)) & +!$ call omp_destroy_lock(keep%lfact(i)%lock) +!$ end do + deallocate (keep%lfact,stat=st) + endif + allocate (keep%lfact(keep%nbcol),stat=st) + if(st.ne.0) go to 10 + + blk = 1 + nbcol = 0 + keep%lfact(:)%delay_head = -1 + ! loop over the nodes + do snode = 1, nnodes + ! Loop over the block columns in snode, allocating space + ! l_nb is the size of the blocks and sz is number of + ! blocks in the current block column + l_nb = keep%nodes(snode)%nb + sz = (size(keep%nodes(snode)%index) - 1) / l_nb + 1 + sa = keep%nodes(snode)%sa + en = keep%nodes(snode)%en + + local = 0 + do i = sa, en, l_nb + nbcol = nbcol + 1 + local = local + 1 + ! store the local index of the block col within the node + keep%lfact(nbcol)%local = local + + ! if this is last blk col of node, determine where delays end up + parent = keep%nodes(snode)%parent + if(i+l_nb.gt.en .and. parent.ne.-1) then + ! go to some column of parent node + dest = keep%nodes(snode)%index(en-sa+2) ! first row below diagonal + ! now calculate which block column of parent dest corresponds to + dest = (dest - keep%nodes(parent)%sa) / keep%nodes(parent)%nb + 1 + bcol = keep%blocks(keep%nodes(parent)%blk_sa)%bcol + dest - 1 + keep%nodes(snode)%delay_next = keep%lfact(bcol)%delay_head + keep%lfact(bcol)%delay_head = snode + endif + + ! store diagonal block + dblk = blk + keep%lfact(nbcol)%dblk = dblk + + ! loop over the row blocks adding up no. of rows + nrow = 0 + do blk = dblk, dblk+sz-1 + nrow = nrow + keep%blocks(blk)%blkm + end do + keep%lfact(nbcol)%nrow = nrow + + ! allocate storage for L + deallocate (keep%lfact(nbcol)%lcol, stat=st) + size_bcol = nrow*keep%blocks(dblk)%blkn + allocate (keep%lfact(nbcol)%lcol(size_bcol),stat=st) + if(st.ne.0) go to 10 +!$ call omp_init_lock(keep%lfact(nbcol)%lock) + + sz = sz - 1 + end do + + ! initialise number of delayed pivots to 0 + keep%nodes(snode)%num_delay = 0 + end do + + ! compute block column dependency counts by + ! adding up all the dependencies of the blocks in each block col. + + keep%lfact(1:keep%nbcol)%dep = 0 + do i = 1,keep%final_blk + bcol = keep%blocks(i)%bcol + if (keep%blocks(i)%id.eq.keep%blocks(i)%dblk) then + keep%lfact(bcol)%dep = keep%lfact(bcol)%dep + & + keep%blocks(i)%dep_initial + else + ! for off diag. blocks, reduce count by one since no solve + ! for combined factor-solve task + keep%lfact(bcol)%dep = keep%lfact(bcol)%dep + & + keep%blocks(i)%dep_initial - 1 + end if + ! flag block as not yet touched + keep%blocks(i)%touched = .false. + end do + + ! Add initial tasks into the global task pool + ! (i.e. those tasks with block col. dependency count equal to 0) + task%task_type = TASK_FACTORIZE_COLUMN + do i = 1, keep%nbcol + if(keep%lfact(i)%dep.ne.0) cycle + task%dest = keep%lfact(i)%dblk + flag = 0 + call add_task_g(stack, task, control, flag, st) + ! check for allocation error + if(flag < 0) go to 10 + end do + +!**if(control%time_out.ge.0) then +!** call system_clock(t_end) +!** write(control%time_out,"(a,es12.4)") "init took ", & +!** (t_end - t_start) / real(t_rate) +!**end if + +!**call system_clock(t_start, t_rate) + + ! Allocate parallel error array + deallocate(keep%flag_array,stat=st) + allocate(keep%flag_array(0:total_threads-1),stat=st) + if(st.ne.0) go to 10 + + ! Allocate local right-hand side arrays + deallocate(rhs_local,stat=st) + allocate(rhs_local(nrhs*ldr,0:total_threads-1),stat=st) + + 10 if(st.ne.0) then + info%flag = MA86_ERROR_ALLOCATION + info%stat = st + call cleanup_stack(stack) + call MA86_print_flag(info%flag, control, context='MA86_factor',st=st) + return + endif + + ! initialise local error flags + keep%flag_array = 0 + + ! initialise rhs_local + rhs_local(1:nrhs*ldr,0:total_threads-1) = zero + + ! + ! Copy matrix values across from a into keep%lfact + ! +!**call system_clock(t_start) + st = 0 +!$OMP PARALLEL DEFAULT(NONE), & +!$OMP PRIVATE(map, pos, flag, this_thread, st) & +!$OMP SHARED(control,info,invp,keep,ldr,nnodes,nrhs,order,rhs, & +!$OMP rhs_local,scale,stack,thread_stats,total_threads,val & +!**!$OMP ,t_start,t_end,t_rate & +!$OMP ) + this_thread = 0 +!$ this_thread = omp_get_thread_num() + + deallocate(map,stat=st) + deallocate(pos,stat=st) + allocate(map(keep%n),pos(keep%n),stat=st) + if (st.ne.0) then + keep%flag_array(this_thread) = MA86_ERROR_ALLOCATION + info%stat = st + call ma86_print_flag(flag, control, context='MA86_factor',st=st) + go to 15 + end if +!$OMP BARRIER + if(any(keep%flag_array(:).lt.0)) go to 15 + + pos(1:keep%n) = 0 + +!$OMP BARRIER +!**!$OMP SINGLE +!** if(control%time_out.ge.0) then +!** call system_clock(t_end,t_rate) +!** write(control%time_out,"(a,es12.4)") "copy matrix took ", & +!** (t_end - t_start) / real(t_rate) +!** end if + +!** call system_clock(t_start) +!**!$OMP END SINGLE NOWAIT + + ! + ! Perform actual factorization + ! + keep%flag_array(this_thread) = info%flag + call task_dispatch(val, invp, keep%nbcol, keep%maxm, & + keep%maxn, keep%lfact, keep%lmap, map, pos, stack, keep%blocks, & + keep%nodes, control, & + thread_stats(this_thread), keep%flag_array(this_thread), st, nrhs, & + rhs, ldr, total_threads, rhs_local, scale=scale) + if(keep%flag_array(this_thread).lt.0) call set_abort(stack) + + if(keep%flag_array(this_thread).eq.MA86_ERROR_ALLOCATION) & + info%stat = st + + ! Reductions + 15 continue +!$OMP BARRIER +!$OMP SINGLE + deallocate(invp,stat=st) + ! Carefully merge warnings or select most negative error + do i = 0, total_threads-1 + if(keep%flag_array(i) .lt. 0) & + info%flag = min(info%flag, keep%flag_array(i)) + if(info%flag.lt.0) cycle ! just trying to find minimum error + flag = keep%flag_array(i) + select case(flag) + case(MA86_WARNING_SINGULAR) + ! already found singular, was pool small also? + if(info%flag.eq.MA86_WARNING_POOL_SMALL .or. & + info%flag.eq.MA86_WARNING_POOL_SING) & + flag = MA86_WARNING_POOL_SING + case(MA86_WARNING_POOL_SMALL) + ! already has a small pool, was it singular also? + if(info%flag.eq.MA86_WARNING_SINGULAR .or. & + info%flag.eq.MA86_WARNING_POOL_SING) & + flag = MA86_WARNING_POOL_SING + end select + info%flag = max(info%flag, flag) + end do + if(info%flag.eq.MA86_WARNING_POOL_SING .or. & + info%flag.eq.MA86_WARNING_SINGULAR ) & + call MA86_print_flag(info%flag, control, context='MA86_factor') + + info%pool_size = stack%max_pool_size + info%matrix_rank = keep%n - sum(thread_stats(:)%num_zero_pivots) + info%num_factor = sum(thread_stats(:)%num_factor) + info%num_flops = sum(thread_stats(:)%num_flops) + info%num_delay = sum(thread_stats(:)%num_delay) + info%num_two = sum(thread_stats(:)%num_two) + info%num_neg = sum(thread_stats(:)%num_neg) + info%num_perturbed = sum(thread_stats(:)%num_perturbed) + info%num_nothresh = sum(thread_stats(:)%num_nothresh) + info%usmall = minval(thread_stats(:)%usmall) + info%detlog = sum(thread_stats(:)%detlog) + info%detsign = product(thread_stats(:)%detsign) + if(info%detsign.eq.0) info%detlog = 0.0_wp +!$OMP END SINGLE + deallocate(map, stat=st) + deallocate(pos, stat=st) +!$OMP END PARALLEL + +!**if(control%time_out.ge.0) then +!** call system_clock(t_end) +!** write(control%time_out,"(a,es12.4)") "task_dispatch took ", & +!** (t_end - t_start) / real(t_rate) +!** write(control%time_out,"(a,50es12.4)") & +!** "Waiting time = ", stack%waiting(:) +!**end if + + ! write (6,*) 'max task pool size ', stack%max_pool_size + + call cleanup_stack(stack) + deallocate(invp, stat=st) + deallocate(rhs_local, stat=st) + deallocate(thread_stats, stat=st) +end subroutine factorize_indef + +!************************************************* + +! +! Add entries from A into L. +! At a non-leaf node there are contributions from children to worry about, +! so these entries are added in to a rowwise data structure +! +subroutine blk_col_add_a(local, val, lmap, invp, snode, dblk, lcol, scale) + integer, intent(in) :: local ! Block column position + real(wp), dimension(*), intent(in) :: val + type(lmap_type), intent(in) :: lmap ! mapping set up by analyse phase + integer, dimension(*), intent(in) :: invp + type(node_type), intent(in) :: snode + type(block_type), intent(in) :: dblk + real(wp), dimension(*), intent(inout) :: lcol + real(wp), dimension(*), optional, intent(in) :: scale + + integer :: j, k, jcol, swidth, offset, offset2 + integer(long) :: i + + swidth = dblk%blkn + offset = snode%sa + (local-1)*snode%nb + offset2 = (local-1)*snode%nb + + ! Loop over columns in the block column, adding in original matrix values + if(present(scale)) then + do i = 1, lmap%len_map + j = lmap%map(1,i) + ! Calculate row and column of original matrix + jcol = invp( offset + mod(j-1,swidth) ) ! col of original + k = (j-1)/swidth + 1 ! row of local + k = invp( snode%index(offset2+k) ) ! row of original + lcol(j) = lcol(j) + scale(jcol) * val(lmap%map(2,i)) * scale(k) + end do + else + do i = 1, lmap%len_map + lcol(lmap%map(1,i)) = lcol(lmap%map(1,i)) + val(lmap%map(2,i)) + end do + endif +end subroutine blk_col_add_a + +! +! Add entries from A into L. +! At a leaf node there are no contributions from children to worry about, +! so this is built colwise +! +subroutine blk_col_add_a_leaf(val, lmap, invp, snode, dblk, & + colwork, blkm, scale) + real(wp), dimension(*), intent(in) :: val + type(lmap_type), intent(in) :: lmap ! mapping set up by analyse phase + integer, dimension(*), intent(in) :: invp + type(node_type), intent(in) :: snode + type(block_type), intent(in) :: dblk + real(wp), dimension(*), intent(out) :: colwork + integer, intent(in) :: blkm + real(wp), dimension(*), optional, intent(in) :: scale + + integer :: j, k, jcol, blkn, offset + integer(long) :: i + + blkn = dblk%blkn + offset = snode%sa + + colwork(1:blkn*blkm) = zero + + ! Loop over columns in the block column, adding in original matrix values + if(present(scale)) then + do i = 1, lmap%len_map + j = lmap%map(1,i) + ! Calculate row and column of original matrix + jcol = invp( offset + (j-1)/blkm ) ! col of original + k = mod(j-1,blkm) + 1 ! row of local + k = invp( snode%index(k) ) ! row of original + colwork(j) = colwork(j) + scale(jcol) * val(lmap%map(2,i)) * scale(k) + end do + else + do i = 1, lmap%len_map + j = lmap%map(1,i) + colwork(j) = colwork(j) + val(lmap%map(2,i)) + end do + endif + +end subroutine blk_col_add_a_leaf + +!************************************************* + +! +! Performs solve. Called by driver MA86_solve. +! +subroutine solve_indef(job, nrhs, rhs, ldr, & + keep, control, info) + integer, intent(in) :: job ! controls full or partial solve + integer, intent(in) :: nrhs ! number of rhs + integer, intent(in) :: ldr ! leading extent of rhs + real(wp), intent(inout) :: rhs(ldr*nrhs) ! On entry holds rhs data. + ! Overwritten by solution. + type(MA86_keep), intent(inout) :: keep + type(MA86_control), intent(in) :: control + type(MA86_info), intent(inout) :: info + + integer :: bcol ! block column (blocks(blk)%bcol) + integer(long) :: blk ! block identifier + type(slv_count_type), dimension(:), allocatable :: counts + integer :: flag ! temporary store for info%flag + integer :: i ! loop variable + integer :: j ! temporary variable + integer :: k ! index of rhs + integer :: m ! number of rows in block blk + integer :: maxmn ! holds largest block dimension + integer :: n ! number of cols in block col. + integer :: nelim ! number of eliminations performed in block col. + integer :: node ! temporary variable (for looping over nodes) + integer :: num_nodes ! number of nodes + integer :: offset_rhs + integer :: pool_size ! inital size of task pool + real(wp), dimension(:), allocatable :: rhslocal ! allocated to have + ! size (maxmn*nrhs). + real(wp), dimension(:,:), allocatable :: rhs_local + integer :: s ! number of extra rows/cols in bcol because of delays + integer :: st + type(taskstack) :: stack + type(dagtask) :: task + integer :: this_thread + integer :: total_threads + + integer :: col + + total_threads = 1 +!$ total_threads = omp_get_max_threads() + + ! Find largest block dimension (m or n), allowing for delays + num_nodes = keep%info%num_nodes + maxmn = 0 + do node = 1, num_nodes + do blk = keep%nodes(node)%blk_sa, keep%nodes(node)%blk_en + bcol = keep%blocks(blk)%bcol + n = keep%lfact(bcol)%blkn_new + ! s is the number of extra rows/cols in bcol because of delays + s = n - keep%blocks(blk)%blkn + m = keep%blocks(blk)%blkm + if (blk.eq.keep%blocks(blk)%dblk) m = m + s + maxmn = max(maxmn, m, n) + end do + end do + + ! Allocate workspace + allocate(rhslocal(maxmn*nrhs),stat=st) + if(st.ne.0) then + info%flag = MA86_ERROR_ALLOCATION + info%stat = st + call MA86_print_flag(info%flag, control, context='MA86_solve',st=st) + return + endif + + ! Initialize task pool + pool_size = control%pool_size + if (pool_size < 1) pool_size = pool_default + call init_stack(stack, pool_size, control, flag, st) + if(st.ne.0) go to 10 + + ! Allocate parallel error array + deallocate(keep%flag_array,stat=st) + allocate(keep%flag_array(0:total_threads-1),stat=st) + if(st.ne.0) go to 10 + keep%flag_array(:) = 0 + + col = 1 + do node = 1, num_nodes + blk = keep%nodes(node)%blk_sa + do while(blk.le.keep%nodes(node)%blk_en) + bcol = keep%blocks(blk)%bcol + + keep%lfact(bcol)%col = col + col = col + keep%lfact(bcol)%nelim + + blk = keep%blocks(blk)%last_blk+1 + end do + end do + + if (job == SOLVE_JOB_ALL .or. job == SOLVE_JOB_FWD) then + + ! + ! Setup for forwards solve + ! + + allocate(counts(num_nodes),stat=st) + if(st.ne.0) go to 10 + ! Next loop not integrated with add_task_g() loop to ensure locks + ! can be destroyed safely if we get an error. +!$ do node = 1, num_nodes +!$ call omp_init_lock(counts(node)%lock) +!$ end do + call zero_task(task) + task%task_type = TASK_SLV_FSLV + do node = 1, num_nodes + counts(node)%dep = keep%nodes(node)%nchild + if(counts(node)%dep.eq.0) then + task%dest = node + flag = 0 + call add_task_g(stack, task, control, flag, st) + ! check for allocation error + if(flag < 0) go to 10 + endif + end do + else + allocate(counts(1),stat=st) + if(st.ne.0) go to 10 + end if ! job == all or fwd + + if (job.eq.SOLVE_JOB_D) then + ! Diagonal Solve only (otherwise combined with bwd solve) + ! Loop over nodes. + do node = 1, num_nodes + ! set blk to be first block in node + blk = keep%nodes(node)%blk_sa + ! each pass of this loop deals with a block column in node + do while(blk.le.keep%nodes(node)%blk_en) + bcol = keep%blocks(blk)%bcol + nelim = keep%lfact(bcol)%nelim + + do k = 1, nrhs + offset_rhs = (k-1)*ldr + do i = 1, nelim + j = keep%lfact(bcol)%index_new(i) + rhslocal(i) = rhs(j+offset_rhs) + end do + + call solveD(nelim, nelim, rhslocal, keep%lfact(bcol)%d) + + do i = 1, nelim + j = keep%lfact(bcol)%index_new(i) + rhs(j+offset_rhs) = rhslocal(i) + end do + end do + + blk = keep%blocks(blk)%last_blk + 1 + end do ! block column + end do ! nodes + endif ! diagonal solve + + if (job.eq.SOLVE_JOB_BWD .or. job.eq.SOLVE_JOB_D_AND_BWD) then + + ! + ! Setup for Backwards Solve (only if no fwds) + ! + + ! Add root nodes to task stack + call zero_task(task) + task%task_type = TASK_SLV_BSLV + do node = 1, num_nodes + if(keep%nodes(node)%parent.gt.0) cycle ! not a root + + ! If we reach here, then node is a root. + task%dest = node + flag = 0 + call add_task_g(stack, task, control, flag, st) + ! check for allocation error + if(flag < 0) go to 10 + end do + end if ! bwd + + ! + ! Now execute the establish task graph in parallel + ! + deallocate(rhs_local,stat=st) + allocate(rhs_local(ldr*nrhs, 0:total_threads-1),stat=st) + + 10 if(st.ne.0) then + info%flag = MA86_ERROR_ALLOCATION + info%stat = st + call cleanup_stack(stack) +!$ if(allocated(counts) .and. & +!$ (job.eq.SOLVE_JOB_ALL .or. job.eq.SOLVE_JOB_FWD)) then +!$ do i = 1, size(counts) +!$ call omp_destroy_lock(counts(i)%lock) +!$ end do +!$ endif + call MA86_print_flag(info%flag, control, context='MA86_solve',st=st) + return + endif + rhs_local(:,:) = zero + +!$OMP PARALLEL DEFAULT(NONE) & +!$OMP PRIVATE(this_thread) & +!$OMP SHARED(control, counts, info, job, keep, ldr, maxmn, nrhs, & +!$OMP rhs, rhs_local, st, stack, total_threads) + this_thread = 0 +!$ this_thread = omp_get_thread_num() + + call solve_task_dispatch(keep%nbcol, keep%lfact, stack, & + keep%blocks, keep%nodes, counts, control, keep%flag_array(this_thread), & + st, nrhs, ldr, rhs, total_threads, rhs_local, maxmn, job) + + if(keep%flag_array(this_thread).lt.0) call set_abort(stack) + + if(keep%flag_array(this_thread).eq.MA86_ERROR_ALLOCATION) & + info%stat = st +!$OMP END PARALLEL + + ! Reduce flag_array nicely + flag = info%flag + info%flag = minval(keep%flag_array(:)) + if(info%flag.ge.0) & + info%flag = max(flag, maxval(keep%flag_array(:))) + + ! + ! Dependency error checking - reneable by commenting if statement if + ! needed for debugging + ! + !if(.true.) then + ! ! Check for errors in dep counting, fwd solve + ! if(job.eq.SOLVE_JOB_ALL .or. job.eq.SOLVE_JOB_FWD) then + ! do i = 1, size(counts) + ! if(counts(i)%dep.ne.0) then + ! print *, "fdep(", i, ") = ", counts(i)%dep + ! endif + ! end do + ! endif + !endif + + ! + ! Cleanup things that require explicit stuff + ! + call cleanup_stack(stack) + + ! Destroy locks +!$ if(job.eq.SOLVE_JOB_ALL .or. job.eq.SOLVE_JOB_FWD) then +!$ do i = 1, size(counts) +!$ call omp_destroy_lock(counts(i)%lock) +!$ end do +!$ endif + +end subroutine solve_indef + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! Main task dispatch routines +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +! +! Main worker routine +! +subroutine task_dispatch(val, invp, nbcol, maxm, maxn, lfact, & + lmap, map, pos, stack, blocks, nodes, control, tstats, info, st, & + nrhs, rhs, ldr, total_threads, rhs_local, scale) + real(wp), dimension(*), intent(in) :: val + integer, dimension(*), intent(in) :: invp + integer, intent(in) :: nbcol ! Size of lfact (no. block cols) + integer, intent(in) :: maxm ! Maximum value of blkm per analyse + integer, intent(in) :: maxn ! Maximum value of blkn per analyse + type(lfactor), dimension(nbcol), intent(inout) :: lfact ! Entries in + ! block columns of L + type(lmap_type), dimension(nbcol), intent(in) :: lmap + integer, dimension(:), intent(inout) :: map ! private work array + ! and used for mapping from child nodes into node + integer, dimension(:), intent(inout) :: pos ! + ! used for mapping from child nodes into node + type(taskstack), intent(inout) :: stack ! task pool + type(block_type), dimension(:), intent(inout) :: blocks ! block info + type(node_type), dimension(-1:), intent(inout) :: nodes ! Node info + ! Components associated with indefinite case (delayed pivots) will + ! be altered. + type(MA86_control), intent(in) :: control + type(thread_info), intent(inout) :: tstats + integer, intent(out) :: info ! error flag + integer, intent(out) :: st ! stat parameter + integer, intent(in) :: nrhs ! number of right-hand sides (maybe = 0) + integer, intent(in) :: ldr ! leading extent of rhs + real(wp), intent(inout) :: rhs(ldr*nrhs) ! On entry holds rhs data. + ! Overwritten by partial solution (forward substitution performed). + integer, intent(in) :: total_threads ! number of threads + real(wp), intent(inout) :: rhs_local(ldr*nrhs,0:total_threads-1) ! Local + ! right-hand side arrays (one for each thread). + real(wp), dimension(*), optional, intent(in) :: scale + + integer :: bcol ! block col that task%dest belongs to + integer :: bcol_src ! block col that task%src1 belongs to + integer(long) :: blk ! task%dest + integer :: blkm ! set to number of rows in block + integer :: blkn ! set to number of cols in block + real(wp), dimension(:), allocatable :: buffer ! work array + real(wp), dimension(:), allocatable :: colwork ! buffer for storing colwise + integer(long) :: dblk ! block on diagonal + integer :: delay_col ! number of delayed cols added to the block col. that + ! is passed to factor_solve + integer :: flag + type(dagtask) :: task + integer :: i + integer :: m ! set to blocks(blk)%blkm (number of rows in blk) + integer :: m1 ! set to blocks(dblk)%blkm (number of rows in dblk) + integer :: m2 ! set to blocks(task%src2)%blkm + integer :: maxm_local + integer :: n ! set to blocks(blk)%blkn (number of columns in blk and dblk) + integer :: n1 ! number of columns in source block col. + integer :: nelim ! number of eliminations + integer :: node + integer :: sa ! set to blocks(blk)%sa + integer :: sa1 ! set to blocks(dblk)%sa + s + integer :: sa2 ! set to blocks(task%src2)%sa + s + integer :: slocal ! local index of block column that source block belongs to +!%%% integer :: t_start, t_end + integer :: this_thread + real(wp), dimension(:), allocatable :: work + real(wp), dimension(:), allocatable :: xlocal + integer, dimension(:), allocatable :: col_list + ! work array -> update_between + integer, dimension(:), allocatable :: row_list + ! work array -> update_between + + this_thread = 0 +!$ this_thread = omp_get_thread_num() + + !if(control%diagnostics_level.gt.2 .and. control%unit_diagnostics.ge.0) & + ! write(control%unit_diagnostics, "(a,i4,a)") & + ! "Thread ", this_thread, " joined worker pool." + + ! Initialize things + info = 0; st = 0 ! By default everything went OK + call zero_task(task) ! Set everything to zero + task%task_type = TASK_NONE ! Needs to be set to prevent + ! dispatched incrementing + maxm_local = 1 ! maximum block height on this thread + + allocate(col_list(maxn), row_list(maxm), buffer(maxm*maxn), & + colwork(1), work(1), xlocal(1), stat=st) + if (st.ne.0) then + info = MA86_ERROR_ALLOCATION + call MA86_print_flag(info, control, context='MA86_factor',st=st) + return + end if + + ! Mark thread as active +!$ call omp_set_lock(stack%lock) + stack%active = stack%active + 1 +!$ call omp_unset_lock(stack%lock) + + ! + ! Main loop + ! + do + ! + ! Retrieve next task to perform and wait till all is ready + ! +!%%% if(control%unit_log.gt.0) call system_clock(t_start) + + call get_task(stack, task, control, info, st) + if(info.lt.0) return + +!%%% if(control%unit_log.gt.0) then +!%%% call system_clock(t_end) +!%%% call log_task(control, this_thread, t_start, t_end, "GT", & +!%%% int(task%task_type,long)) +!%%% endif + +!$OMP FLUSH(lfact) + + !if(control%diagnostics_level.gt.2 .and. control%unit_diagnostics.ge.0 & + ! .and. task%task_type.ne.TASK_NONE .and. task%type.ne.TASK_DONE) & + ! then + ! write(control%unit_diagnostics, "(i3,2a)") & + ! this_thread, " got task ",print_job(task) + !endif + + ! + ! Perform task and update dependencies + ! + select case(task%task_type) + case(TASK_DONE) + exit + + case(TASK_NONE) ! Job not finished but no tasks available, spin. + cycle + + case(TASK_FACTORIZE_COLUMN) ! Factorize and solve + dblk = task%dest + bcol = blocks(dblk)%bcol + node = blocks(dblk)%node + + ! + ! We handle leaf nodes seperatly to non-leaf nodes. The lack of + ! children from which delays and updates can be inherited allows + ! considerable simplifications compared to the case of a non-leaf + ! node. + ! In particular we construct the entries in a columnwise fashion + ! for a leaf node, whereas a non-leaf node has the entries added + ! in a rowwise fashion, and is copied to colwork in a columnwise + ! fashion at the same time delays are incoporated. + ! (Delays are held columnwise after the rowwise portion of lcol + ! that holds the eliminated columns) + ! + if(nodes(node)%nchild.eq.0 .and. lfact(bcol)%local.eq.1) then + ! Leaf node + blkm = lfact(bcol)%nrow + blkn = blocks(dblk)%blkn + + if(size(colwork).lt.blkm*blkn) then + deallocate(colwork,stat=st) + allocate(colwork(blkm*blkn),stat=st) + if (st.ne.0) goto 100 + endif + + ! Leaf node - no blocks touched yet, mark them as touched and zero + ! them in blk_col_add_a_leaf. + do blk = dblk, blocks(dblk)%last_blk + m = blocks(blk)%blkm + maxm_local = max(m, maxm_local) + blocks(blk)%touched = .true. + end do + + lfact(bcol)%blkn_new = blocks(dblk)%blkn + + deallocate (lfact(bcol)%d,stat=st) + deallocate (lfact(bcol)%index_new,stat=st) + allocate (lfact(bcol)%d(2*blkm), & + lfact(bcol)%index_new(blkm),stat=st) + if (st.ne.0) goto 100 + lfact(bcol)%index_new(:) = nodes(node)%index(:) + + i = blocks(dblk)%last_blk + blocks(dblk:i)%sa_new = blocks(dblk:i)%sa + + ! delay_col is number of delayed columns that have been added to + ! the block col. + delay_col = 0 + + ! Expand original matrix entries into colwork + call blk_col_add_a_leaf(val, lmap(bcol), invp, nodes(node), & + blocks(dblk), colwork, blkm, scale=scale) + else ! node has children + ! If any blocks haven't been touched, zero them (eg first column) + do blk = dblk, blocks(dblk)%last_blk + m = blocks(blk)%blkm + maxm_local = max(m, maxm_local) + if(blocks(blk)%touched) cycle + n = blocks(blk)%blkn + lfact(bcol)%lcol(blocks(blk)%sa:blocks(blk)%sa+m*n-1) = zero + blocks(blk)%touched = .true. + end do + + ! Add original matrix entries to updates accummulated in lcol + call blk_col_add_a(lfact(bcol)%local, val, & + lmap(bcol), invp, nodes(node), blocks(dblk), lfact(bcol)%lcol, & + scale=scale) + + ! Merge any delays into column + ! On exit, blkm and blkn hold the number of rows and cols + ! in the enlarged block col. + call merge_delays(nodes, blocks, lfact, pos, dblk, blkm, blkn, & + tstats, colwork, st) + if (st.ne.0) then + info = MA86_ERROR_ALLOCATION + call MA86_print_flag(info, control, context='MA86_factor',st=st) + return + end if + + ! delay_col is number of delayed columns that have been added to + ! the block col. + delay_col = blkn - blocks(dblk)%blkn + + ! Handle diagonal block maxm carefully to include delays + m = blocks(dblk)%blkm + delay_col + maxm_local = max(maxm_local, m) + endif + + if(size(work).lt.blkm*blkn) then + deallocate(work,stat=st) + allocate(work(blkm*blkn),stat=st) + if (st.ne.0) goto 100 + endif + ! Perform actual factorization + call factor_solve_block(blkm, blkn, blkn, delay_col, & + colwork, blkm*blkn, work, lfact(bcol)%d, map, lfact(bcol)%nelim, & + tstats, control, flag) + if(flag.lt.0) then + if (flag.eq.-13) then + ! IEEE infinity detected + info = MA86_ERROR_INFINITY + else + info = MA86_ERROR_UNKNOWN + end if + call MA86_print_flag(info, control, context='MA86_factor') + return + endif + + call col_to_row(blkm,lfact(bcol)%nelim,lfact(bcol),colwork,st) + if (st.ne.0) goto 100 + + ! Work out number of flops and entries in factor + do i = 0, lfact(bcol)%nelim-1 + tstats%num_flops = tstats%num_flops + (blkm-i)**2 + tstats%num_factor = tstats%num_factor + (blkm-i) + end do + +! Use pos to take temporary copy (because f95 compiler with -O is giving me +! wrong answer if I use following) FIXME check this does cause problems +! (it did in ma77) +! lfact(bcol)%index_new(1:blkn) = lfact(bcol)%index_new(map(1:blkn)) + pos(1:blkn) = lfact(bcol)%index_new(1:blkn) + do i = 1,blkn + lfact(bcol)%index_new(i) = pos(map(i)) + end do + pos(1:blkn) = 0 + + ! store the number of delayed pivots (note: nodes(node)%num_delay will + ! get overwritten by value for the last block col. in node + ! and this is what we have to pass to parent node) + ! This is accumulated into tstats%num_delay in merge_delays + ! if (blkn - lfact(bcol)%nelim.ne.0) & + ! write(6,*) 'num_delay',node,blkn-lfact(bcol)%nelim + nodes(node)%num_delay = blkn - lfact(bcol)%nelim + + ! Do the right thing if we're singular + if(tstats%num_zero_pivots.ne.0) then + if(control%action) then + ! Continue but raise a warning + if(info.ne.MA86_WARNING_SINGULAR .and. & + info.ne.MA86_WARNING_POOL_SING) then + if(info.eq.MA86_WARNING_POOL_SMALL) then + info = MA86_WARNING_POOL_SING + else + info = MA86_WARNING_SINGULAR + endif + ! Note: we don't print out a warning here as we only want to + ! print it once (not once per thread). We do so instead + ! at the end of the parallel section + endif + else + ! Abort with an error + info = MA86_ERROR_SINGULAR + call MA86_print_flag(info, control, context='MA86_factor') + return + endif + endif + + ! if we are doing a combined factor_solve, use the factorization + ! to do a solve + if(nrhs.gt.0) then + ! Ensure work is large enough + if(size(work).lt.lfact(bcol)%nelim*nrhs) then + deallocate(work, stat=st) + allocate(work(lfact(bcol)%nelim*nrhs), stat=st) + if(st.ne.0) goto 100 + endif + + ! Ensure xlocal is large enough + if(size(xlocal).lt.nrhs*maxm_local) then + deallocate(xlocal, stat=st) + allocate(xlocal(nrhs*maxm_local), stat=st) + if(st.ne.0) goto 100 + endif + + blk = dblk + call fwd_solve_bcol(bcol, blk, 1, lfact, blocks, & + nrhs, rhs, ldr, work, lfact(bcol)%nelim, xlocal, rhs_local, & + control, this_thread, total_threads) + endif + + ! + ! add update tasks + ! + +!$OMP FLUSH + + call add_updates_new(stack, map, nodes, blocks, & + dblk, blocks(dblk)%node, control, info, st) + if(info.lt.0) return + + case(TASK_UPDATE_INTERNAL) ! update one block by two others + ! in the same node. If pivots have been delayed, we can + ! only update by the number of pivots selected. + + blk = task%dest + n = blocks(blk)%blkn + m = blocks(blk)%blkm + sa = blocks(blk)%sa + bcol = blocks(blk)%bcol + + ! src1 and src2 belong to same block column. + ! They have m1 and m2 rows. + + m1 = blocks(task%src1)%blkm + m2 = blocks(task%src2)%blkm + + bcol_src = blocks(task%src1)%bcol + + ! n1 is the number of columns in source block column bcol_src. + n1 = lfact(bcol_src)%blkn_new + + ! nelim is the number of update operations (ie number of + ! eliminations performed in the source block). Note that it can be 0. + nelim = lfact(bcol_src)%nelim + + ! determine position of the source blocks within bcol_src + sa1 = swizzle_sa(blocks(task%src1)%sa_new, n1, nelim) + sa2 = swizzle_sa(blocks(task%src2)%sa_new, n1, nelim) + + if (nelim.gt.0) then + if(size(work).lt.n1*m1) then ! Resize work array for calc_ld + deallocate(work) + allocate(work(n1*m1),stat=st) + if(st.ne.0) goto 100 + endif + call update_block_block(m, n, nelim, & + lfact(bcol)%lcol(sa:sa+n*m-1), blocks(blk), nelim, & + lfact(bcol_src)%lcol(sa1:sa1+nelim*m1-1), & + lfact(bcol_src)%lcol(sa2:sa2+nelim*m2-1), & + lfact(bcol_src)%d, work, & + control) + endif + + ! reduce dependency count for bcol + call reduce_block_dep(stack, lfact(bcol), control, info, st) + if(info.lt.0) return + + case(TASK_UPDATE_BETWEEN) ! update a block with information from + ! another node + + blk = task%dest + bcol = blocks(task%dest)%bcol + + ! task%src1 is a block in the source node + ! bcol_src is the block col. it belongs to + ! slocal is the the local index of the block col. within source node + + bcol_src = blocks(task%src1)%bcol + slocal = lfact(bcol_src)%local + n1 = lfact(bcol_src)%blkn_new + + nelim = lfact(bcol_src)%nelim + if (nelim.gt.0) then + call update_between(blk, nodes(blocks(blk)%node), & + n1, nelim, lfact(bcol_src)%index_new, lfact(bcol)%lcol, & + lfact(bcol_src)%lcol, lfact(bcol_src)%d, & + blocks, col_list, row_list, buffer, control, info, st, & + slocal, nodes(blocks(task%src1)%node), work) + endif + if(info.lt.0) return + + ! reduce dependency count for bcol + call reduce_block_dep(stack, lfact(bcol), control, info, st) + if(info.lt.0) return + + !case default + ! info = MA86_ERROR_UNKNOWN + ! call MA86_print_flag(info, control, context='MA86_factor') + ! exit + end select + + end do + + return + 100 continue + info = MA86_ERROR_ALLOCATION + call ma86_print_flag(info, control, context='MA86_factor',st=st) + return + +end subroutine task_dispatch + +!************************************************ + +! +! Before we can do the factor_solve, we have to add in columns +! from delayed pivots. Treat the case of first block column in node +! separately (since must pick up delays from children) +! +subroutine merge_delays(nodes, blocks, lfact, pos, dblk, blkm_new, & + blkn_new, tstats, work, st) + type(node_type), dimension(-1:), intent(in) :: nodes ! Node info + type(block_type), dimension(:), intent(inout) :: blocks ! block info + ! For each block in the block column, the component sa_new is set + ! and other components are unchanged. + type(lfactor), dimension(:), intent(inout) :: lfact + integer, dimension(:), intent(inout) :: pos ! + ! used for mapping from child nodes into node + integer(long), intent(in) :: dblk ! block on diagonal + integer, intent(out) :: blkm_new ! new number of rows in the block col. + integer, intent(out) :: blkn_new ! new number of columns in the block col. + type(thread_info), intent(inout) :: tstats ! thread stats + real(wp), dimension(:), allocatable, target, intent(inout) :: work + integer, intent(out) :: st ! stat parameter + + integer :: bcol + integer :: bcol_cnode ! last block column in child node + integer :: blk + integer :: blkn ! set to blocks(dblk)%blkn + integer :: cblkn ! + integer :: cblkm ! + integer :: cnum_delay ! number of delays at child node + integer :: cnelim ! no. of eliminations at child node + integer :: cnode ! a child of node + integer :: cnrow + integer(long) :: en_child ! identifier of last block in child node + integer :: i + integer :: ip + integer :: ip1 + integer :: ipd + integer :: j + integer :: jj + integer :: k + integer :: lindex ! size of array index_new (holds indices in block col). + integer :: l_nb ! block size + integer :: local ! local index of block col. + integer :: nd ! number of delayed pivots (set once only and not changed) + integer :: num_delay ! number of delayed pivots (used as temporary) + integer :: nelim ! number of eliminations + integer :: nrow ! number of rows in block col. + integer :: node + integer :: nvar + integer :: nzl ! size of nodes(node)%index(:) + integer :: sa + integer(long) :: size_bcol ! size of block col. when reallocated to + ! allow for delays + integer :: size_d ! number of entries in D + logical :: do_copy ! flag indicating if delays are present + + ! bcol and node are block column and node that task%dest belongs to + bcol = blocks(dblk)%bcol + node = blocks(dblk)%node + blkn = blocks(dblk)%blkn + nrow = lfact(bcol)%nrow + + num_delay = 0 + local = lfact(bcol)%local + + ! Count any delays from previous blk col of this node + if(local .ne. 1) then + ! blkn_new is no. of columns in previous block col. + ! Set num_delay to number of delayed pivots to pass from bcol-1 to bcol + blkn_new = lfact(bcol-1)%blkn_new + nelim = lfact(bcol-1)%nelim + num_delay = blkn_new - nelim + endif + + ! Count any delays from child nodes (don't always hit first col of a node!) + cnode = lfact(bcol)%delay_head + do while(cnode.ne.-1) + num_delay = num_delay + nodes(cnode)%num_delay + tstats%num_delay = tstats%num_delay + nodes(cnode)%num_delay + cnode = nodes(cnode)%delay_next + end do + nd = num_delay + + do_copy = (nd.ne.0) ! If there are no delays things are easier + lfact(bcol)%blkn_new = blkn + nd + blkn_new = lfact(bcol)%blkn_new + blkm_new = nrow + nd + size_bcol = blkm_new * blkn_new + + ! + ! allocate storage for L and D + ! allocate new array for permuted variable list for block col. + ! (including delays from children) + ! + ! Array index_new holds index list for block col. + + size_d = 2*(blocks(dblk)%blkm + nd) ! diagonal pivots + + lindex = blkm_new + + deallocate (lfact(bcol)%d,stat=st) + deallocate (lfact(bcol)%index_new,stat=st) + allocate (lfact(bcol)%d(size_d), & + lfact(bcol)%index_new(lindex),stat=st) + if (st.ne.0) return + + if(size(work).lt.size_bcol) then + deallocate(work,stat=st) + allocate(work(size_bcol),stat=st) + if (st.ne.0) return + endif + + ! Copy any delays from previous column of this node into index list + num_delay = 0 + if(local .ne. 1) then + cnelim = lfact(bcol-1)%nelim + cnum_delay = lfact(bcol-1)%blkn_new - cnelim + lfact(bcol)%index_new(num_delay+1:num_delay+cnum_delay) = & + lfact(bcol-1)%index_new(cnelim+1:cnelim+cnum_delay) + num_delay = num_delay + cnum_delay + endif + + ! Copy any delays from child nodes into index list + cnode = lfact(bcol)%delay_head + do while(cnode .ne. -1) + cnum_delay = nodes(cnode)%num_delay + + ! determine which block column was the final block column of + ! the child cnode. en_child is last block in child node. + en_child = nodes(cnode)%blk_en + bcol_cnode = blocks(en_child)%bcol + cnelim = lfact(bcol_cnode)%nelim + + lfact(bcol)%index_new(num_delay+1:num_delay+cnum_delay) = & + lfact(bcol_cnode)%index_new(cnelim+1:cnelim+cnum_delay) + + num_delay = num_delay + cnum_delay + + ! Move to next child with potential delays + cnode = nodes(cnode)%delay_next + end do + + nzl = size(nodes(node)%index) + lfact(bcol)%index_new(nd+1:lindex) = & + nodes(node)%index(nzl-lindex+nd+1:nzl) + + ! Compute new block starts so that block can be located within expanded + ! block column. + sa = 1 + blocks(dblk)%sa_new = sa + sa = sa + (blocks(dblk)%blkm+nd) * blkn_new + if (blocks(dblk)%last_blk.gt.dblk) then + blocks(dblk+1)%sa_new = sa + sa = sa + blocks(dblk+1)%blkm * blkn_new + do blk = dblk+2, blocks(dblk)%last_blk + blocks(blk)%sa_new = sa + sa = sa + blocks(blk)%blkm * blkn_new + end do + end if + + ! + ! The remainder only applies if a copy is required (i.e. there are delays). + ! + if(.not. do_copy) then + ! Need to zero upper triangular part to avoid innocous compiler messages + ! NB: Following loop could be removed to maximize performance. + do i = 1, blkn_new + work((i-1)*blkm_new+1:(i-1)*blkm_new+blkn_new) = 0.0 + end do + call row_to_col(blkm_new,blkn_new,lfact(bcol)%lcol,work) + return + endif + + ! copy contents of lcol into work (held by cols) + ip = nd*blkm_new + ip1 = 0 + ! Note: If we ONLY recieve entries from previous column of same node + ! then all entries are overwritten and don't need to be set to zero. + if(lfact(bcol)%delay_head.ne.-1) then + ! Entries coming from child nodes in addition to any from this node's + ! previous columns. Not all locations are overwritten, so set all + ! entries in delayed columns to zero. + work(1:ip) = zero + endif + + ! copy columns from original version of block column + do i = 1,blkn + ! Following line zeroes part of column above diagonal, it is + ! not strictly required, but avoids various innocous undefined + ! variable errors. + work(ip+1:ip+nd) = zero + ip = ip + nd + work(ip+1:ip+nrow) = & + lfact(bcol)%lcol(ip1+1:blkn*nrow:blkn) + ip = ip + nrow + ip1 = ip1 + 1 + end do + + num_delay = 0 + if(local.ne.1) then + ! copy delayed columns from previous block column (bcol-1) + cnelim = lfact(bcol-1)%nelim + cnum_delay = lfact(bcol-1)%blkn_new - cnelim + cblkm = lfact(bcol-1)%nrow + & + ( lfact(bcol-1)%blkn_new - blocks(lfact(bcol-1)%dblk)%blkn ) + ip = 0 + ip1 = (cblkm+1) * cnelim + do i = 1, cnum_delay + ! Add rows matching expected elimination in bcol + work(ip+1:ip+cnum_delay) = & + lfact(bcol-1)%lcol(ip1+1:ip1+cnum_delay) + ! Note: If we inherit from children there may be some zero rows + ! to skip before adding remaining rows + work(ip+nd+1:ip+nd+nrow) = & + lfact(bcol-1)%lcol(ip1+cnum_delay+1:ip1+cnum_delay+nrow) + ip = ip + blkm_new + ip1 = ip1 + cblkm + end do + num_delay = num_delay + cnum_delay + endif + + if(lfact(bcol)%delay_head .ne. -1) then + ! copy delayed columns from each of the children of node + + ! set up mapping array pos + nvar = size(nodes(node)%index) + l_nb = nodes(node)%nb + do i = 1+l_nb*(local-1),nvar + j = nodes(node)%index(i) + pos(j) = i + nd - l_nb*(local-1) + end do + + ! Iterate over children + cnode = lfact(bcol)%delay_head + do while(cnode.ne.-1) + cnum_delay = nodes(cnode)%num_delay + if (cnum_delay == 0) then + cnode = nodes(cnode)%delay_next + cycle + endif + ! determine which block column was the final block column of + ! the child cnode. en_child is last block in child node. + en_child = nodes(cnode)%blk_en + bcol_cnode = blocks(en_child)%bcol + cnelim = lfact(bcol_cnode)%nelim + cblkn = lfact(bcol_cnode)%blkn_new + cblkm = lfact(bcol_cnode)%nrow + & + (lfact(bcol_cnode)%blkn_new-blocks(lfact(bcol_cnode)%dblk)%blkn) + + ! set cnrow to hold total number of rows in block column + cnrow = size(lfact(bcol_cnode)%index_new) + + ip = num_delay*blkm_new + ip1 = (cblkm+1) * cnelim + do j = 1, cnum_delay + ! Rows corresponding to delays + ipd = ip + num_delay + work(ipd+j:ipd+cnum_delay) = & + lfact(bcol_cnode)%lcol(ip1+1:ip1+(cnum_delay-j+1)) + ! Rows in child corresponding to expected rows of node + ip1 = ip1 + (cnum_delay-j+1) + 1 + do i = cnelim+cnum_delay+1, cnrow + k = lfact(bcol_cnode)%index_new(i) + jj = pos(k) ! ith row of child maps to row jj in node + work(ip+jj) = & + lfact(bcol_cnode)%lcol(ip1) + ip1 = ip1 + 1 + end do + ip = ip + blkm_new + ip1 = ip1 + cnelim + j-1 + end do + + num_delay = num_delay + cnum_delay + cnode = nodes(cnode)%delay_next + end do + + ! reset pos + do i = 1+l_nb*(local-1),nvar + j = nodes(node)%index(i) + pos(j) = 0 + end do + + end if + ! free up space that was used by lcol + deallocate(lfact(bcol)%lcol,stat=st) + +end subroutine merge_delays + +integer function swizzle_sa(sa, blkn, nelim) + integer, intent(in) :: sa + integer, intent(in) :: blkn + integer, intent(in) :: nelim + + swizzle_sa = (sa-1) / blkn + swizzle_sa = nelim *swizzle_sa + 1 +end function swizzle_sa + +!************************************************* + +! +! This routine adds internal update tasks before +! adding inter-nodal updates. +! It is called after the factor_solve has been performed +! for the block column lcol that dblk belongs to (lcol +! block col. within node). +! +subroutine add_updates_new(stack, map, nodes, blocks, dblk, snode, & + control, info, st) + type(taskstack), intent(inout) :: stack ! holds tasks that have to be done. + integer, dimension(*), intent(inout) :: map ! used for inter-nodal updates. + type(node_type), dimension(-1:), intent(in) :: nodes + type(block_type), dimension(*), intent(inout) :: blocks + integer(long), intent(in) :: dblk ! diagonal block in block col. + integer, intent(in) :: snode ! node to which block col. belongs + type(MA86_control), intent(in) :: control + integer, intent(inout) :: info ! error flag + integer, intent(inout) :: st ! stat parameter + + integer(long) :: i + integer(long) :: last ! id of final block that generates an update + ! within node + integer :: j + integer :: nb ! block size nodes(node)%nb + integer :: nbcol ! number of block cols in node + integer :: numcol ! number of cols in node + integer :: numrow ! number of rows in node + integer :: sz ! number of blocks in first block col of node + type(dagtask) :: task + + ! Work out useful information on blocks in snode + nb = nodes(snode)%nb + numrow = size(nodes(snode)%index) + numcol = nodes(snode)%en - nodes(snode)%sa + 1 + + ! + ! Determine final block that generates an update within node + ! (it is the last block in a block row that has diagonal elements) + ! + ! sz is number of (row) blocks in the first block column of node + ! nbcol is the number of block cols in node + + sz = (numrow - 1) / nb + 1 + nbcol = (numcol - 1) / nb + 1 + last = blocks(dblk)%last_blk - (sz - nbcol) + + ! add the UPDATE_INTERNAL tasks (if any) from this block column. + + call zero_task(task) + task%task_type = TASK_UPDATE_INTERNAL + + do j = dblk+1, last + task%src1 = j + task%dest = get_dest_block(blocks(j), blocks(j)) + do i = j, blocks(dblk)%last_blk + task%src2 = i + call add_task(stack, task, control, info, st) + if(info.lt.0) return + task%dest = task%dest + 1 + end do + end do + + ! add UPDATE_BETWEEN tasks. + + call add_between_updates_simple(nodes, blocks, dblk, snode, & + stack, map, control, info, st) + +end subroutine add_updates_new + +!************************************************* + +! +! Add internodal updates +! Do this by moving up the elimination tree comparing row indices each time. +! +subroutine add_between_updates_simple(nodes, blocks, src, snode, & + stack, map, control, info, st) + type(node_type), dimension(-1:), intent(in) :: nodes + type(block_type), dimension(*), intent(inout) :: blocks + integer(long), intent(in) :: src ! Id of a block in the + ! block col where factor_solve just done (can be any block + ! in the block col ... we in fact pass the diagonal block). + integer, intent(in) :: snode ! node that src belongs to. + type(taskstack), intent(inout) :: stack ! holds tasks that have to be done. + integer, dimension(*), intent(inout) :: map ! Workarray to hold map from row + ! indices to block indices in ancestor node. + type(MA86_control), intent(in) :: control + integer, intent(inout) :: info + integer, intent(inout) :: st + + type(dagtask) :: task ! Used to send a task to the pool + integer :: a_nb ! Block size of anode + integer :: anode ! Ancestor of snode + integer :: cb ! Local index of column block in anode + integer :: cptr ! Position in snode of the first row + ! matching a column of the current block column of anode. + integer(long) :: d_anode ! id of diagonal block of anode + integer :: i + integer :: jb ! Block index in anode + integer :: jlast ! Last column in the cb-th block column of anode + integer :: k + integer :: k1 + integer :: numcol ! number of cols in snode + integer :: size_anode ! size(nodes(anode)%index) + integer :: size_snode ! size(nodes(snode)%index) + + logical :: map_done ! True if map has been build for anode + + call zero_task(task) + task%task_type = TASK_UPDATE_BETWEEN + task%src1 = src + + ! cache some values in variables + size_snode = size(nodes(snode)%index) + + anode = nodes(snode)%parent + numcol = nodes(snode)%en - nodes(snode)%sa + 1 + ! initialise cptr to point to first row below triangular part of snode. + cptr = 1 + numcol + + do while(anode.gt.0) + + ! Skip columns that come from other children + do cptr = cptr, size_snode + if(nodes(snode)%index(cptr).ge.nodes(anode)%sa) exit + end do + if(cptr.gt.size_snode) exit ! finished with snode + + map_done = .false. ! We will only build a map when we need it + a_nb = nodes(anode)%nb + + ! Loop over affected block columns of anode + bcols: do + + if(nodes(snode)%index(cptr).gt.nodes(anode)%en) exit + + ! compute local index of block column in anode and find the id of + ! its diagonal block + cb = (nodes(snode)%index(cptr) - nodes(anode)%sa)/a_nb + 1 + d_anode = nodes(anode)%blk_sa + do jb = 2, cb + d_anode = blocks(d_anode)%last_blk + 1 + end do + + ! Build a map of ancestor's blocks + if(.not.map_done) then + ! The indices for each row block in anode are mapped to a local row + ! block index. + size_anode = size(nodes(anode)%index) + jb = 1 + do i = 1, size_anode, a_nb + do k = i, min(i+a_nb-1, size_anode) + k1 = nodes(anode)%index(k) + map(k1) = jb + end do + jb = jb + 1 + end do + endif + + ! Loop over remaining rows of snode, adding update_between + ! task for each row block in current block col. of anode + ! corresponding to rows of snode + jb = -1 + do i = cptr, size_snode + k1 = nodes(snode)%index(i) + k = map(k1) + if(k.ne.jb) then + task%dest = d_anode + k - cb + call add_task(stack, task, control, info, st) + if(info.lt.0) return + ! block k in anode dealt with so set jb to avoid reconsideration + jb = k + endif + end do + + ! Move cptr to first row in another block of anode + jlast = min(nodes(anode)%sa + cb*a_nb - 1, nodes(anode)%en) + do cptr = cptr, size_snode + if(nodes(snode)%index(cptr) > jlast) exit + end do + if(cptr.gt.size_snode) exit + + end do bcols + + ! Move up the tree + anode = nodes(anode)%parent + end do + +end subroutine add_between_updates_simple + +!************************************************* +! +! Reduce the given dependency of a block column lcol by 1; +! if it is then zero add the resultant factor_solve task +! to the local task stack (or, if full, to task pool) +! +subroutine reduce_block_dep(stack, lcol, control, info, st) + type(taskstack), intent(inout) :: stack ! holds tasks that have to be done. + ! it is altered if the dependency for block column is reduced to 0. + type(lfactor), intent(inout) :: lcol ! block column for which + ! dependency count is to be reduced + type(MA86_control), intent(in) :: control + integer, intent(inout) :: info ! error flag + integer, intent(inout) :: st ! stat parameter + + ! Local + type(dagtask) :: task ! used to hold the task to be added + + ! acquire the lock for the block column +!$ call omp_set_lock(lcol%lock) + + ! Decrement dep count + lcol%dep = lcol%dep - 1 + ! + ! If dep count is zero then add the factor_solve task + ! + if(lcol%dep.ne.0) then +!$ call omp_unset_lock(lcol%lock) + return + endif + + lcol%dep = - 1 + + call zero_task(task) + + task%task_type = TASK_FACTORIZE_COLUMN + + task%dest = lcol%dblk + + call add_task(stack, task, control, info, st) + ! If info is non-zero we're about to return anyway + +!$ call omp_unset_lock(lcol%lock) + +end subroutine reduce_block_dep + +!************************************************* + +subroutine solve_task_dispatch(nbcol, lfact, stack, blocks, & + nodes, counts, control, info, st, nrhs, ldr, rhs, total_threads, & + rhs_local, maxmn, job) + integer, intent(in) :: nbcol ! Size of lfact (no. block cols) + type(lfactor), dimension(nbcol), intent(inout) :: lfact ! Entries in + ! block columns of L + type(taskstack), intent(inout) :: stack ! task pool + type(block_type), dimension(:), intent(inout) :: blocks ! block info + type(node_type), dimension(-1:), intent(in) :: nodes ! Node info + type(slv_count_type), dimension(:), intent(inout) :: counts + type(MA86_control), intent(in) :: control + integer, intent(out) :: info ! error flag + integer, intent(out) :: st ! stat parameter + integer, intent(in) :: nrhs ! number of right-hand sides (maybe = 0) + integer, intent(in) :: ldr ! leading extent of rhs + real(wp), intent(inout) :: rhs(ldr*nrhs) ! On entry holds rhs data. + ! Overwritten by partial solution (forward substitution performed). + integer, intent(in) :: total_threads ! number of threads + real(wp), intent(inout) :: rhs_local(ldr*nrhs,0:total_threads-1) ! Local + ! right-hand side arrays (one for each thread). + integer, intent(in) :: maxmn ! max block dimension (=maxmn) + integer, intent(in) :: job + + integer :: bcol ! block col that task%dest belongs to + integer(long) :: blk ! task%dest + integer :: col ! global index of fist col. in dcol + integer :: i ! loop variable + integer :: j ! loop variable + integer :: m ! set to blocks(blk)%blkm (number of rows in blk) + integer :: n ! set to blocks(blk)%blkn (number of columns in blk and dblk) + integer :: node + integer :: r ! current right hand side, 0 indexed + integer :: sa ! set to blocks(blk)%sa + type(dagtask) :: task + !%%% integer :: t_start, t_end + integer :: this_thread + + real(wp), dimension(:), allocatable :: evars ! elimination variables + real(wp), dimension(:), allocatable :: xlocal ! update_buffer workspace + + integer :: idx_offset, nelim, offset_local, offset_rhs, s + + this_thread = 0 +!$ this_thread = omp_get_thread_num() + + ! Initialize things + info = 0; st = 0 ! By default everything went OK + call zero_task(task) ! Set everything to zero + task%task_type = TASK_NONE ! Needs to be set to prevent + ! dispatched incrementing + + allocate(xlocal(maxmn*nrhs), evars(ldr*nrhs), stat=st) + if (st.ne.0) then + info = MA86_ERROR_ALLOCATION + call MA86_print_flag(info, control, context='MA86_solve',st=st) + return + end if + + ! Mark thread as active +!$ call omp_set_lock(stack%lock) + stack%active = stack%active + 1 +!$ call omp_unset_lock(stack%lock) + + ! + ! Main loop + ! + do + ! + ! Retrieve next task to perform and wait till all is ready + ! +!%%% if(control%unit_log.gt.0) call system_clock(t_start) + + call get_task(stack, task, control, info, st) + if(info.lt.0) return + + !write(6, "(i3,2a)") & + ! this_thread, " got task ",print_job(task) + +!%%% if(control%unit_log.gt.0) then +!%%% call system_clock(t_end) +!%%% call log_task(control, this_thread, t_start, t_end, "GT", & +!%%% int(task%task_type,long)) +!%%% endif + +!$OMP FLUSH(stack,rhs) + + ! + ! Perform task and update dependencies + ! + select case(task%task_type) + case(TASK_DONE) + exit + + case(TASK_NONE) ! Job not finished but no tasks available, spin. + cycle + + case(TASK_SLV_FSLV) ! Forwards solve with node + node = task%dest + + ! set blk to be first block in node + blk = nodes(node)%blk_sa + + ! each pass of this loop deals with a block column in node + do while(blk.le.nodes(node)%blk_en) + ! Establish variables describing block column + bcol = blocks(blk)%bcol + col = lfact(bcol)%col + + call fwd_solve_bcol(bcol, blk, col, lfact, blocks, nrhs, & + rhs, ldr, evars, ldr, xlocal, rhs_local, control, & + this_thread, total_threads) + end do ! block column + +!$OMP FLUSH + + if(nodes(node)%parent .gt. 0) then +!$ call omp_set_lock(counts(nodes(node)%parent)%lock) + counts(nodes(node)%parent)%dep = & + counts(nodes(node)%parent)%dep - 1 + if(counts(nodes(node)%parent)%dep .eq. 0) then + task%task_type = TASK_SLV_FSLV + task%dest = nodes(node)%parent + call add_task(stack, task, control, info, st) + if(info.lt.0) return + endif +!$ call omp_unset_lock(counts(nodes(node)%parent)%lock) + endif + + ! If we are a root node and need to do a backwards solve, add the + ! relevant task + if(job.ne.SOLVE_JOB_FWD .and. nodes(node)%parent.eq.-1) then + task%task_type = TASK_SLV_BSLV + task%dest = node + call add_task(stack, task, control, info, st) + if(info.lt.0) return + endif + + case(TASK_SLV_BSLV) ! Backward solve with node + node = task%dest + + ! Loop over block columns + blk = nodes(node)%blk_en + do while(blk.ge.nodes(node)%blk_sa) + ! Establish variables describing block column + bcol = blocks(blk)%bcol + n = lfact(bcol)%blkn_new + nelim = lfact(bcol)%nelim + s = n - blocks(blk)%blkn + col = lfact(bcol)%col + + ! Zero relevant part of rhs_local + do r = 1, nrhs + offset_local = (r-1)*ldr + col - 1 + do i = 1, nelim + rhs_local(i+offset_local,0) = zero + end do + end do + + ! Loop over blocks in column + do blk = blk, blocks(blk)%dblk+1, -1 + m = blocks(blk)%blkm + sa = swizzle_sa(blocks(blk)%sa_new, n, nelim) + + idx_offset = blk - blocks(blk)%dblk ! block row, 0 indexed + idx_offset = 1 + s + idx_offset * nodes(node)%nb + + call slv_bwd_update(m, nelim, col, idx_offset, & + lfact(bcol)%index_new, & + lfact(bcol)%lcol(sa:sa+m*nelim-1), & + nelim, nrhs, rhs, rhs_local(:,0), ldr, xlocal, control, & + blocks(blk)%id) + end do + + ! Determine properties of diagonal block + m = blocks(blk)%blkm + s + col = lfact(bcol)%col + + ! Perform any retangular update from diagonal block + if(m.gt.nelim) then + sa = 1 + nelim*nelim + call slv_bwd_update(m-nelim, nelim, col, nelim+1, & + lfact(bcol)%index_new, & + lfact(bcol)%lcol(sa:sa+(m-nelim)*nelim-1), nelim, & + nrhs, rhs, rhs_local(:,0), ldr, xlocal, control, & + blocks(blk)%id) + endif + + ! Add in b and perform diagonal solve (if required) + if(job.eq.SOLVE_JOB_BWD) then + ! No diagonal solve + do r = 1, nrhs + offset_rhs = (r-1)*ldr + offset_local = offset_rhs + col - 1 + do i = 1, nelim + j = lfact(bcol)%index_new(i) + rhs_local(i+offset_local,0) = & + rhs_local(i+offset_local,0) + rhs(j+offset_rhs) + end do + end do + else + ! Add and do diagonal solve simultaneously + do r = 1, nrhs + offset_rhs = (r-1)*ldr + offset_local = offset_rhs + col - 1 + if(nelim.gt.0) & + call solve_add_D(nelim, lfact(bcol)%d, rhs(offset_rhs+1), & + rhs_local(offset_local+1,0), lfact(bcol)%index_new) + end do + endif + + ! Perform triangular solve + call slv_solve_bwd(nelim, nelim, col, & + lfact(bcol)%lcol(1:nelim*nelim), & + nrhs, rhs_local(:,0), ldr, control, blocks(blk)%id) + + ! Permute rhs_local into rhs + do r = 1, nrhs + offset_rhs = (r-1)*ldr + offset_local = offset_rhs + col - 1 + do i = 1, nelim + j = lfact(bcol)%index_new(i) + rhs(j+offset_rhs) = rhs_local(i+offset_local,0) + end do + end do + + blk = blk - 1 + end do ! loop over block columns + +!$OMP FLUSH + + ! Add bwd solves for child nodes + task%task_type = TASK_SLV_BSLV + do j = 1, nodes(node)%nchild + task%dest = nodes(node)%child(j) + call add_task(stack, task, control, info, st) + if(info.lt.0) return + end do + case default + info = MA86_ERROR_UNKNOWN + call MA86_print_flag(info, control, context='MA86_factor') + !if(control%diagnostics_level.ge.0 .and. control%unit_error.ge.0) & + ! write(control%unit_error, "(/a,i3,a,i8)") & + ! " MA86_factor: Internal Error ", info, & + ! " Unknown task type encountered type = ", task%task_type + exit + end select + + end do +end subroutine solve_task_dispatch + +!************************************************* + +subroutine fwd_solve_bcol( & + bcol, blk, col, lfact, blocks, nrhs, rhs, ldr, & + evars, lde, xlocal, rhs_local, control, this_thread, total_threads) + integer, intent(in) :: bcol ! block column to perform fwd solve on + integer(long), intent(inout) :: blk ! on entry: first block of bcol, + ! on exit: (final block of bcol) + 1 + integer, intent(in) :: col ! offset into rhs workspace + type(lfactor), dimension(*), intent(inout) :: lfact ! Entries in + ! block columns of L + type(block_type), dimension(:), intent(inout) :: blocks ! block info + integer, intent(in) :: nrhs ! number of right hand sides + integer, intent(in) :: ldr ! leading dimension of rhs + real(wp), dimension(nrhs*ldr), intent(inout) :: rhs ! right hand side + ! vector + integer, intent(in) :: lde ! leading dimension of evars + real(wp), dimension(nrhs*lde), intent(inout) :: evars ! workspace to + ! store contigous version of rhs in (potentially shared) + real(wp), dimension(*), intent(out) :: xlocal ! local workspace. Must be + ! of size at least nrhs*nelim + integer, intent(in) :: total_threads ! total number of threads running in + ! parallel + real(wp), dimension(nrhs*ldr, 0:total_threads-1), intent(inout) :: & + rhs_local ! per thread accumulation vectors + type(MA86_control), intent(in) :: control + integer, intent(in) :: this_thread + + integer :: i ! temporary variable + integer :: j ! temporary variable + integer :: idx_offset ! offset into index + integer :: m ! number of rows in block + integer :: n ! leading dimension of column + integer :: nelim ! number of eliminated variables + integer :: offset_rhs ! offset into rhs + integer :: offset_local ! offset into local workspace + integer :: r ! loop index (over right hand sides) + integer :: s ! number of extra variables in block due to delays + integer :: sa ! start of block within bcol + integer :: t ! loop index (over threads) + + ! Establish variables describing block column + n = lfact(bcol)%blkn_new + nelim = lfact(bcol)%nelim + idx_offset = 1 + + do r = 1, nrhs + offset_rhs = (r-1)*ldr + offset_local = (r-1)*lde + col - 1 + do i = 1, nelim + j = lfact(bcol)%index_new(i) + evars(i+offset_local) = rhs(j+offset_rhs) + end do + do t = 0, total_threads-1 + do i = 1, nelim + j = lfact(bcol)%index_new(i) + evars(i+offset_local) = evars(i+offset_local) + & + rhs_local(j+offset_rhs, t) + end do + end do + end do + + ! s is the number of extra rows/cols in bcol because of delays + s = n - blocks(blk)%blkn + m = blocks(blk)%blkm + s + call slv_solve_fwd(nelim, nelim, col, & + lfact(bcol)%lcol(1:nelim*nelim), & + nrhs, evars, lde, control, blocks(blk)%id) + idx_offset = idx_offset + nelim + + ! Permute rhslocal back in to rhs (rhslocal is still used later) + do r = 1, nrhs + offset_rhs = (r-1)*ldr + offset_local = (r-1)*lde + col - 1 + do i = 1, nelim + j = lfact(bcol)%index_new(i) + rhs(j+offset_rhs) = evars(i+offset_local) + end do + end do + + m = m - nelim + if(m.gt.0) then + sa = 1 + nelim*nelim + call slv_fwd_update(m, nelim, col, idx_offset, & + lfact(bcol)%index_new, & + lfact(bcol)%lcol(sa:sa+m*nelim-1), nelim, nrhs, & + rhs_local(:,this_thread), ldr, evars, lde, xlocal, & + control, blocks(blk)%id) + idx_offset = idx_offset + m + endif + + ! loop over remaining blocks in the block column bcol + do blk = blocks(blk)%dblk+1, blocks(blk)%last_blk + m = blocks(blk)%blkm + sa = swizzle_sa(blocks(blk)%sa_new, n, nelim) + + call slv_fwd_update(m, nelim, col, idx_offset, & + lfact(bcol)%index_new, & + lfact(bcol)%lcol(sa:sa+m*nelim-1), nelim, nrhs, & + rhs_local(:,this_thread), ldr, evars, lde, xlocal, & + control, blocks(blk)%id) + idx_offset = idx_offset + m + end do +end subroutine fwd_solve_bcol + +!************************************************* + +! +! Returns the destination block of an internal update task. +! Called by add_updates. +! +integer(long) function get_dest_block(src1, src2) + type(block_type), intent(in) :: src1 + type(block_type), intent(in) :: src2 + + integer(long) :: i + integer :: sz + + ! Move to diagonal block of target column + ! sz is the number of (row) blocks in src1 + sz = src1%last_blk - src1%dblk + 1 + get_dest_block = src1%dblk + do i = src1%dblk+1, src1%id + get_dest_block = get_dest_block + sz + sz = sz - 1 + end do + + ! Move to relevant row block in target col. + get_dest_block = get_dest_block + src2%id - src1%id + +end function get_dest_block + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! Numerical block operation routines +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +! +! performs factorization of trapezoidal matrix. +! based on hsl_ma64 version 6.0.0 (ported 18th January 2011) +! +subroutine factor_solve_block(n, p, nb, s, a, la, buf, d, perm, & + q, tstats, control, flag) + integer, intent(in) :: n ! number of rows in trapeziodal matrix + integer, intent(in) :: p ! number of cols in trapeziodal matrix + integer, intent (in) :: nb ! Block size + integer, intent(in) :: s ! number of cols in trapeziodal matrix that + ! are from delayed pivots. These cols are searched last for pivots. + integer :: la ! size of array lcol + real(wp), intent(inout) :: a(la) ! holds trapezoidal matrix + ! to be factorized. Holds the factorization on exit. + ! Delayed columns are permuted to the final columns. Held rowwise + ! at all times. + real (wp) :: buf(nb*n) ! Work array + real (wp), intent (out) :: d(2*p) ! d(1:2*q) is set to hold the inverse + ! of D, except that zero diagonal blocks (pivots) are not inverted. + ! Diagonal entries are in d(1:2*q-1:2) and entries to the right of + ! the diagonal are in d(2:2*q-2:2). d(2*q) is set to zero. + integer, intent(inout) :: perm(:) ! perm array. Input ignored. + ! On return, for i = 1, 2, ..., p, perm(i) is set to the index + ! of the row of A that is permuted to row i. + integer, intent(out) :: q ! number of pivots chosen + type(thread_info), intent(inout) :: tstats + type(MA86_control), intent(in) :: control + integer, intent(out) :: flag + + ! .. Local Scalars .. + real(wp) abs_amax ! Largest absolute value to left of diagonal in row m. + real(wp) amax ! Entry of largest absolute value to left of diagonal in + ! row m. + real(wp) amax2 ! Second largest absolute value to left of diagonal in row m + real(wp) amaxm1 ! Largest absolute value below diagonal in column m, not + ! including row m+1 + real(wp) amaxb ! Largest absolute value below diagonal in column m + real(wp) amaxt ! Largest absolute value in column t. + real(wp) amaxt_cache ! Largest absolute value in column m-1 (used as cache). + integer deti ! Determinant held as detr*radix**deti + real(wp) detpiv ! Determinant of candidate pivot is detpiv/detscale. + real(wp) detpiv0 ! First term in calculation of detpiv. + real(wp) detpiv1 ! Second term in calculation of detpiv. + real(wp) detpiv2 ! Value of detpiv for best candidate 2x2 pivot. + real(wp) detr ! Scaled determinant + real(wp) detscale ! Inverse of the largest entry in the candidate pivot. + real(wp) detscale2 ! Value of detscale for best candidate 2x2 pivot. + integer i ! Row index + integer j ! Column index + integer(long) k ! Position in a + integer(long) kkj ! Position of diagonal of column j + integer(long) kkt ! Position of diagonal of column t + integer(long) kkr1 ! Position of diagonal of column r+1 + integer(long) kkq ! Start of the pivotal block column + integer(long) kkq1 ! Position of diagonal of column q+1 + integer(long) kkm ! Position of diagonal of column m + integer(long) kq1 ! Position in buf of diagonal of column q+1 + integer lq ! Height of the pivot block + integer m ! Column searched most recently + integer mbest ! Column with best relative pivot value for a 1x1 pivot + integer mbest1, mbest2 ! Pair with best relative pivot value for a 2x2 pivot + integer mdummy ! Loop execution count + integer mlast ! Last column of the block in which m appears + integer nbi ! Inner block size + integer pivsiz ! Size of the chosen pivot, 0 if none chosen, or -1 + ! if column is essentially zero + real(wp) pivval ! temporary variable for storing pivotal value + integer qlast ! Last column of the inner block containing column q+1 + integer r ! Number of pivot operations applied to columns q+1:p + integer rm ! Number of pivot operations applied to the (outer) block + ! containing column m + real(wp) rmax ! Largest entry in column m + real(wp) rmax2 ! Largest entry in column m outwith rows m,m-1. + integer t ! Candidate 2x2 pivot is in columns t and m + real(wp) u ! Relative pivot threshold + real(wp) ubest1 ! Relative pivot value of best candidate 1x1 pivot + real(wp) ubest2 ! Relative pivot value of best candidate 2x2 pivot + real(wp) urel ! Relative pivot value + real(wp) umin ! Minimum relative pivot threshold + integer :: nzero ! Number of zero pivots since last non-zero pivot + + flag = 0 + !if (n < 0) then + ! flag = -1 + !else if (p < 0) then + ! flag = -2 + !else if (p > n) then + ! flag = -3 + !else if (nbi <= 1) then + ! flag = -4 + !else if ( la < min(n*int(n,long),(n*(n+nb+1_long))/2) ) then + ! flag = -7 + !else if (control%static < control%small .and. control%static/=zero) then + ! flag = -10 + !else if (mod(nb,nbi) /= 0) then + ! flag = -12 + !end if + + !info%detlog = zero + !info%num_neg = 0 + !info%num_nothresh = 0 + !info%num_perturbed = 0 + !info%num_zero = 0 + !info%num_2x2 = 0 + + ! u is reset to control%u for each block column, but may then be relaxed to + ! umin on a block column by block column basis + u = min(max(control%u,zero),one) + + nbi = control%nbi + if(nbi.le.1) nbi = nbi_default ! Ensure positive + + umin = min(max(control%umin,zero),u) + if (p==n) umin = min(umin,0.5_wp) + q = 0 + if (flag/=0 .or. p==0) return + deti = 0 + detr = 1.0_wp + lq = n + kkq1 = 1 + kkq = 1 + m = p + qlast = min(nbi,p) + ! m is updated at the start of the main loop so initializing it to p causes + ! it to have the value 1 during the first execution of that loop. + + do j = 1, p + perm(j) = j + end do + + !print * + !print *, "=======================" + !print *, "factor n, p, s = ", n, p, s + !print *, "a input = " + !print "(11es12.4)", a + + if (s>0 .and. sp) then + ! Go back to column q+1 + m = q+1 + kkm = kkq1 + r = q + rm = q + else if (m<1+nb) then + ! Within the current block column + kkm = kkm + lq + 1 + end if + + ! Update column m + kkr1 = kkq1 + (rm-q)*(lq+1_long) + k = kkr1+m-rm-1 + if(q>rm) then + call dgemv('NoTrans',n-m+1,q-rm,one,a(k),lq, & + buf(n*(rm+0_long)+m),n,one,a(kkm),1) + end if + + ! Find largest and second largest entry to left of diagonal in row m. + j = q + 1 + k = kkq1 + m - j - n + amax = zero + abs_amax = zero + amax2 = zero + t = 0 + if (jabs_amax) then + t = j + amax2 = abs(amax) + amax = a(k) + abs_amax = abs(a(k)) + kkt = k - (m-j) + else + !amax2 = max(abs(a(k)),amax2) + if(abs(a(k)).gt.amax2) amax2 = abs(a(k)) + end if + end do + + ! Now calculate largest entry below the diagonal of column m. + amaxm1 = zero + amaxb = zero + !do i = m+1,n + ! amaxb = max(abs(a(kkm+i-m)),amaxb) + !end do + if(n-m.ge.1) amaxb = abs(a(kkm+1)) + do k = kkm+2,kkm+n-m + if(abs(a(k)).gt.amaxm1) amaxm1 = abs(a(k)) + end do + if(amaxm1.gt.amaxb) amaxb = amaxm1 + + ! Now calculate largest entry in the whole of column m and make sure + ! that it is neither small nor infinity. + !rmax = max(abs_amax,abs(a(kkm)),amaxb) + rmax = abs_amax + if(abs(a(kkm)).gt.rmax) rmax = abs(a(kkm)) + if(amaxb.gt.rmax) rmax = amaxb + if (rmax<=control%small) then + ! All entries of the column are small + a(kkm) = zero + tstats%num_zero_pivots = tstats%num_zero_pivots + 1 + pivsiz = -1 + perm(m) = abs(perm(m)) + exit sweep + else if (rmax > huge(zero)) then + ! There is an infinity in the column + flag = -13 + return + end if + + ! Calculate the relative pivot value and see if it is the best so far + if (abs(a(kkm))>control%small) then + urel = abs(a(kkm))/rmax + else + urel = zero + end if + if (urel >= ubest1) then + ubest1 = urel + mbest = m + end if + + ! If there is a candidate 2x2 pivot, try it. + ! Look for a 1x1 pivot only if the 2x2 pivot is unacceptable. + tgt0: if (t>0) then + if( min(abs(a(kkm)),abs(a(kkt))).gt.control%small .or. & + abs_amax.ge.control%small) then + + ! Store value of the largest entry in whole of column m outwith + ! rows m and t + rmax2 = max(amax2,amaxb) + + detscale = one/max( abs(a(kkm)), abs(a(kkt)), abs_amax ) + detpiv1 = (amax*detscale)*amax + detpiv0 = a(kkm)*detscale*a(kkt) + detpiv = detpiv0 - detpiv1 + ! Make sure that the 2x2 pivot is not singular and that there is + ! little cancellation in calculating detpiv. Bearing in mind the + ! way detscale is calculated, if the largest entry of the matrix + ! is chosen as pivot, the one entry of the reduced matrix has + ! absolute value abs(detpiv). + !print *, "test 2x2 = ", detpiv, detpiv0, detpiv1 + left2x2:if (abs(detpiv)> & + max(control%small,abs(detpiv0)/2,abs(detpiv1)/2)) then + + ! Find largest entry in column t outwith rows m and t + if(t.eq.m-1 .and. amaxt_cache.ne.-1) then + ! Use cached answer from scan of previous column + amaxt = amaxt_cache + else + amaxt = zero + j = q + 1 + k = kkq1 + t - j - lq + do j = q+1, t-1 + k = k + lq + amaxt = max(abs(a(k)),amaxt) + end do + k = k + lq + do i = t+1,m-1 + amaxt = max(abs(a(k+i-t)),amaxt) + end do + do i = m+1,n + amaxt = max(abs(a(k+i-t)),amaxt) + end do + endif + + ! OK as 2x2 pivot if all entries in the rest of the columns + ! are small + if(max(rmax2,amaxt)<=control%small) then + pivsiz = 2 + exit sweep + end if + + ! Calculate the relative pivot value (as 2x2 pivot) + urel = abs(detpiv)/max( & + abs(a(kkm)*detscale)*amaxt+(abs_amax*detscale)*rmax2, & + abs(a(kkt)*detscale)*rmax2+(abs_amax*detscale)*amaxt ) + !print *, "urel2x2 = ", urel + + ! OK as 2x2 pivot if relative pivot value is big enough + if (urel>u) then + pivsiz = 2 + tstats%usmall = min(urel,tstats%usmall) + exit sweep + end if + + ! If this has the best relative pivot value so far, record + ! this + if(urel>ubest2)then + ubest2 = urel + detpiv2 = detpiv + detscale2 = detscale + mbest1 = m + mbest2 = t + !print *, "store 2x2", m, t, urel + end if + end if left2x2 + end if + end if tgt0 + amaxt_cache = max(abs_amax, amaxm1) + + ! If 2x2 pivot rejected or only one column left, take best 1x1 pivot + ! if it is OK. + if(t>0 .or. m==p) then + !print *, " test 1x1 ubest1 = ", ubest1 + if (ubest1>u) then + !if(t>0) print *, "accept 1x1 rather than 2x2" + pivsiz = 1 + tstats%usmall = min(ubest1,tstats%usmall) + if (mbest/=m) & + call swap_cols(n,nb,q,1,rm,a,buf,perm,mbest,m) + exit sweep + end if + end if + end do sweep + + ! + ! At this stage following variables should have good values: + ! m - pivot column (wil be swapped to posn q+1 for 1x1 or q+2 for 2x2) + ! q - number of pivots already performed + ! kkq1 - posn in a of diagonal of col q+1 + ! t - other pivot column for 2x2 (t=umin) then + if (ubest1>=ubest2) then + ! Accept 1x1 pivot + u = min(u,ubest1) + tstats%usmall = min(ubest1,tstats%usmall) + pivsiz = 1 + if (mbest/=m) & + call swap_cols(n,nb,q,1,rm,a,buf,perm,m,mbest) + else + ! Accept 2x2 pivot + u = min(u,ubest2) + tstats%usmall = min(ubest2,tstats%usmall) + pivsiz = 2 + ! Revise m to q+1 + m = q+2 + kkm = kkq1+lq+1 + detpiv = detpiv2 + detscale = detscale2 + t = min(mbest1,mbest2) + if (t/=q+1) call swap_cols(n,nb,q,1,rm,a,buf,perm,q+1,t) + t = max(mbest1,mbest2) + if (t/=q+2) call swap_cols(n,nb,q,1,rm,a,buf,perm,q+2,t) + t = q+1 + end if + + else if (control%static>0) then + ! Perform static pivoting if this has been requested + if (mbest/=m) & + call swap_cols(n,nb,q,1,rm,a,buf,perm,m,mbest) + pivsiz = 1 + tstats%num_nothresh = tstats%num_nothresh + 1 + if (abs(a(kkm)) < control%static) then + a(kkm) = sign(control%static,real(a(kkm),wp)) + tstats%num_perturbed = tstats%num_perturbed + 1 + tstats%usmall = -one + else + tstats%usmall = min(ubest1,tstats%usmall) + end if + end if + end if pivsiz0 + + pivsizes: if (pivsiz==1) then + !print *, "1x1 pivot on ", m + nzero = 0 ! pivot found, reset recent zero count + amaxt_cache = -1 ! mark cache as invalid + ! Swap columns if m not q+1 + if (q+1/=m) call swap_cols(n,nb,q,1,rm,a,buf,perm,q+1,m) + ! We store D**-1. + !print *, "1x1 pivot ", a(kkq1), "(col ", m, ")" + d(2*q+1) = one/a(kkq1) + d(2*q+2) = zero + ! Update tstats + !tstats%detlog = tstats%detlog + log(abs(a(kkq1))) + deti = deti + exponent(detr) + exponent(abs(a(kkq1))) + detr = fraction(detr)*fraction(abs(a(kkq1))) + if (a(kkq1)=j) then + call dgemm('n','t',n-j+1,m-j+1,2,one,a(kkq1+j-q-1), & + n-((q+1)/nb)*nb,buf(kq1+j-q-1),n,one,a(kkj),lq) + end if + ! Update q and kkq1 + kkq1 = k + lq + 1 + q = q + 2 + + else if (pivsiz==-1) then pivsizes + !print *, "ZERO pivot" + nzero = nzero + 1 ! count zero pivot + amaxt_cache = -1 ! mark cache as invalid + ! Handle a row that is zero + if (q+1/=m) call swap_cols(n,nb,q,1,rm,a,buf,perm,q+1,m) + !print *, "fail piv" + d(2*q+1) = zero + d(2*q+2) = zero + ! Store L in A and -LD in buf + kq1 = q+1+(q+0_long)*n + buf(kq1) = zero + a(kkq1) = one + do i = 1, n-q-1 + buf(kq1+i) = zero + a(kkq1+i) = zero + end do + kkq1 = kkq1 + lq + 1 + q = q+1 + end if pivsizes + + if (q>=qlast) then + ! Inner block is complete + ! Update columns (m+1:min(p,m1+nb-1)) for pivots rm+1:qlast (BLAS3) + mlast = min(p,nb) + if (m perform operations into buffer with BLAS + + ndiag = 0 + call dgemm('T', 'N', int(s1en-s1sa+1), int(s2en-s2sa+1), nelim, & + -one, ldwork, nelim, lcol_src(i), nelim, zero, buffer, col_list_sz) + + ! + ! Apply update + ! + + ! Acquire lock on destination block +!$ call omp_set_lock(blocks(dest)%alock) + + if(.not.blocks(dest)%touched) then + ! Zero block + lcol( blocks(dest)%sa : & + blocks(dest)%sa+blocks(dest)%blkn*blocks(dest)%blkm-1 ) = zero + blocks(dest)%touched = .true. + endif + + ndiag = 0 + if(blocks(dest)%id .eq. blocks(dest)%dblk) ndiag = int(s1en-s1sa+1) + call expand_buffer(lcol(blocks(dest)%sa), blocks(dest)%blkn, row_list, & + row_list_sz, col_list, col_list_sz, ndiag, buffer) + + ! Release lock +!$ call omp_unset_lock(blocks(dest)%alock) + + else + ! Low flop/buffer ratio => perform update operation directly + ! set ndiag if dest is a diagonal block + ndiag = 0 + if(blocks(dest)%id .eq. blocks(dest)%dblk) ndiag = int(s1en-s1sa+1) + +!$ call omp_set_lock(blocks(dest)%alock) + + if(.not.blocks(dest)%touched) then + ! Zero block + lcol( blocks(dest)%sa : & + blocks(dest)%sa+blocks(dest)%blkn*blocks(dest)%blkm-1 ) = zero + blocks(dest)%touched = .true. + endif + + call update_direct(lcol, lcol_src, ldwork, blocks(dest)%sa, & + blocks(dest)%blkn, 1, i, nelim, nelim, row_list, row_list_sz, & + col_list, col_list_sz, ndiag) + +!$ call omp_unset_lock(blocks(dest)%alock) + + endif + +!%%%if(control%unit_log.gt.0) then +!%%% call system_clock(t_end) +!%%% this_thread = 0 +!%%%!$ this_thread = omp_get_thread_num() +!%%% call log_task(control, this_thread, t_start, t_end, "UB", dest, & +!%%% int(snode%sa,long), int(scol,long)) +!%%%endif + +end subroutine update_between + +!************************************************* + +! +! Performs an update_between task directly rather than via a buffer. +! +subroutine update_direct(lcol, lcol_src, lcold_src, dsa, blkn, s1sa, s2sa, & + srcn, nelim, row_list, rls, col_list, cls, ndiag) + real(wp), dimension(*), intent(inout) :: lcol ! holds block + ! column of factor L that destination block belongs to + real(wp), dimension(*), intent(in) :: lcol_src ! holds block + ! column of factor L that the source blocks belong to + real(wp), dimension(*), intent(in) :: lcold_src ! holds block + ! column of factor LD that the source blocks belong to + integer, intent(in) :: dsa ! posn of the first entry of the + ! destination block within lcol + integer, intent(in) :: blkn ! number of columns in lcol + integer, intent(in) :: s1sa ! points to first row in source block csrc + integer, intent(in) :: s2sa ! points to first row in source block rsrc + integer, intent(in) :: srcn ! number of columns in lcol_src + integer, intent(in) :: nelim ! number of eliminations performed + ! in the source block column (nelim = srcn if no delayed pivots). + integer, intent(in) :: rls ! size of row_list + integer, intent(in) :: row_list(rls) ! local row indices for + ! rows in rsrc (= local row indices for dest) + integer, intent(in) :: cls ! size of col_list + integer, intent(in) :: col_list(cls) ! local row indices for + ! rows in csrc (= local column indices for dest) + integer, intent(in) :: ndiag ! Number of triangular rows of update + + integer :: cptr + integer :: i + integer :: j + integer :: k1, k2, k3, k4, l + integer :: rptr + real(wp) :: work1, work2, work3, work4 + + ! Note: ndiag is either equal to 0 or, if dest is a diagonal block, it + ! is equal to the number of cols cls in dest block (and this is + ! equal to the number of rows rls in dest). + ! first treat the case when dest is on the diagonal. + ! loop over the rows of dest + do j = 1, ndiag + cptr = dsa + (row_list(j)-1) * blkn - 1 + rptr = s2sa + (j-1) * srcn + do i = 1, j + k1 = s1sa + (i-1) * nelim + work1 = zero + do l = rptr, rptr + nelim - 1 + work1 = work1 + lcold_src(k1)*lcol_src(l) + k1 = k1 + 1 + end do + k1 = cptr + col_list(i) + lcol(k1) = lcol(k1) - work1 + end do + end do + + ! Now consider the case when dest is not a diagonal block + do j = ndiag+1, rls + cptr = dsa + (row_list(j)-1) * blkn - 1 + rptr = s2sa + (j-1) * srcn + i = 4*int(cls/4) + do i = 1, i, 4 + k1 = s1sa + (i+0-1) * nelim + k2 = s1sa + (i+1-1) * nelim + k3 = s1sa + (i+2-1) * nelim + k4 = s1sa + (i+3-1) * nelim + work1 = zero; work2 = zero; work3 = zero; work4 = zero + do l = rptr, rptr + nelim - 1 + work1 = work1 + lcold_src(k1)*lcol_src(l); k1 = k1 + 1 + work2 = work2 + lcold_src(k2)*lcol_src(l); k2 = k2 + 1 + work3 = work3 + lcold_src(k3)*lcol_src(l); k3 = k3 + 1 + work4 = work4 + lcold_src(k4)*lcol_src(l); k4 = k4 + 1 + end do + k1 = cptr + col_list(i+0); lcol(k1) = lcol(k1) - work1 + k2 = cptr + col_list(i+1); lcol(k2) = lcol(k2) - work2 + k3 = cptr + col_list(i+2); lcol(k3) = lcol(k3) - work3 + k4 = cptr + col_list(i+3); lcol(k4) = lcol(k4) - work4 + end do + i = 4*int(cls/4) + 1 + do i = i, cls + k1 = s1sa + (i-1) * nelim + work1 = 0 + do l = rptr, rptr + nelim - 1 + work1 = work1 + lcold_src(k1)*lcol_src(l) + k1 = k1 + 1 + end do + k1 = cptr + col_list(i) + lcol(k1) = lcol(k1) - work1 + end do + end do + +end subroutine update_direct + +!************************************************* + +! +! Optimised sparse expansion by lists +! Entry buffer(i,j) gets added to a(row_list(i),col_list(j)) +! Note: by uncommenting the i2 and mm_prefetch lines we can speed this up +! for the Intel compiler by explicitly prefetching the next row. +! +subroutine expand_buffer(a, blkn, row_list, rls, col_list, cls, ndiag, buffer) + real(wp), dimension(*), intent(inout) :: a ! holds L + integer, intent(in) :: blkn ! number of cols in destination block + integer, intent(in) :: rls ! size of row_list + integer, intent(in) :: row_list(rls) + integer, intent(in) :: cls ! size of col_list + integer, intent(in) :: col_list(cls) + integer, intent(in) :: ndiag ! Number of triangular rows of update + real(wp), intent(in) :: buffer(rls*cls) + + integer :: i, j, k, rptr, cptr + !integer :: i2 + + rptr = 1 + do j = 1, ndiag + cptr = 1 + (row_list(j)-1)*blkn - 1 + do i = 1, j + k = cptr + col_list(i) + a(k) = a(k) + buffer(rptr) + rptr = rptr + 1 + end do + rptr = rptr + (cls-j) + end do + do j = ndiag+1, rls-1 + cptr = (row_list(j)-1) * blkn + !i2 = (row_list(j+1)-row_list(j)) * blkn + do i = 1, cls + k = cptr + col_list(i) + a(k) = a(k) + buffer(rptr) + !call mm_prefetch(a(k+i2),1) + rptr = rptr + 1 + end do + end do + + if(ndiag.lt.rls) then + cptr = (row_list(rls)-1) * blkn + do i = 1, cls + k = cptr + col_list(i) + a(k) = a(k) + buffer(rptr) + rptr = rptr + 1 + end do + endif + +end subroutine expand_buffer + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +! +! Update columns jl:jr for pivots pl:pr +! This was based on a routine within ma64. +! +subroutine ma64_update(n,nb,kkq,a,buf,jl,jr,pl,pr) + integer, intent(in) :: n + integer, intent(in) :: nb + integer(long), intent(in) :: kkq + real(wp), intent(inout) :: a(*) + real(wp), intent(in) :: buf(*) + integer, intent(in) :: jl,jr,pl,pr + + ! Local variables + integer i + integer j ! column index + integer j2 + integer p + integer(long) kkj ! Position of diagonal j + + integer, parameter :: bs=64 ! block size for update + + j = max(jl,1) + j2 = min(nb,jr) + + if(n.lt.j .or. j2.lt.j .or. pl.gt.pr) return + + do i = 1, j2-j+1, bs + kkj = 1 + (j-1+i-1)*(n+1_long) + p = min(bs, j2-j+1-i+1) + call dgemm ('n', 't', n-j+1-i+1, p, pr-pl+1, one, & + a(kkq+j-1+n*(pl-1)+i-1), n, buf(j+n*(pl-1)+i-1), n, & + one, a(kkj), n) + end do + +end subroutine ma64_update + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +! +! Swap columns. It may be assumed that 1<=j1 a(j2, 1:j1-1) + l = j1-1 + if (l>0) call dswap(l,a(k1),n,a(k2),n) + + ! calulate values for next phase + d1 = k1 + l*int(n,long) + k1 = d1 + 1 + k2 = k2 + l*int(n,long) + n + + ! Swap columns with rows + ! i.e. a(j1+1:j2-1, j1) <-> a(j2, j1+1:j2-1) + jb = j2-j1-1 + l = min(jb,nb-j1,j2-1) + if (l>0.and.j2.ge.1) call dswap(l,a(k1),1,a(k2),n) + + ! set up values for next phase + d2 = k2 + l*int(n,long) + k2 = d2 + 1 + k1 = k1 + l + 1 + + ! Swap the diagonals + ! i.e. a(j1,j1) <-> a(j2,j2) + temp = a(d1) + a(d1) = a(d2) + a(d2) = temp + + ! Swap columns + ! i.e. a(j2+1:n,j1) <-> a(j2+1:n,j2) + if (n>j2) call dswap(n-j2,a(k1),1,a(k2),1) + +end subroutine swap_cols + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +! +! Solves ( D ) x = b +! ( I ) +! +! where D is block diagonal of size q with blocks of size 1 and 2. +! This is taken from the ma64 package. +! +subroutine solveD(n,q,b,d) + integer, intent (in) :: n ! Matrix order + integer, intent (in) :: q ! Order of L (and D) + real (wp), intent (inout) :: b(n) ! b(n) holds the right-hand + ! sides on entry and is overwritten by the solution. + real (wp), intent (in) :: d(2*q) ! Holds the inverse of D, + ! except that zero diagonal blocks (pivots) are not inverted. + ! Diagonal entries are in d(1:2*q-1:2) and entries to the right of + ! the diagonal are in d(2:2*q-2:2). + + ! .. Locals .. + integer :: j ! Column index + real (wp) :: temp + + ! Apply operations associated with D + j = 1 + do + if (j>q) exit + if (d(2*j)==zero) then + ! 1x1 pivot + b(j) = b(j)*d(2*j-1) + j = j + 1 + else + ! 2x2 pivot + temp = b(j)*d(2*j-1) + b(j+1)*d(2*j) + b(j+1) = b(j)*d(2*j) + b(j+1)*d(2*j+1) + b(j) = temp + j = j + 2 + end if + end do +end subroutine solveD + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +! +! Adds D^-1 rhs(index(1:q)) to rhs_local(1:q) +! +subroutine solve_add_D(q,d,rhs,rhs_local,index) + integer, intent (in) :: q ! Order of L (and D) + real (wp), intent (in) :: d(2*q) ! Holds the inverse of D, + ! except that zero diagonal blocks (pivots) are not inverted. + ! Diagonal entries are in d(1:2*q-1:2) and entries to the right of + ! the diagonal are in d(2:2*q-2:2). + real(wp), intent(in) :: rhs(*) + real(wp), intent(inout) :: rhs_local(*) + integer, intent(in) :: index(*) + + ! .. Locals .. + integer i ! Column index into rhs + integer i2 ! Column index into rhs for (j+1) + integer j ! Column index into rhs_local + + ! Apply operations associated with D + j = 1 + do while(j.le.q) + i = index(j) + if (d(2*j)==zero) then + ! 1x1 pivot + rhs_local(j) = rhs_local(j) + rhs(i)*d(2*j-1) + j = j + 1 + else + ! 2x2 pivot + i2 = index(j+1) + rhs_local(j) = rhs_local(j) + rhs(i)*d(2*j-1) + rhs(i2)*d(2*j) + rhs_local(j+1) = rhs_local(j+1) + rhs(i)*d(2*j) + rhs(i2)*d(2*j+1) + j = j + 2 + end if + end do +end subroutine solve_add_D + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +! +! This subroutine updates the dependency count for blocks in the ancestor +! anode of snode. +! +subroutine calc_dep(cptr, snode, anode, nodes, blocks, swidth, map) + integer, intent(inout) :: cptr + ! pointer into the row indices for snode. On entry points + ! to the first row corresponding to the column set for anode. + ! On exit, updated ready for the next ancestor. + ! It could feasibly point beyond the column set for anode if + ! there are no entries for anode's columns in the row set of snode. + integer, intent(in) :: snode ! node + integer, intent(in) :: anode ! ancestor of snode + type(node_type), dimension(-1:), intent(in) :: nodes ! node info + type(block_type), dimension(:), intent(inout) :: blocks ! block info. On + ! exit, dependency count updated + integer, intent(in) :: swidth ! number of block cols in snode + integer, dimension(:), intent(in) :: map ! For each row k in j-th + ! block column of anode, map(k) is set to j + + integer :: cb ! index of block column in anode + integer(long) :: dblk ! id of diagonal block in anode + integer :: jlast ! last column of block in anode + integer :: nb ! set to nodes(anode)%nb (block size for anode) + integer :: i, jb, k, k1 + integer :: size_snode ! number of rows in snode + + nb = nodes(anode)%nb + size_snode = size(nodes(snode)%index) + do + if(cptr.gt.size_snode) exit + if (nodes(snode)%index(cptr).gt.nodes(anode)%en) exit + + ! Find block column of anode + cb = 1 + (nodes(snode)%index(cptr) - nodes(anode)%sa) / nb + + ! Find diagonal block in block column cb + + ! loop over block columns. blocks(dblk)%last_blk is the last + ! block in the block column to which dblk belongs and + ! so blocks(dblk)%last_blk + 1 is first block in the next + ! block column, which is the diagonal block in that block column + + dblk = nodes(anode)%blk_sa ! first block in anode + do i = 1, cb-1 + dblk = blocks(dblk)%last_blk + 1 + end do + + ! Increment dep count for each block involved. + ! loop over rows in snode + jb = -1 ! Last block + do i = cptr, size_snode + k1 = nodes(snode)%index(i) + k = map(k1) + ! k is local block number. When we reach a new block, + ! we increment dep by the number of block columns in snode + ! (since each block col. in snode will have to update this block) + if(k.ne.jb) blocks(dblk+k-cb)%dep_initial = & + blocks(dblk+k-cb)%dep_initial + swidth + jb = k + end do + + ! Move cptr to first row in another block of anode + jlast = min(nodes(anode)%sa + cb*nb - 1, nodes(anode)%en) + do cptr = cptr, size_snode + if(nodes(snode)%index(cptr) > jlast) exit + end do + + end do + +end subroutine calc_dep + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +! +! Initialize the task pool, which is held using a variable of derived +! type taskstack +! +subroutine init_stack(stack, pool_size, control, info, st) + type(taskstack), intent(out) :: stack ! see description of derived type + integer, intent(in) :: pool_size + type(MA86_control), intent(in) :: control ! see description of derived type + integer, intent(out) :: info ! error flag. Only possible error is + ! an allocation error + integer, intent(out) :: st ! stat parameter + + ! local variables + integer :: i + integer :: ncache + integer :: total_threads + + + ! Initialise + info = 0; st = 0 + total_threads = 1 +!$ total_threads = omp_get_max_threads() + + stack%pool_size = pool_size + stack%total = 0 + stack%active = 0 + stack%freehead = 1 + stack%abort = .false. + + ncache = calc_cache(total_threads-1, control) + + deallocate(stack%ctasks,stat=st) + deallocate(stack%cheads,stat=st) +!$ deallocate(stack%clocks,stat=st) + deallocate(stack%tasks,stat=st) +!**deallocate(stack%waiting,stat=st) + deallocate(stack%next,stat=st) + + allocate(stack%ctasks(control%cache_tq_sz, ncache), & + stack%cheads(ncache), & +!$ stack%clocks(ncache), & + stack%tasks(pool_size), & + stack%next(pool_size), & +!** stack%waiting(0:total_threads-1), & + stat=st) + if (st.ne.0) then + info = MA86_ERROR_ALLOCATION + return + end if + +!$ call omp_init_lock(stack%lock) + + ! Initialise stack + do i = 1, stack%pool_size-1 + stack%next(i) = i + 1 + end do + stack%next(stack%pool_size) = -1 +!**stack%waiting(:) = 0.0 + stack%cheads(:) = 0 + stack%prihead(1:4) = -1 ! empty + +!$ do i = 1, ncache +!$ call omp_init_lock(stack%clocks(i)) +!$ end do + +end subroutine init_stack + +!************************************************* + +! +! Free any resources involved in task pool +! +subroutine cleanup_stack(stack) + type(taskstack), intent(inout) :: stack ! see description of derived type + + ! local variables +!$ integer :: i ! temporary variable + integer :: st ! stat parameter + +!$ if(allocated(stack%tasks)) call omp_destroy_lock(stack%lock) + + deallocate(stack%tasks,stat=st) + deallocate(stack%ctasks,stat=st) + deallocate(stack%cheads,stat=st) +!**deallocate(stack%waiting,stat=st) + deallocate(stack%next,stat=st) + +!$ if(allocated(stack%clocks)) then +!$ do i = 1, size(stack%clocks) +!$ call omp_destroy_lock(stack%clocks(i)) +!$ end do +!$ deallocate(stack%clocks,stat=st) +!$ endif + +end subroutine cleanup_stack + +!************************************************* + +! +! This subroutine ensures all components of task are defined +! +subroutine zero_task(task) + type(dagtask), intent(out) :: task + + task%task_type = 0 + task%dest = 0 + task%src1 = 0 + task%src2 = 0 + task%csrc(:) = 0 + task%rsrc(:) = 0 +end subroutine zero_task + +!************************************************* + +! +! Add a task to the local stack or the task pool. +! In fact we add it to the cache's local stack, if this is full then it +! gets thrown to the task pool. +! +subroutine add_task(stack, task, control, info, st) + type(taskstack), intent(inout) :: stack ! holds local stacks and task pool + type(dagtask), intent(in) :: task ! task to be added + type(MA86_control), intent(in) :: control + integer, intent(inout) :: info + integer, intent(inout) :: st + + ! Possible error returns are info = MA86_ERROR_ALLOCATION + ! Possible warnings are info = MA86_WARNING_POOL_SMALL, + ! MA86_WARNING_POOL_SING + + integer :: cache, i, j, this_thread + + this_thread = 0 +!$ this_thread = omp_get_thread_num() + + cache = calc_cache(this_thread, control) + +!$ call omp_set_lock(stack%clocks(cache)) + + if(stack%cheads(cache).eq.control%cache_tq_sz) then + ! Local stack is full. + ! Clear lower half of stack to task pool. +!$ call omp_set_lock(stack%lock) + do i = 1, control%cache_tq_sz / 2 + call add_task_g(stack, stack%ctasks(i,cache), & + control, info, st, locked=.true.) + if(info.lt.0) then +!$ call omp_unset_lock(stack%lock) +!$ call omp_unset_lock(stack%clocks(cache)) + return + endif + end do +!$ call omp_unset_lock(stack%lock) + j = 1 + do i = control%cache_tq_sz / 2 + 1, control%cache_tq_sz + stack%ctasks(j,cache) = stack%ctasks(i,cache) + j = j + 1 + end do + stack%cheads(cache) = stack%cheads(cache) - control%cache_tq_sz / 2 + endif + + ! Add to top of local stack + stack%cheads(cache) = stack%cheads(cache) + 1 + stack%ctasks(stack%cheads(cache), cache) = task + +!$ call omp_unset_lock(stack%clocks(cache)) + +end subroutine add_task + +!************************************************* + +! +! Add a task to the task pool at a given priority. +! The tasks have different priorities and those with the same +! priority are held within the pool using a linked list +! +subroutine add_task_g(stack, task, control, info, st, locked) + type(taskstack), intent(inout) :: stack ! holds local stacks and task pool + type(dagtask), intent(in) :: task ! task to be added to task pool. + type(MA86_control), intent(in) :: control + integer, intent(inout) :: info ! error flag (only possible error is + ! an allocation error) + integer, intent(inout) :: st ! stat parameter + logical, optional, intent(in) :: locked ! indicates whether stack%lock + ! is set. If not present, stack%lock will be set and then unset before + ! return + + ! Possible error return is info = MA86_ERROR_ALLOCATION + ! Possible warning is info = MA86_WARNING_POOL_SMALL, + ! MA86_WARNING_POOL_SING + + integer :: i + integer :: insert ! holds free location in task pool + integer :: priority ! priority of task + type(dagtask), dimension(:), allocatable :: temp_tasks ! only allocated if + ! task pool is full and has to be reallocated, in which case + ! temp_task is used to hold a temporary copy. + integer, dimension(:), allocatable :: temp_next ! used only if + ! task pool has to be increased in size. + + ! set priority according to type of task + select case(task%task_type) + case(TASK_FACTORIZE_COLUMN) + priority = 1 + case(TASK_UPDATE_INTERNAL) + priority = 3 + case(TASK_UPDATE_BETWEEN) + priority = 4 + case(TASK_SLV_FSLV, TASK_SLV_BSLV) + priority = 1 + !case default + ! priority = 5 + end select + +!$ if(.not.present(locked)) call omp_set_lock(stack%lock) + + ! + ! Find a free spot + ! + insert = stack%freehead + if(insert.eq.-1) then + ! We have overflowed the task pool, we need to reallocate it + + ! Copy tasks + allocate(temp_tasks(stack%pool_size),stat=st) + if(st.ne.0) go to 10 + temp_tasks(:) = stack%tasks(:) + + deallocate(stack%tasks,stat=st) + allocate(stack%tasks(stack%pool_size*2),stat=st) + if(st.ne.0) go to 10 + + stack%tasks(1:stack%pool_size) = temp_tasks(:) + deallocate(temp_tasks,stat=st) + + ! Copy next + allocate(temp_next(stack%pool_size),stat=st) + if(st.ne.0) go to 10 + temp_next(:) = stack%next(:) + + deallocate(stack%next,stat=st) + allocate(stack%next(stack%pool_size*2),stat=st) + if(st.ne.0) go to 10 + + stack%next(1:stack%pool_size) = temp_next(:) + deallocate(temp_next,stat=st) + + ! Extend linked list + stack%freehead = stack%pool_size + 1 + do i = stack%pool_size+1, stack%pool_size*2-1 + stack%next(i) = i + 1 + end do + stack%next(stack%pool_size*2) = -1 + + ! Increase stored pool_size + stack%pool_size = stack%pool_size*2 + insert = stack%freehead + + select case(info) + case(MA86_WARNING_POOL_SING) + ! do nothing, warning already flagged + case(MA86_WARNING_SINGULAR) + ! set double warning + info = MA86_WARNING_POOL_SING + case default + ! set normal warning + info = MA86_WARNING_POOL_SMALL + end select + if(control%diagnostics_level.ge.0 .and. control%unit_warning.ge.0) & + write(control%unit_warning, "(a,i8)")& + " Task pool size increased to = ", stack%pool_size + end if + + stack%freehead = stack%next(insert) + + ! + ! Place task in pool in position insert and add into the linked list of + ! tasks with same priority + ! + stack%tasks(insert) = task + stack%next(insert) = stack%prihead(priority) + stack%prihead(priority) = insert + stack%total = stack%total + 1 + + ! + ! Update highest priority (the task with the highest priority + ! is the one with the lowest priority value) + ! + stack%lowest_priority_value = min(stack%lowest_priority_value, priority) + +!$ if(.not.present(locked)) call omp_unset_lock(stack%lock) + return ! Successful exit + + ! Error handling in case of allocation failure + 10 continue + info = MA86_ERROR_ALLOCATION + call MA86_print_flag(info, control, context='MA86_factor',st=st) + stack%abort = .true. +!$ if(.not.present(locked)) call omp_unset_lock(stack%lock) + return + +end subroutine add_task_g + +!************************************************* + +! +! Figure out which cache this thread belongs to - allows easy changes between +! machines by requiring only one function be altered. +! +integer function calc_cache(thread, control) + integer, intent(in) :: thread + type(MA86_control), intent(in) :: control + + integer :: total_threads + + select case (control%cache_layout) + case(CACHE_COMPACT) + calc_cache = thread / control%cache_cores + 1 + case(CACHE_SCATTER) + total_threads = 1 +!$ total_threads = omp_get_max_threads() + total_threads = max(1, total_threads/control%cache_cores) + ! (Avoid div by zero) + calc_cache = mod(thread, total_threads) + 1 + case default ! CACHE_IDENITY + calc_cache = thread + 1 + end select + +end function calc_cache + +!************************************************* + +! +! Get a task; if none remain then end. +! If we can't find any work in the local task stack then we first try the +! task pool, and if this doesn't contain any, we steal tasks from +! other caches. +! +subroutine get_task(stack, task, control, info, st) + type(taskstack), intent(inout) :: stack ! holds local stacks and task pool + type(dagtask), intent(inout) :: task + type(MA86_control), intent(in) :: control + integer, intent(inout) :: info ! error flag + integer, intent(inout) :: st ! stat parameter + + integer :: this_thread, cache + + this_thread = 0 +!$ this_thread = omp_get_thread_num() + cache = calc_cache(this_thread, control) + +!$OMP FLUSH(stack) + ! + ! Check for error termination (no lock required) + ! + if(stack%abort) then + ! Error abort + task%task_type = TASK_DONE + if(task%task_type.ne.TASK_NONE) then +!$ call omp_set_lock(stack%lock) + ! decrease count of acive threads + stack%active = stack%active - 1 +!$ call omp_unset_lock(stack%lock) + endif +!$OMP FLUSH + return + endif + +!$ call omp_set_lock(stack%clocks(cache)) + if(stack%cheads(cache).ne.0) then + ! local task stack contains tasks ... take the one off the top and return + task = stack%ctasks(stack%cheads(cache),cache) + stack%cheads(cache) = stack%cheads(cache) - 1 +!$ call omp_unset_lock(stack%clocks(cache)) + return + endif +!$ call omp_unset_lock(stack%clocks(cache)) + +!$ call omp_set_lock(stack%lock) + + ! reduce count of number of active threads + stack%active = stack%active - 1 + + ! If no task in local task stack then we /must/ get one. + ! First attempt to take a task from the task pool. + ! If this pool is empty, search for largest local stack + ! belonging to another cache. If found, move tasks in bottom half + ! from this local stack to the task pool (workstealing). + ! Then take task of highest priority from the pool as next task. + + task%task_type = TASK_NONE + do while(task%task_type.eq.TASK_NONE) + call get_task_from_pool(stack, task) + + if(info.lt.0) then +!$ call omp_unset_lock(stack%lock) + return + endif + if(task%task_type.eq.TASK_NONE) then + ! Check if we've finished + if(stack%active.eq.0) then +!$ call omp_unset_lock(stack%lock) + task%task_type = TASK_DONE + return + endif + +!$ call omp_unset_lock(stack%lock) + + ! Spin until a task become available + call await_task(stack,control) + ! immediate return if we have to abort + if(stack%abort) return + + if(stack%cheads(cache).ne.0) then + ! tasks available in local task stack. Take one from the top. +!$ call omp_set_lock(stack%clocks(cache)) + if(stack%cheads(cache).ne.0) then + task = stack%ctasks(stack%cheads(cache),cache) + stack%cheads(cache) = stack%cheads(cache) - 1 +!$ call omp_unset_lock(stack%clocks(cache)) +!$ call omp_set_lock(stack%lock) + exit + endif +!$ call omp_unset_lock(stack%clocks(cache)) + endif + + if(stack%total.le.0) then + ! nothing left in task pool so look to steal tasks + ! from another thread. + call worksteal(stack, control, info, st) + if(info.lt.0) return + endif +!$ call omp_set_lock(stack%lock) + cycle + endif + enddo + + if(task%task_type.ne.TASK_DONE) stack%active = stack%active + 1 + +!$ call omp_unset_lock(stack%lock) + +end subroutine get_task + +!************************************************* + +! +! Look to other caches to steal work from. +! Steals from the largest local stack. Moves bottom half +! of this stack into the task pool and then moves the +! remaining tasks down the stack +! +subroutine worksteal(stack, control, info, st) + type(taskstack), intent(inout) :: stack ! holds local stacks and task pool + type(MA86_control), intent(in) :: control + integer, intent(inout) :: info ! error flag + integer, intent(inout) :: st ! stat parameter + + integer :: i, j + integer :: mi ! index oflargest local stack (-1 if all are empty) + integer :: msz ! size of largest locak stack + integer :: cache, total_threads, this_thread + + total_threads = 1 +!$ total_threads = omp_get_num_threads() + this_thread = 0 +!$ this_thread = omp_get_thread_num() + cache = calc_cache(this_thread-1, control) + + ! Find biggest stack to steal from + msz = -1 + mi = -1 + do i = 1, calc_cache(total_threads-1, control) + if(cache.eq.i) cycle + if(stack%cheads(i).gt.msz) then +!$ call omp_set_lock(stack%clocks(i)) + if(stack%cheads(i).gt.msz) then +!$ if(mi.ne.-1) call omp_unset_lock(stack%clocks(mi)) + mi = i + msz = stack%cheads(i) + else ! Its no longer bigger, release lock +!$ call omp_unset_lock(stack%clocks(i)) + endif + endif + end do + if(mi.eq.-1) return ! No other caches + + msz = stack%cheads(mi) + + ! Steal half from bottom of the stack mi +!$ call omp_set_lock(stack%lock) + do i = 1, msz / 2 + call add_task_g(stack, stack%ctasks(i,mi), & + control, info, st, locked=.true.) + if(info.lt.0) then +!$ call omp_unset_lock(stack%lock) + return + endif + end do +!$ call omp_unset_lock(stack%lock) + ! move the remaining tasks down to occupied freed up space + j = 1 + do i = msz / 2 + 1, msz + stack%ctasks(j,mi) = stack%ctasks(i,mi) + j = j + 1 + end do + stack%cheads(mi) = stack%cheads(mi) - msz / 2 +!$ call omp_unset_lock(stack%clocks(mi)) +end subroutine worksteal + +!************************************************* +! +! Get a task from the task pool. Want a task with as low a priority +! value as possible. +! +subroutine get_task_from_pool(stack, task) + type(taskstack), intent(inout) :: stack ! holds local stacks and task pool + type(dagtask), intent(inout) :: task + + integer :: priority ! priority of task + integer :: ptr ! pointer into stack of tasks + ! + ! Check there exists a task for us to get + ! + if(stack%total.le.0) then + + task%task_type = TASK_NONE + return + else + ! + ! Find a task with the lowest priority value (that is, the + ! task which has the highest priority) + ! start with the current lowest priority value and increase priority + ! until a non empty linked list of tasks is found + ! + priority = stack%lowest_priority_value + do while(stack%prihead(priority).eq.-1) + priority = priority + 1 + end do + stack%lowest_priority_value = priority + + stack%max_pool_size = max(stack%max_pool_size,stack%total) + + ! + ! Grab a task from the stack of tasks + ! + ptr = stack%prihead(priority) + task = stack%tasks(ptr) + stack%prihead(priority) = stack%next(ptr) + stack%next(ptr) = stack%freehead + stack%freehead = ptr + + ! reduce count of tasks in stack + stack%total = stack%total - 1 + + endif +end subroutine get_task_from_pool + +!************************************************* + +! +! Spin until either some work crops up or notification of abort +! received or all work has been performed so nothing to wait for +! +subroutine await_task(stack, control) + type(taskstack), intent(inout) :: stack ! holds local stacks and task pool + type(MA86_control), intent(in) :: control + + integer :: this_thread, cache +!**integer :: t_start, t_end, t_rate + + this_thread = 0 +!$ this_thread = omp_get_thread_num() + cache = calc_cache(this_thread, control) + + !** call system_clock(t_start, t_rate) + +!$OMP CRITICAL (await_task_idle) + do +!$OMP FLUSH(stack) + if(stack%abort .or. stack%total.gt.0 .or. & + (stack%total.eq.0 .and. stack%active.eq.0) .or. & + any(stack%cheads(:) .gt. 4) .or. stack%cheads(cache).ne.0) exit + end do +!$OMP END CRITICAL (await_task_idle) + +!**if (control%time_out.ge.0) then +!** call system_clock(t_end) +!** stack%waiting(this_thread) = & +!** stack%waiting(this_thread) + (t_end-t_start)/real(t_rate) +!**end if + +end subroutine await_task + +!************************************************* + +! +! Sets the abort flag, called on error +! +subroutine set_abort(stack) + type(taskstack), intent(inout) :: stack ! holds local stacks and task pool + + ! Set the state +!$ call omp_set_lock(stack%lock) + stack%abort = .true. +!$ call omp_unset_lock(stack%lock) +end subroutine set_abort + +!************************************************* + +! +! TASK_FSOLV +! B_j <- L_jj^-1 B_j +! +! L_jj is stored by rows so we have to take transpose in blas calls +! +! Note: While diagonal blocks may be trapezoidal, this is handled at the +! level calling this subroutine through a call to slv_fwd_update or +! slv_bwd_update +! +subroutine slv_solve_fwd(n, nelim, col, dest, nrhs, rhs, ldr, control, id) + integer, intent(in) :: n ! leading dimension of L_jj + integer, intent(in) :: nelim ! number eliminations (immediate return if =0) + integer, intent(in) :: col ! start of block column variables in rhs + real(wp), dimension(n*nelim), intent(in) :: dest ! holds L_jj + integer, intent(in) :: nrhs ! number of right-hand sides + integer, intent(in) :: ldr ! leading extent of rhs + real(wp), intent(inout) :: rhs(ldr*nrhs) + type(MA86_control), intent(in) :: control + integer(long), intent(in) :: id + +!%%%integer :: this_thread, t_start, t_end + + if(nelim.eq.0) return + +!%%%if(control%unit_log.gt.0) call system_clock(t_start) + + if(nrhs.eq.1) then + call dtrsv('Upper', 'Tranpose', 'Unit', nelim, dest, n, rhs(col), 1) + else + call dtrsm('Left', 'Upper', 'Transpose', 'Unit', nelim, nrhs, one, & + dest, n, rhs(col), ldr) + endif + +!%%%if(control%unit_log.gt.0) then +!%%% call system_clock(t_end) +!%%% this_thread = 0 +!%%%!$ this_thread = omp_get_thread_num() +!%%% call log_task(control, this_thread, t_start, t_end, "FS", id) +!%%%endif + +end subroutine slv_solve_fwd + +!************************************************* + +! +! TASK_BSOLV +! B_j <- L_jj^-T B_j +! +! L_jj is stored by rows (that is, we hold L_jj^T by cols so no +! transpose needed in blas calls) +! +! Note: While diagonal blocks may be trapezoidal, this is handled at the +! level calling this subroutine through a call to slv_fwd_update or +! slv_bwd_update +! +subroutine slv_solve_bwd(n, nelim, col, dest, nrhs, rhs, ldr, control, id) + integer, intent(in) :: n ! leading dimension of L_jj + integer, intent(in) :: nelim ! number eliminations (immediate return if =0) + integer, intent(in) :: col ! start of block column variables in rhs + real(wp), dimension(n*nelim), intent(in) :: dest ! holds L_jj + integer, intent(in) :: nrhs ! number of right-hand sides + integer, intent(in) :: ldr ! leading extent of rhs + real(wp), intent(inout) :: rhs(ldr*nrhs) + type(MA86_control), intent(in) :: control + integer(long), intent(in) :: id + +!%%%integer :: this_thread, t_start, t_end + + if(nelim.eq.0) return + +!%%%if(control%unit_log.gt.0) call system_clock(t_start) + + if(nrhs.eq.1) then + call dtrsv('Upper', 'N', 'Unit', nelim, dest, n, rhs(col), 1) + else + call dtrsm('Left', 'Upper', 'N', 'Unit', nelim, nrhs, one, & + dest, n, rhs(col), ldr) + endif + +!%%%if(control%unit_log.gt.0) then +!%%% call system_clock(t_end) +!%%% this_thread = 0 +!%%%!$ this_thread = omp_get_thread_num() +!%%% call log_task(control, this_thread, t_start, t_end, "BS", id) +!%%%endif + +end subroutine slv_solve_bwd + +!************************************************* + +! +! TASK_FUPD +! B_j <- B_j - L_ij B_i +! +! L_ij is stored by rows (ie L_ij^T is stored by cols) +! so we have to take transpose in blas calls +! +subroutine slv_fwd_update(m, nelim, col, offset, index, dest, ldd, & + nrhs, upd, ldu, rhs, ldr, xlocal, control, id) + integer, intent(in) :: m ! number of rows in block + integer, intent(in) :: nelim ! number eliminations (immediate return if =0) + integer, intent(in) :: col ! start of block column variables in rhs + integer, intent(in) :: offset ! offset into index we start at + integer, dimension(*), intent(in) :: index + integer, intent(in) :: ldd ! leading dimension of dest + real(wp), dimension(ldd*m), intent(in) :: dest ! holds L_ij + integer, intent(in) :: nrhs + integer, intent(in) :: ldu ! leading extent of upd + real(wp), intent(inout) :: upd(ldu*nrhs) ! vector to update + integer, intent(in) :: ldr ! leading extent of rhs + real(wp), intent(in) :: rhs(ldr*nrhs) ! rhs vector + real(wp), dimension(*), intent(out) :: xlocal + type(MA86_control), intent(in) :: control + integer(long), intent(in) :: id + + integer :: i + integer :: j + integer :: k + integer :: r ! right hand side loop variable + real(wp) :: w ! temporary work value +!%%%integer :: t_start, t_end, this_thread + + if(nelim.eq.0) return + +!%%%if(control%unit_log.gt.0) call system_clock(t_start) + + ! forward substitution + if(nrhs.eq.1) then + if(m-nelim.gt.10 .and. nelim.gt.4) then + !!! Single rhs, BLAS 2 + + call dgemv('T', nelim, m, -one, dest, ldd, rhs(col), 1, zero, & + xlocal, 1) + + ! Copy xlocal out + j = 1 + do i = offset, offset+m-1 + upd(index(i)) = upd(index(i)) + xlocal(j) + j = j + 1 + end do + else + !!! Single rhs, direct update + j = 1 + do i = offset, offset+m-1 + w = zero + do k = col, col+nelim-1 + w = w - dest(j)*rhs(k) + j = j + 1 + end do + j = j + (ldd-nelim) + upd(index(i)) = upd(index(i)) + w + end do + endif + else + !!! Multiple rhs, BLAS 3 + call dgemm('T', 'N', m, nrhs, nelim, -one, dest, ldd, rhs(col), ldr, & + zero, xlocal, m) + + ! Copy xlocal out + j = 1 + do i = offset, offset+m-1 + do r = 0, nrhs-1 + upd(index(i)+r*ldu) = upd(index(i)+r*ldu) + xlocal(j+r*m) + end do + j = j + 1 + end do + endif + +!%%%if(control%unit_log.gt.0) then +!%%% this_thread = 0 +!%%%!$ this_thread = omp_get_thread_num() +!%%% call system_clock(t_end) +!%%% call log_task(control, this_thread, t_start, t_end, "FU", id) +!%%%endif +end subroutine slv_fwd_update + +!************************************************* + +! +! TASK_BUPD +! B_i <- B_i - L_ij^-T B_j +! +! L_ij is stored by rows (that is, we hold L_ij^T by cols so no +! transpose needed in blas calls) +! +subroutine slv_bwd_update(m, nelim, col, offset, index, dest, ldd, nrhs, rhs, & + upd, ldr, xlocal, control, id) + integer, intent(in) :: m ! number of rows in block + integer, intent(in) :: nelim ! number eliminations (immediate return if =0) + integer, intent(in) :: col ! start of block column variables in rhs + integer, intent(in) :: offset ! offset into index we start at + integer, dimension(*), intent(in) :: index + integer, intent(in) :: ldd ! leading dimension of dest + real(wp), dimension(ldd*m), intent(in) :: dest ! holds L_ij + integer, intent(in) :: nrhs + integer, intent(in) :: ldr ! leading extent of rhs + real(wp), intent(inout) :: rhs(ldr*nrhs) + real(wp), intent(inout) :: upd(ldr*nrhs) + real(wp), dimension(*), intent(out) :: xlocal + type(MA86_control), intent(in) :: control + integer(long), intent(in) :: id + + integer :: i + integer :: j + integer :: k + integer :: r ! right hand side loop variable + real(wp) :: w ! temporary work variable +!%%%integer :: t_start, t_end,this_thread + + if(nelim.eq.0) return + +!%%%if(control%unit_log.gt.0) call system_clock(t_start) + + ! backward substitution + if(nrhs.eq.1) then + if(m-nelim.gt.10 .and. nelim.gt.4) then + !!! Single right-hand side, BLAS 2 + + ! Copy xlocal in + j = 1 + do i = offset, offset+m-1 + xlocal(j) = rhs(index(i)) + j = j + 1 + end do + + call dgemv('N', nelim, m, -one, dest, ldd, xlocal, 1, one, & + upd(col), 1) + else + !!! Single right-hand side, direct update + j = 1 + do i = offset, offset+m-1 + w = rhs(index(i)) + do k = col, col + nelim - 1 + upd(k) = upd(k) - dest(j)*w + j = j + 1 + end do + j = j + (ldd-nelim) + end do + endif + else + !!! Multiple RHS, BLAS 3 + + ! Copy xlocal in + j = 1 + do i = offset, offset+m-1 + do r = 0, nrhs-1 + xlocal(j+r*m) = rhs(index(i)+r*ldr) + end do + j = j + 1 + end do + + call dgemm('N', 'N', nelim, nrhs, m, -one, dest, ldd, xlocal, m, & + one, upd(col), ldr) + endif + +!%%%if(control%unit_log.gt.0) then +!%%% this_thread = 0 +!%%%!$ this_thread = omp_get_thread_num() +!%%% call system_clock(t_end) +!%%% call log_task(control, this_thread, t_start, t_end, "BU", id) +!%%%endif +end subroutine slv_bwd_update + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! Debugging, logging and error handling routines +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +! +! Log a task +! +!%%%subroutine log_task(control, thread, start, finish, task, opt1, opt2, opt3) +!%%% type(ma86_control), intent(in) :: control +!%%% integer, intent(in) :: thread +!%%% integer, intent(in) :: start +!%%% integer, intent(in) :: finish +!%%% character(len=2), intent(in) :: task +!%%% integer(long), optional, intent(in) :: opt1 +!%%% integer(long), optional, intent(in) :: opt2 +!%%% integer(long), optional, intent(in) :: opt3 +!%%% +!%%% integer :: arg +!%%% +!%%% arg = 0 +!%%% if(present(opt1)) arg = arg + 1 +!%%% if(present(opt2)) arg = arg + 1 +!%%% if(present(opt3)) arg = arg + 1 +!%%% +!%%% select case(arg) +!%%% case(0) +!%%% write(control%unit_log, "(i4, 2i12, 1x, a2)") & +!%%% thread, start, finish, task +!%%% case(1) +!%%% write(control%unit_log, "(i4, 2i12, 1x, a2, 1x, 1i12)") & +!%%% thread, start, finish, task, opt1 +!%%% case(2) +!%%% write(control%unit_log, "(i4, 2i12, 1x, a2, 1x, 2i12)") & +!%%% thread, start, finish, task, opt1, opt2 +!%%% case(3) +!%%% write(control%unit_log, "(i4, 2i12, 1x, a2, 1x, 3i12)") & +!%%% thread, start, finish, task, opt1, opt2, opt3 +!%%% end select +!%%%end subroutine log_task + +!************************************************* + +! +! Converts a task into a character representation thereof +! Beware not to cause nested i/O !!! +! +!function print_job(task) +! character(len=26) :: print_job +! type(dagtask), intent(in) :: task +! +! select case(task%task_type) +! case(TASK_FACTORIZE_COLUMN) +! write(print_job, "(a,'(',i5,')')") "factorize_column", task%dest +! case(TASK_SOLVE_BLOCK) +! write(print_job, "(a,'(',i5,',',i5,')')") "solve_block", & +! task%dest, task%src1 +! case(TASK_UPDATE_INTERNAL) +! write(print_job, "(a,'(',i5,2(',',i5),')')") "within", task%dest, & +! task%src1, task%src2 +! case(TASK_UPDATE_BETWEEN) +! write(print_job, "(a,'(',i5,',',i5,')')") "between", & +! task%dest, task%src1 +! case(TASK_SLV_FSLV) +! write(print_job, "(a,'(',i5,')')") "slv_fslv", & +! task%dest +! case(TASK_SLV_FUPD) +! write(print_job, "(a,'(',i5,')')") "slv_fupd", & +! task%dest +! case(TASK_SLV_BSLV) +! write(print_job, "(a,'(',i5,')')") "slv_bslv", & +! task%dest +! case(TASK_SLV_BUPD) +! write(print_job, "(a,'(',i5,')')") "slv_bupd", & +! task%dest +! case(TASK_DONE) +! write(print_job, "(a)") "FINISH" +! case(TASK_NONE) +! write(print_job, "(a)") "WAIT" +! case default +! write(print_job, "(a)") "UNKNOWN TASK" +! end select +!end function print_job + +!************************************************* + +subroutine ma86_print_flag(iflag, control, context, st) + integer, intent(in) :: iflag + type(ma86_control), intent(in) :: control + integer, intent(in), optional :: st + ! context: is an optional assumed size character array of intent(in). + ! It describes the context under which the error occured + character (len=*), optional, intent(in) :: context + + integer :: nout + + if (iflag < 0) then + nout = control%unit_error + if (control%diagnostics_level < 0) nout = -1 + if (nout < 0) return + write (nout,'(/3a,i3)') ' Error return from ',trim(context),& + '. Error flag = ', iflag + else + nout = control%unit_warning + if (control%diagnostics_level < 0) nout = -1 + if (nout < 0) return + write (nout,'(/3a,i3)') ' Warning from ',trim(context),& + '. Warning flag = ', iflag + end if + + ! Errors + select case(iflag) + case(MA86_ERROR_ALLOCATION) + if (present(st)) write (nout,'(a,i8)') & + ' Allocation error. stat parameter = ', st + case(MA86_ERROR_JOB_OOR) + write (nout,'(a)') ' job out of range.' + case(MA86_ERROR_ORDER) + write (nout,'(a)') ' Error in user-supplied elimination order' + case(MA86_ERROR_X_SIZE) + write (nout,'(a)') ' Error in size of x. lx or nrhs too small' + case(MA86_ERROR_SINGULAR) + write (nout,'(a)') & + ' Error matrix is singular and control%action=.false' + case(MA86_ERROR_INFINITY) + write (nout,'(a)') ' IEEE infinities found in factorization' + case(MA86_ERROR_STATIC_SMALL) + write (nout,'(a)') ' Error in control%static' + + ! Warnings + + case(MA86_WARNING_SINGULAR) + write (nout,'(a)') ' Matrix found to be singular' + case(MA86_WARNING_POOL_SING) + write (nout,'(a)') & + ' Matrix found to be singular and task pool too small' + case(MA86_WARNING_POOL_SMALL) + write (nout,'(a)') ' Task pool too small' + + ! Unknown error + case default + write (nout,'(a)') ' Unexpected Error. Please report.' + end select + +end subroutine MA86_print_flag +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! routines to help interfaces get at private data +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +pure integer function ma86_get_n_double(keep) + type(ma86_keep), intent(in) :: keep + ma86_get_n_double = keep%n +end function ma86_get_n_double + +end module hsl_MA86_double diff --git a/coinhsl/hsl_ma86/hsl_ma86d.lo b/coinhsl/hsl_ma86/hsl_ma86d.lo new file mode 100644 index 0000000..ff72f7f --- /dev/null +++ b/coinhsl/hsl_ma86/hsl_ma86d.lo @@ -0,0 +1,12 @@ +# coinhsl/hsl_ma86/hsl_ma86d.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4.6 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/hsl_ma86d.o' + +# Name of the non-PIC object +non_pic_object=none + diff --git a/coinhsl/hsl_ma97/.deps/.dirstamp b/coinhsl/hsl_ma97/.deps/.dirstamp new file mode 100644 index 0000000..e69de29 diff --git a/coinhsl/hsl_ma97/.dirstamp b/coinhsl/hsl_ma97/.dirstamp new file mode 100644 index 0000000..e69de29 diff --git a/coinhsl/hsl_ma97/.libs/hsl_ma97d.o b/coinhsl/hsl_ma97/.libs/hsl_ma97d.o new file mode 100644 index 0000000000000000000000000000000000000000..17a852474edfc61d8c042fde59f1826f27589514 GIT binary patch literal 200712 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 literal 0 HcmV?d00001 diff --git a/coinhsl/hsl_ma97/C/.deps/.dirstamp b/coinhsl/hsl_ma97/C/.deps/.dirstamp new file mode 100644 index 0000000..e69de29 diff --git a/coinhsl/hsl_ma97/C/.dirstamp b/coinhsl/hsl_ma97/C/.dirstamp new file mode 100644 index 0000000..e69de29 diff --git a/coinhsl/hsl_ma97/C/.libs/hsl_ma97d_ciface.o b/coinhsl/hsl_ma97/C/.libs/hsl_ma97d_ciface.o new file mode 100644 index 0000000000000000000000000000000000000000..ed20336b1a5c12906116c3c8e9369a197cffa698 GIT binary patch literal 33800 zcmchA4SZcymG8|*;X-3hfT~eIu6os|*h!#3q808f`8a_Sh|oeDi%CgS(oWjMHi3YM z;pJY)@iq{(4E4!qoMAN1R0)bspW=8+3n@BJOHt@N6syC7-jQO=E^q3}qKjwv!0stP%w z7o7g%os*8kt)egK#tr)II0!r^5N&9@M`CdG*fH*(zLvziX2mXzzdgIIDOI!WN zmtF4vxz+#Q?#<8cgQTvXhz|2^N*Z4pb^XEUV$W}kR(ZY`t@cuPM{7$p=L9*~NG0A( zBH9H2|5P#4D$z>mBDI%EO8!K2D^qnPNEyJBR!|~30-DVLJjM)~+-yh+xCb=Lo5Y>% zbjNkgfTnUe(jb)%0q-=NAa{YJvAF(2c&ak|EN+3IPZM<1(y9BS5!Ld>XaxLc8XRP; zWdU6;=$N2gLAMLK!_fQK(ziB93kN#0tHqPA_zoPm)sb`c)jt*iyt=iTwe z-vLj^{fhhY>+X*mGK_2&EQ{`HNES=r&+K8#?IvGdd@<5jIM4{kx(g6y3DCP(xX*Ktq$@ zqco}VQ4eaNXCr$WcdO7{pq0SDcUl@n)7Hlaj*K2I@w(sed`QmT*#p$M?H4qStS&Da zU;Gom&}Hk(M+$Y>+VHs6B{WF|{twuDaRol;BtD5m&p(`}z?$I&wgRp74xp5ITY$Cs~hOa z>dZ-g9-3%NK1Jre)B!Fh`BSQArZL*i$ELddKdsMNKr-Fxr=7$AjS*G1hh}0CRonPR z(>t*m=5l9Z9qK;5DLSH_N5=S!%bgjajJ(`&_$xf`(~nHb4$tu$qaL2S*tfVqPUOgR zjy#YfIpPg(dyX8*ky~?Q7)?^Vu*_=DhlA4^a1z@9a~vfOkQjY7OrJ#w+uiZTXji*8 zet)zEmBz31QeHHsWOqk*MBLPU(Hd0X`9~Cn!9P@?mEZm+61~$dOgf8I7g^ z$Fow|fHk4a`RFZ_mwZ^|aFT!i^N}NUM>6|xgZ&77=wN6_?8Jk@y5Yjsc5 z?SC`FkS@g7ryh^)X5~`U#DGGb#LW=cMGsUN8>GtLL8)Pn9M$-z=)<^Mni^9khv{W6 z)0J<*Ll_)R;zH_R!t1_KxnIv;8EvO6cWHmosOB$}*{G*D5*;j!9%9%@-itDR#F{P| zuTV~*3B%QY-1V16t6b;OS6s}iVbg&a3J@)eH$@bHPQ|4TRdFvk3= zIv+FwC;C@)yVX3OTC^#D*k}D{Tn_j@*#YnQeY!zP>b#cqQf?vxB-o(ZOk9~r%=9b! zAL^k!bz^!`%F)j17&OGL8>X^rTm6SxN1rRX{z_xKhlXP=Cc@gf-R`!hOO^e_Q#Zaf zG=Aw3zoH5gM7i7WJp9>i;m<0n;(o;fo%UGHpJg70z%ceCS`d=P{>Lx7;~yuem8j{u zw0eSz%5=bhMLb?CetK-#<;Uqo)9VyY#B+(k(kXUGT7?N#A++VzLR{W9muSau7dLnR= z^Wohw-LZvx(Gp$^qCF?sYW)6)0uf&qi91%Sxa0n);>m^{9zEjhxI<}lCMfQx4~{z+ zl5n{3`tOT77^kbagFT!#ZFBff0DM!ShvSYKJvqs1sahFuuOz`idU zU!pVW1V$h?+iTlW*ml|8N$^q+I$B7fLrwgc=UwWa z$c7ap)Lhn7_f*csWKJ)PGd__QXK0~JsPX1{f<4Th$csEK*#`uEkwf;ISJMrv_I48zlac{O+^`pX{r!@ zjCZ|#f&jxq$1nh((%CV?By?Ob0y0b(nI=K!f)3S#Ko}`7HLX%b;E@d!khqhH+3lJs zJn>=?)1Xc0pvEy^pbQXL6bs(RyukM4IQN1y@k0b8FLKz>fV7PbNG~!xAQ$Jzn8@iG zx;3Q=Y8Oczg6zben_XamyQGR;?1(K#5JdiJV=zxS z$oe=FtDqaJp0J^*o@&sv ztHa3CnreeP{W28Ii*|9Dh;4N2 z80y?=&wy1nJjktp8HIWcTA0DNx+(O!=O5Crjn+_FZL7>czgXYeFf&+Ti%{!$Y(~^W z87#z%4>|uAPWgw?3bEm^YJvho)}_%}b{1B!a`_qwIsO3rd*<)(OV1Zdz2BlPgnDyY zN~0@^saI*#!aT2(^zS#7Qf#g}Du*?x?=+@d-*tIOw%F7*~nTf@sv;?Xxa+3Qd^ z^AH|%dpzh3MzqBk5o~7-3|CpxCj(lE3~ZvcoSduv}v*x#k%Q zHKr2DGZprH4SPOoJZ%jxImv}^LYddp^cz$DisOJ+-4mHJ)im9h-%VORZf1<@L1}!f zZVCGUc%JBEG_UMdn2*(@ z8iU$Gjw($23Zcf>EMc6)@v6VI0c2jy+OO9=hz%YL8hSh9pLRiK*1_!sjeb}9++%4@ zw#4A*(zw&%vE@$kdV~s@56gG~T~&qAg!yG9%mgvifSp-JkVBV@?G+Mu3xLHf!z@lG zZucRUKc>oM9G`t5@Fhx`-NeS8iJEKpLg0DQ}v7i?MJ5+mfF9bN=jN-Z1`w;zA z#7TUSY_q4RmpB&k7RC`g&kV!iVRejvHXARc$~TRsOZ@UX_4|VCd{usX+%LZ^yRKB0 z)8@bEp-`nKt%RJyjFLEij6f$;SmwOLG#);_N%x~HOZ#1Sj^Vi`)XvS`S%Y(KKdvV( zC&67>W9)CJ=GhJ6Oq&{wN^XqJ3A7@sFD{8NK}D=PbrS!A)~W1-IHb`z>bVsW(d+>V ztHA(`U#SM@Tw~%TuKl$CYioGjNj&fh9iraC&inumYJUUKerDGpJ|s{z^{mZpt1?~v zN+a_;hEsN9`TKal#_}X?Moi^j=JF$RiHT{vMoDId?x}c?0lJ~hj^M=X{l7N<-?;zx zYuA4PFHk#_J)3}62g_<}w-H+FK$yN9_Qk+hH4o!Fqy`%rZr<+d5ZS&Vji^)+kMBjk zFx7;td?z3_0uLaGaXc#Etjh~z7)-oq*Hxg^yHaF!K?ABb$sifys&E}NXLu9P({GtD zeZ&;YvJ!&cDCkYOs_(Ke-hgaIDabWxA<$ETo))y~c_VS!;yR??X&z~rI$YNw2+Yds zKA?>l@!1qAi|bj3s%E&}XTo*sfu3-Z|761T0i~Yg{KHU*zNYB z9rh(7;>N8gUn>-)TSp!NjeiQSwlq5!wA+oPDKfeKMzw(8VxWdNUMDiD_58cl>tog& z!}B}I3%VUN{;A&X0Ks1G;{D}aBs83K63<-zCHJbIV?VY zEsoACj}CBd7(w%Gs6PQ3wt&s)H<&bL9vSNoGuBV;=8VIA5GUD<>@CeayLYCi$>E{Ijj(RVR5ew?C3;z0c${ z9o8x|M>@)oSh!bR?f9plV!jVG9tS&7)oPtuGrUOdSEm+zS#C!?KJ*-q1L1wrqOrKY zXiUfVdY_u5X&33inO0|8U#P8|dh~{|(j4**c>eax3oldUD8G?0!XqS;$RQ=r9FSYDuG8WCLtl^w~`jN(YA|t8oX?8<~bFpkAPHh2jd_UR_q02BcTJJ zt$J7=X)a+8&i5p+ltF>9NK;~+si1is3SRQuAj2@iCdr-RSHnSd^ z<(SDj37yXNUGQAScfC>EAtC7$v^I>b|IwVpc<#VH2u9%oJtgnVbz| zRr2&vR8nM)YFMdNqT>lWM>&ZrF)rK`j@;QeFVn!@&O1vY*OW&&Px9+!m$z{i<$+wr z^o;e@pfT&o@w?QJgqf6MMOnf1&1o?Huo$YY|0Hv9DCWQI*$Kq1E~{8}?hLUWkzr;* z)@ml|3O&q>5jujsNHa@JWs!IU%5lw$931R+iOJ;&ATDrtfsBB(OUxR>378hGmYDFt z1RuE@arKDadz!bOf0JO;`x@WmKg5GLq)g~TbDtEgPi^BA= zKB(ZqD6}4Nj9!)@az~X)NVZTB9g0v34*Y7zQj06JrO~do)R{Oujakl14Po+K2Yy`( z`mCH02M)!lxUere-0J^(n}5LbGYDmtDXxyc_F!_6!Be=vEm&c2VK9bjv*-S9-a%Ut z!N1yHQRS!_8nvb9THF7)QTtnLUGUXH>I|$ToWztW@O689&`o`|24_+S-=bxnxv++s z0@{&>c4+j+V@w2lm0=$xz{^ejm^#i&vr0!A+4Is=ew|NwJ6R?HUdY!)X=NG#lQvP9 zM!=+{3)2Xgv;&1{1WcORjgj>cFlp^-E);DiVA4hk(+HR}J%@^XYI6aJXdjP~vVHTk zKFyg%qOL)36wO@u|Jc+`oe9u==?G#A! zLYsq^;$LYw8ll;46hH4Ir*VXmLSacs|j6{{W;ibMPw zZa_)&Mkw=1!}vRW$HEm$O|!dk^A7g0a7A<5$06DW4E6Cg|G`#71vfuSKjis8XD89e zW;^L_^STH}`=FNylJHOIg%#2|;3kn$i>I(jiGjA}&<;9hEMRn*jf|*iKqU%WQC{67 z4l~irzsT2xN7LiIrU;-TAeC)^9y1&)c{6B06S$eJR9Y=BcJHq=sp#Jb`YA($<=Gs0 zKyc82dD)rQ(qU9&=_)~28`^Z)S~Oet7~TrN2r61r=Q_!cf(erW4W^xiILX6sR~|NY zD0EZZ!%cOtj6WbNs~rKx%kvMaQZZQV8lDF*le>pLqK~Q%eO!4eZdje_-n?UqwfMiw z*@*Hbct5O@a`<+$F2J;`rs8&U*r)NRC$Bm0s&mCyH9Y8!?k{ot=ipIw;B@ZE$tXZ-lkQ}}LTB9(XE=V#))&wDU_ul!Q+Me_BO)8>o=R2r!q-s4+>te>#GT}OA(~w%>cbsry2V zb|qh)O&Oc>{Kq}0z}5w+VTH;+9W;h0{1b|K(t|>(2dj`zH`mUbspb5DEoY$knhM`z zBzv*^FyB)omV?gRo?DOb{cS~En!;Dn&Jm$0-QN`*!BZ>3JPvG-cF%qiwC-vhh?3^& zcM5m%ZZ+w|rVW4hDF{Ot^fPH|2RlLQ$>|NG(2a)i zLu=TJyPcd45Tkk6FDaE)3BoMs#`D%{S>KOD`gJimv0gJd*_i-UMS$ALsm5^F2^Pt< zfc{I1Fyy8E^J0rOYf{mZf}RpI?Vgt%52RIN+Yq>T2wVp29O9-7l49)=`0nUnRfOMc$s0O}><4di?R7G@|h*!3^`TIQo74Gd?BX0ODH`#SmgJ8n$ z#bRD^QP!+^saU-GBJJhZZT>@TDwv@RR5UBjMl$;K5SH-OSi+x1qd61GqiJY~O(?1& z8k~tSFWIDZ>;-R_MIw=Xo3jq8mBwTZi@j|sMv65Ykk&ewfd*!b#)b(jnTq{-0?a>ZM`V_<{>)V+ad~)hD0Ws#v;ryUrzt zIT;V=YWOYRLnwugy0$HKTwBVavm0T-d|{wwElfC#+)JoX{SWuR2^$7|TKo#0JM%Dc z`VZ(0YyUZH@u{La;~icDob90U(t6I)bD7 zMbhp;svZXEjo+;X79cj67dg8?)8JVXH3>+W0+K!?W;g-UKL4^1o_kgYbafn~ zyeN$wm86x13?2q6FXB~#t~RtX7i@~|=OKmD_{BJE3zM{-LScGms)4|GR15@k%K#4} zq*clAsVt4-MCmLy5@4EC&lFQ}=SXy4-pzOZdy#`f0kO6I#+yQ`I072PGKdH-bN&DH zFv1q;ETcOjtvo20HTnjv7PX-^dkKqI6p+X+qGzu}xYJS0->dcOuk{~L;JF&AY7g~e z){C%zk6r-dSo{0MP*EBTs{LT5J>(CAolG*rpo&GxVXzB{VRi+wRx>fTE@ihE^WVoJ zaG@?Xi)y+7e8i}T)@$GOO@d~*Y@;<!SMXt{{iS`X+qN4>!{O6R0E9*8QS6x{psGpH&f- z-Ca_aVNRM-b!x4ve9D{o#+x0o2f1nFTXA=i@5a&=GN|?cO$!j%t3OnsEC5@WI7oh2 zYl-ijXPm?dMOMPl=0Cs^q&C%umKfKm8}WA%vVVBOQ{NS<^*-M--!9)XtK95yymA%{*q8Lr;hVsE>LO)JGNX_QQ!y zY7wD)fr54HXJ5v$F#J>Yd)UapqQc}wQEUulXvgzO_?cU=%n<{ZllW)+#;F-*?E;B^ zO2S?c#5xQ{+67JZ+;j^5zQ;^CO%0!4JW#?th6C>S7Cq08o4@k_XNkXufI;b+P-+=Y z&(z?jnm>GJ$I8H>gN}B6dJ9i9JJYc{Y8f6)a?G0zE@-_znI4RD_GJTdd)_!8m3zy{ z-KlK!&yXKQh!Bb28=~vjM{a7P33~2V-QmH>R4ZI}8U9Mi=fC8RFG}jx;?I^i_dMW! z@R7RRUJ2&t@>}h>Vkly?ro=5dp#H8&=2K7<=NY^Q{QkBmLL*tY6jFe_iCd-kx=l?iGFA zLwzd-SFgJ!GT7S_S+TZ%Xx(6>e^q2{&)WX=*GC5XBP;s)`ny*Q_UNMG`e}9ly2y3? zLwzeFJ;U8SJu5AL-|Dri)hoSh#fJFTdEYDNIQp+%`#Vo4p__Pf*YslhN0ve@7hd?$ zNX@dV(Y~R`c?-{3So@K)htyNuO?CAPYZrY`qo#rd=3a8cWucPcs*+PHjt@_u->ZP1 zX3}g!iPaix(%gwP8hW+BIt=}7fvL9xc(zNZ3D6@Z{hSj(EUB!zy>v-s^=)NdWn{d3 zNoCE(d5x8|w;UI*tRFqztDGz^TRpFGs=T#wy1cn^YxzZ$>GDf}mR@>dWqrJ|HeOk? zq%wj6P|%XfaO3>XooKk1fZLtFoR3RPW^aDkjuH##bcjHi>?i+MhL0-KMU?3u%1te; zQl`s_%G5l6ZN5y6Rs?2lonQ8=*)qKdF>Ju_b)08Cik{lhz_J(1SRC}zSh*8T-c^1T z(9(@XWx8;F=`G;)z`aCrPa8152!Pakli}=Oxhso+WeZDzwt+P+3!Ny!T6$9vFcjh^ zl5~2!nkw;YZu@AfoS0Yk#j?uHu$jquODd=4T~av>dh5LA%JjTXBenEa22qV9I4X3bU5(nIkb2>Vm5F zAX?yc1NC<_y^WNW{jQ{PtZZ53L|HTL@ye01&lFWv^ZX8^qsSWkEJh&5Ya9A06tAqh zr8HhyJzCaS87bRZQdtcoUdbU8#ZRx{T?#s%xAbDmT8*R$!*{ab8!h!z87`iAwvX4_ zj^3vB%Dts!Pn8t&3Zc+SlyTUUbq7}kbL;2w%DrV}f55P;hc7B{F)j03it4F_!;~_2 zarJ`hLr0hSa%jEmr2v`vs&$Jg>#?Jk)sCJlduwUs<}z4y*(cR~qO5dPQDNf{mgV#B zdhn`X2hXh&k2<-ov~nNHKTvj2<>9i{%8~L<0EG<{am69}{ytMa|F+su%5SS2nOAn{ zyvi|*-wFKaG2M!>0N+3F3Z#}^T(m8XRQwzlO|?99@JKP1G8OjCPALnS!Bmh`hLVb1 zWopSfJEcr5L5txWC9|)x(227_AZ4N1jeMKpoL$bT1}{vBD14r>QAL_x?=!f>EL|4j zB%ObK2#+TVz1diy-{2#LebU_dbr$&}>MGw~R09+!;X8vcO=nqSTL zAYTpOe-GMUOrDDa@a_Pde|N1|Io|}Xn5z9we* zduuhnnoB^Q1H70#R~i24voyb&PeAqu@ZV|ptIpQ^YF+{PErZt@T+J!Ke-cm*-?UTC z_H%SOYTf`@1{Y9F&a;7&|G>vIzw-YeV*&h}AITp%U-K&;5Avn}{(B66D6aXH&jy(e z;6G^is~R=G^1&caz?@P{{>8vg68_3`Pv~ZaqcC$#oBPiUf6P2v{*&SBPlBIJ8$7$V z>D|!Rxpqavc`G}+SFc*p-Lr62Lv3iGccJ=KN9t_;IxE!KX<0j0_77d%*JCntwq4rT z+1c6MKX82@2g>hUy>3sue?h zgJ_bftaGJ?SFBsncm0MQJa)EtmoABWotHK@U*5E|b7_2u*VG9nu2n;;*7x)jsgzpE zmZ0<(>bz!E|N6o8E7o=PZ|Lke{?|iWodYYn|7NZNtT2W8$QCfPP8A^~ z-_YN8t?Go})|+Atr)c~!LiP(Q^Bi_p3|_%oU5V3 z)ym?O0(#bcW@z>Lp3Z^(4KUF_Ig0X%Vr?<2*Bx^yhE)`@q7Pj>w+MzsWYW5YLRR+n z_pO~fcOkDRrjNa|dZ6$6xl72g&Fak!11r`;udA+G*?BA`F^gLZGkg4L7iv7>wSz0J zo@Jw!<5)c+yJ+>g)q{U=K}VJ5m|SZoo#W93vSo!r_aWZk#T%n&>=~--4S_R?ws<$@ zcV313{bs7;jj@B}Z@_%Vi#TI%i?0a4zbf#z3;r9-ny9dx?*-s53S5@ceLM=qRankv zP2f+Q>uW3L?E*hZ;NKCrEdNIV_)Gx4&MaLD<@sg+{(l87>%Gn_bqdSbA#ln6w87br z47qK4|0ww1A@Jt~|62t9ir{~zz!#f1p5>Fpmj4xjOMAPQh2o<8(thf>pM|TiUA+PL zw7_M1Pj`x!b8Y}WC~#TM69Sj^e8>ccl#~0xw!J6PXmAmi_VZzZ%kt|3@TLHK#02Vv z`q>(Qm!G1ni>m0MbV)>H)N`n{L&vL;p?dR_WzqE&w->T&)^e4|7ob|p7 zKUSY_2>c9zzeg|ZXW7ra0+;Rj_W=AVfZ7sTRATaz&iu*&jjH2 z2>jim{09Xt`{g$Re~;jQO5l?JPyilg=iw^U!@C5YXU_tc<<|$`Jpz~dyi?#2)Nl29 zZveh60ROYVrQS}WlfqTlt{Q<$z10d_wksZhe@@^L)MMq}7=V8*0RKM%m+~JFxRj?< zZ(z-8*ZBgM@>~&s-!5=j@1($Gy+0PX)Z1eMm-YTf0DhWziN=1B_0|bo)_dvcV8lg! zX+Jjy;13I2mh(0`7hEhSf*;#owE_6Y1MuqvF6AE=xU6?d;8JhX0+;;H2wckfasXaS z=ZLFNpK*c9@-GX(zb5bq%Cq`;T;Q_3&k9_Yf7sxqC_}~@uM2(-SzCTNE5k*88E?#w z5Y_GCP_X%BQV z0@9XqLjeAz0Q~C#_`L!6D*}&-dKd5k7v+@w@?n8XJ3L$9lK&!sOa99QF8Nmm;MWG= zw+UR%FJBe7EPpBhe_Y@ZwAt$aU;uu?`@n>&96u5KSpIhe;8zKpMOyx0flE1W7r4~h zodTEq-xavz|DnJo|4ab>y1-?--u`|FjjOP|(E$A10Q^RQOFe87xRmps1uon5eSu5< z2Ltfu1Rg;h?ea?_k+25<^0Y6S(BRLg14B(*l?Lw+dXg z_v-=pJpuSZfy;K4e=9UFXef=z-9So30%r^ zzQIdT&Rg(f?V(BV%lN?){1t-#6M|pHC$|g!`GP<6S9rk1dQZfUt#`k{*)ADBTy9jh3%XUiEExNPqo0+;&vM}f=vbeq6sy{`zIL*LeWd>tNeQBGO@=>hn;0r+JB z___f63jz2y1Mmj|@FxTCR|D|3ou!&PtG#Ch;Fkp8YXb0F0`S`c@COA>7ijzCQGv^T z$pqjB1Ms(+_q*(0PBpgts|`+jmUjLh0+)9FkBh*FtI*Ex6}XJIpBH!p`E0!>nD@sl zhpxinrwUx!|9b^4^-wGDlSDaV1}|)vb1s;05tr?H%;1IX`h&n_yUsjM6{GaPp>O3s zPvBCXM+GkD)A!Zq%8~8*vcM((BLVok8;X}RF7Swu^Vud}=b9`eiawMF344%d8K^B3CTX9X_p@KJ$Bkk!`vtib64E&htYr5?)9&($mY z@iK!K%KvkLOZlfS$dz-lsQ2x$94_tI6LcOIXnW=wl^7oZxuLQo#lU6;Ids$ z3S8>#X@N`rLjsq2yP#3aS=ioh30$`Kz9!9I*xo$?m-c)`bB@=JND6skY`F|J)9<~2g71W%6P;jP`!#ElD7NQb~}nS>$+r~Le} zmkARTMtsC1m~P495mtn2xxQs_dtP#&0FRkU5(T(DFUfCvcv*Su`NS;+xIKq>w<#~n zA5qyuzbVsqi`#R5F)A3B#qIgNz5?8yYu# z+jDkR$K~_e^K=6RxIH%)TDal*wK!mb``~(g@3qwWp1u_e2YZGGLkm}~7+eurc=d)2 zp@r-F`9Su%h4pwOlR`itG0V`sVGzmP{cG3utV0Rw`UiU!wp_C8BO3;Jm`UgB>Fr## ze#P1zE%RUUJA%yYYSYYYQ87b3YQ~jKkhV+EqG0TQ*s?EPPi)g~iZ;PcH zCtX!PY zPE#T6kMXC?Z}nHKZkAnhIe+83BjYbBLDTOS=05>gVc!D^?d;(1Q0UVI@)x$Bb7Zmn RBcE51 for most */ + int scaling; /* 0 user/none, 1 mc64, 2 mc77 */ + ma97realtype_d_ small; /* Minimum value to count as non-zero */ + ma97realtype_d_ u; /* Pivoting parameter */ + int unit_diagnostics; /* Fortran unit for diagnostics (<0 disables) */ + int unit_error; /* Fortran unit for error msgs (<0 disables) */ + int unit_warning; /* Fortran unit for warning msgs (<0 disables) */ + long factor_min; /* Min number of flops for parallel execution */ + int solve_blas3; /* Use BLAS3 in solve in true, else BLAS2 */ + long solve_min; /* Min number of entries for parallel exection */ + int solve_mf; /* If true use m/f solve, else use s/n */ + ma97realtype_d_ consist_tol; /* Consistent equation tolerance */ + + /* Reserve space for future interface changes */ + int ispare[5]; ma97realtype_d_ rspare[10]; +}; + +struct ma97_info { + int flag; /* <0 on error */ + int flag68; + int flag77; + int matrix_dup; /* number duplicate entries in A */ + int matrix_rank; /* matrix rank */ + int matrix_outrange; /* number of out of range entries in A */ + int matrix_missing_diag; /* number of zero diagonal entries in A */ + int maxdepth; /* height of assembly tree */ + int maxfront; /* maximum dimension of frontal matrix */ + int num_delay; /* number of times a pivot was delayed */ + long num_factor; /* number of entries in L */ + long num_flops; /* number of floating point operations */ + int num_neg; /* number of negative pivots */ + int num_sup; /* number of supernodes in assembly tree */ + int num_two; /* number of 2x2 pivots */ + int ordering; /* ordering used (as per control.ordering) */ + int stat; /* error code from failed memory allocation */ + + /* Reserve space for future interface changes */ + int ispare[5]; ma97realtype_d_ rspare[10]; +}; + +/* Set default values of control */ +void ma97_default_control_d(struct ma97_control_d *control); +/* Perform symbolic analysis of matrix (sparse column entry) */ +void ma97_analyse_d(int check, int n, const int ptr[], const int row[], + ma97pkgtype_d_ val[], void **akeep, const struct ma97_control_d *control, + struct ma97_info_d *info, int order[]); +/* Perform symbolic analysis of matrix (coordinate entry) */ +void ma97_analyse_coord_d(int n, int ne, const int row[], const int col[], + ma97pkgtype_d_ val[], void **akeep, const struct ma97_control_d *control, + struct ma97_info_d *info, int order[]); +/* Perform numerical factorization, following call to ma97_analyse */ +void ma97_factor_d(int matrix_type, const int ptr[], const int row[], + const ma97pkgtype_d_ val[], void **akeep, void **fkeep, + const struct ma97_control_d *control, struct ma97_info_d *info, + ma97realtype_d_ scale[]); +/* Perform numerical factorization and solve, following call to ma97_analyse */ +void ma97_factor_solve_d(int matrix_type, const int ptr[], const int row[], + const ma97pkgtype_d_ val[], int nrhs, ma97pkgtype_d_ x[], int ldx, + void **akeep, void **fkeep, const struct ma97_control_d *control, + struct ma97_info_d *info, ma97realtype_d_ scale[]); +/* Perform forward and back substitutions, following call to ma97_factor */ +void ma97_solve_d(int job, int nrhs, ma97pkgtype_d_ x[], int ldx, + void **akeep, void **fkeep, const struct ma97_control_d *control, + struct ma97_info_d *info); +/* Free memory in akeep */ +void ma97_free_akeep_d(void **akeep); +/* Free memory in fkeep */ +void ma97_free_fkeep_d(void **fkeep); +/* Free memory in akeep and fkeep */ +void ma97_finalise_d(void **akeep, void **fkeep); +/* Return diagonal entries of L */ +void ma97_enquire_posdef_d(void **akeep, void **fkeep, + const struct ma97_control *control, struct ma97_info *info, + ma97realtype_d_ d[]); +/* Return diagonal, subdiagonal and/or pivot order of D */ +void ma97_enquire_indef_d(void **akeep, void **fkeep, + const struct ma97_control *control, struct ma97_info *info, + int *piv_order, ma97pkgtype_d_ *d); +/* Alter diagonal and subdiagonal of D */ +void ma97_alter_d(const ma97pkgtype_d_ d[], void **akeep, void **fkeep, + const struct ma97_control *control, struct ma97_info *info); +/* Fredholm alternative for singular systems */ +void ma97_solve_fredholm_d(int nrhs, int flag_out[], ma97pkgtype_d_ x[], + int ldx, void **akeep, void **fkeep, const struct ma97_control_d *control, + struct ma97_info_d *info); +/* Form (S^{-1}PL) X or (S^{-1}PL)^T X */ +void ma97_lmultiply_d(int trans, int k, const ma97pkgtype_d_ x[], int ldx, + ma97pkgtype_d_ y[], int ldy, void **akeep, void **fkeep, + const struct ma97_control_d *control, struct ma97_info_d *info); +/* Perform a sparse forward solve */ +void ma97_sparse_fwd_solve_d(int nbi, const int bindex[], + const ma97pkgtype_d_ b[], const int order[], int *nxi, int xindex[], + ma97pkgtype_d_ x[], void **akeep, void **fkeep, + const struct ma97_control_d *control, struct ma97_info_d *info); + +#endif diff --git a/coinhsl/hsl_ma97/C/hsl_ma97d_ciface.f90 b/coinhsl/hsl_ma97/C/hsl_ma97d_ciface.f90 new file mode 100644 index 0000000..75e8048 --- /dev/null +++ b/coinhsl/hsl_ma97/C/hsl_ma97d_ciface.f90 @@ -0,0 +1,949 @@ +module hsl_ma97_double_ciface + use iso_c_binding + use hsl_ma97_double, only: & + f_ma97_akeep => ma97_akeep, & + f_ma97_control => ma97_control, & + f_ma97_fkeep => ma97_fkeep, & + f_ma97_info => ma97_info, & + f_ma97_analyse => ma97_analyse, & + f_ma97_analyse_coord => ma97_analyse_coord, & + f_ma97_factor => ma97_factor, & + f_ma97_factor_solve => ma97_factor_solve, & + f_ma97_solve => ma97_solve, & + f_ma97_free => ma97_free, & + f_ma97_enquire_posdef => ma97_enquire_posdef, & + f_ma97_enquire_indef => ma97_enquire_indef, & + f_ma97_alter => ma97_alter, & + f_ma97_solve_fredholm => ma97_solve_fredholm, & + f_ma97_lmultiply => ma97_lmultiply, & + f_ma97_sparse_fwd_solve => ma97_sparse_fwd_solve, & + f_ma97_get_n__ => ma97_get_n__, & + f_ma97_get_nz__ => ma97_get_nz__ + + integer, parameter :: wp = C_DOUBLE ! pkg type + integer, parameter :: rp = C_DOUBLE ! real type + + type, bind(C) :: ma97_control + integer(C_INT) :: f_arrays ! true(!=0) or false(==0) + integer(C_INT) :: action ! true(!=0) or false(==0) + integer(C_INT) :: nemin + real(rp) :: multiplier + integer(C_INT) :: ordering + integer(C_INT) :: print_level + integer(C_INT) :: scaling + real(rp) :: small + real(rp) :: u + integer(C_INT) :: unit_diagnostics + integer(C_INT) :: unit_error + integer(C_INT) :: unit_warning + integer(C_LONG) :: factor_min + integer(C_INT) :: solve_blas3 + integer(C_LONG) :: solve_min + integer(C_INT) :: solve_mf + real(rp) :: consist_tol + integer(C_INT) :: ispare(5) + real(rp) :: rspare(10) + end type ma97_control + + type, bind(C) :: ma97_info + integer(C_INT) :: flag + integer(C_INT) :: flag68 + integer(C_INT) :: flag77 + integer(C_INT) :: matrix_dup + integer(C_INT) :: matrix_rank + integer(C_INT) :: matrix_outrange + integer(C_INT) :: matrix_missing_diag + integer(C_INT) :: maxdepth + integer(C_INT) :: maxfront + integer(C_INT) :: num_delay + integer(C_LONG) :: num_factor + integer(C_LONG) :: num_flops + integer(C_INT) :: num_neg + integer(C_INT) :: num_sup + integer(C_INT) :: num_two + integer(C_INT) :: ordering + integer(C_INT) :: stat + integer(C_INT) :: ispare(5) + real(rp) :: rspare(10) + end type ma97_info +contains + subroutine copy_control_in(ccontrol, fcontrol, f_arrays) + type(ma97_control), intent(in) :: ccontrol + type(f_ma97_control), intent(out) :: fcontrol + logical, intent(out) :: f_arrays + + f_arrays = (ccontrol%f_arrays.ne.0) + fcontrol%action = (ccontrol%action.ne.0) + fcontrol%nemin = ccontrol%nemin + fcontrol%multiplier = ccontrol%multiplier + fcontrol%ordering = ccontrol%ordering + fcontrol%print_level = ccontrol%print_level + fcontrol%scaling = ccontrol%scaling + fcontrol%small = ccontrol%small + fcontrol%u = ccontrol%u + fcontrol%unit_diagnostics = ccontrol%unit_diagnostics + fcontrol%unit_error = ccontrol%unit_error + fcontrol%unit_warning = ccontrol%unit_warning + fcontrol%factor_min = ccontrol%factor_min + fcontrol%solve_blas3 = (ccontrol%solve_blas3.ne.0) + fcontrol%solve_min = ccontrol%solve_min + fcontrol%solve_mf = (ccontrol%solve_mf.ne.0) + fcontrol%consist_tol = ccontrol%consist_tol + end subroutine copy_control_in + + subroutine copy_info_out(finfo,cinfo) + type(f_ma97_info), intent(in) :: finfo + type(ma97_info), intent(out) :: cinfo + + cinfo%flag = finfo%flag + cinfo%flag68 = finfo%flag68 + cinfo%flag77 = finfo%flag77 + cinfo%matrix_dup = finfo%matrix_dup + cinfo%matrix_rank = finfo%matrix_rank + cinfo%matrix_outrange = finfo%matrix_outrange + cinfo%matrix_missing_diag = finfo%matrix_missing_diag + cinfo%maxdepth = finfo%maxdepth + cinfo%maxfront = finfo%maxfront + cinfo%num_delay = finfo%num_delay + cinfo%num_factor = finfo%num_factor + cinfo%num_flops = finfo%num_flops + cinfo%num_neg = finfo%num_neg + cinfo%num_sup = finfo%num_sup + cinfo%num_two = finfo%num_two + cinfo%ordering = finfo%ordering + cinfo%stat = finfo%stat + end subroutine copy_info_out +end module hsl_ma97_double_ciface + +subroutine ma97_default_control_d(ccontrol) bind(C) + use hsl_ma97_double_ciface + implicit none + + type(ma97_control), intent(out) :: ccontrol + + type(f_ma97_control) :: fcontrol + + ccontrol%f_arrays = 0 ! false + if(fcontrol%action) then + ccontrol%action = 1 ! true + else + ccontrol%action = 0 ! false + endif + ccontrol%nemin = fcontrol%nemin + ccontrol%multiplier = fcontrol%multiplier + ccontrol%ordering = fcontrol%ordering + ccontrol%print_level = fcontrol%print_level + ccontrol%scaling = fcontrol%scaling + ccontrol%small = fcontrol%small + ccontrol%u = fcontrol%u + ccontrol%unit_diagnostics = fcontrol%unit_diagnostics + ccontrol%unit_error = fcontrol%unit_error + ccontrol%unit_warning = fcontrol%unit_warning + ccontrol%factor_min = fcontrol%factor_min + if(fcontrol%solve_blas3) then + ccontrol%solve_blas3 = 1 ! true + else + ccontrol%solve_blas3 = 0 ! false + endif + ccontrol%solve_min = fcontrol%solve_min + if(fcontrol%solve_mf) then + ccontrol%solve_mf = 1 ! true + else + ccontrol%solve_mf = 0 ! false + endif + ccontrol%consist_tol = fcontrol%consist_tol +end subroutine ma97_default_control_d + +subroutine ma97_analyse_d(ccheck, n, cptr, crow, cval, cakeep, ccontrol, & + cinfo, corder) bind(C) + use hsl_ma97_double_ciface + implicit none + + integer(C_INT), value, intent(in) :: ccheck + integer(C_INT), value, intent(in) :: n + type(C_PTR), value :: cptr + type(C_PTR), value :: crow + type(C_PTR), value :: cval + type(C_PTR) :: cakeep + type(ma97_control), intent(in) :: ccontrol + type(ma97_info), intent(out) :: cinfo + type(C_PTR), value :: corder + + logical :: fcheck + integer(C_INT), dimension(:), pointer :: fptr + integer, dimension(:), allocatable, target :: fptr_alloc + integer(C_INT), dimension(:), pointer :: frow + integer, dimension(:), allocatable, target :: frow_alloc + integer(C_INT), dimension(:), pointer :: forder + integer, dimension(:), allocatable, target :: forder_alloc + real(wp), dimension(:), pointer :: fval + type(f_ma97_akeep), pointer :: fakeep + type(f_ma97_control) :: fcontrol + type(f_ma97_info) :: finfo + logical :: f_arrays + + ! Copy data in and associate pointers correctly + call copy_control_in(ccontrol, fcontrol, f_arrays) + fcheck = (ccheck.ne.0) + call C_F_POINTER(cptr, fptr, shape = (/ n+1 /) ) + if(.not.f_arrays) then + allocate(fptr_alloc(n+1)) + fptr_alloc(:) = fptr(:) + 1 + fptr => fptr_alloc + endif + call C_F_POINTER(crow, frow, shape = (/ fptr(n+1)-1 /) ) + if(.not.f_arrays) then + allocate(frow_alloc(fptr(n+1)-1)) + frow_alloc(:) = frow(:) + 1 + frow => frow_alloc + endif + if(C_ASSOCIATED(cval)) then + call C_F_POINTER(cval, fval, shape = (/ fptr(n+1)-1 /) ) + else + nullify(fval) + endif + if(C_ASSOCIATED(corder)) then + call C_F_POINTER(corder, forder, shape = (/ n /) ) + else + nullify(forder) + endif + if(.not.f_arrays .and. associated(forder)) then + allocate(forder_alloc(n)) + forder_alloc(:) = forder(:) + 1 + forder => forder_alloc + endif + + ! Allocate space to store akeep and arrange a C pointer to it + allocate(fakeep) + cakeep = c_loc(fakeep) + + ! Call the Fortran routine + if(associated(forder)) then + if(associated(fval)) then + call f_ma97_analyse(fcheck, n, fptr, frow, fakeep, fcontrol, & + finfo, order=forder, val=fval) + else + call f_ma97_analyse(fcheck, n, fptr, frow, fakeep, fcontrol, & + finfo, order=forder) + endif + else + if(associated(fval)) then + call f_ma97_analyse(fcheck, n, fptr, frow, fakeep, fcontrol, & + finfo, val=fval) + else + call f_ma97_analyse(fcheck, n, fptr, frow, fakeep, fcontrol, & + finfo) + endif + endif + + ! Copy information out to the C structure + call copy_info_out(finfo, cinfo) + + ! Copy order out if using C indexing + if(.not.f_arrays .and. associated(forder)) then + call C_F_POINTER(corder, forder, shape = (/ n /) ) + forder(:) = forder_alloc(:) - 1 + endif +end subroutine ma97_analyse_d + +subroutine ma97_analyse_coord_d(n, ne, crow, ccol, cval, cakeep, ccontrol, & + cinfo, corder) bind(C) + use hsl_ma97_double_ciface + implicit none + + integer(C_INT), value, intent(in) :: n + integer(C_INT), value, intent(in) :: ne + type(C_PTR), value :: crow + type(C_PTR), value :: ccol + type(C_PTR), value :: cval + type(C_PTR) :: cakeep + type(ma97_control), intent(in) :: ccontrol + type(ma97_info), intent(out) :: cinfo + type(C_PTR), value :: corder + + integer(C_INT), dimension(:), pointer :: frow + integer, dimension(:), allocatable, target :: frow_alloc + integer(C_INT), dimension(:), pointer :: fcol + integer, dimension(:), allocatable, target :: fcol_alloc + integer(C_INT), dimension(:), pointer :: forder + integer, dimension(:), allocatable, target :: forder_alloc + real(wp), dimension(:), pointer :: fval + type(f_ma97_akeep), pointer :: fakeep + type(f_ma97_control) :: fcontrol + type(f_ma97_info) :: finfo + logical :: f_arrays + + ! Copy data in and associate pointers correctly + call copy_control_in(ccontrol, fcontrol, f_arrays) + call C_F_POINTER(crow, frow, shape = (/ ne /) ) + if(.not.f_arrays) then + allocate(frow_alloc(ne)) + frow_alloc(:) = frow(:) + 1 + frow => frow_alloc + endif + call C_F_POINTER(ccol, fcol, shape = (/ ne /) ) + if(.not.f_arrays) then + allocate(fcol_alloc(ne)) + fcol_alloc(:) = fcol(:) + 1 + fcol => fcol_alloc + endif + if(C_ASSOCIATED(cval)) then + call C_F_POINTER(cval, fval, shape = (/ ne /) ) + else + nullify(fval) + endif + if(C_ASSOCIATED(corder)) then + call C_F_POINTER(corder, forder, shape = (/ n /) ) + else + nullify(forder) + endif + if(.not.f_arrays .and. associated(forder)) then + allocate(forder_alloc(n)) + forder_alloc(:) = forder(:) + 1 + forder => forder_alloc + endif + + ! Allocate space to store akeep and arrange a C pointer to it + allocate(fakeep) + cakeep = c_loc(fakeep) + + ! Call the Fortran routine + if(associated(forder)) then + if(associated(fval)) then + call f_ma97_analyse_coord(n, ne, frow, fcol, fakeep, fcontrol, & + finfo, order=forder, val=fval) + else + call f_ma97_analyse_coord(n, ne, frow, fcol, fakeep, fcontrol, & + finfo, order=forder) + endif + else + if(associated(fval)) then + call f_ma97_analyse_coord(n, ne, frow, fcol, fakeep, fcontrol, & + finfo, val=fval) + else + call f_ma97_analyse_coord(n, ne, frow, fcol, fakeep, fcontrol, & + finfo) + endif + endif + + ! Copy information out to the C structure + call copy_info_out(finfo, cinfo) + + ! Copy order out if using C indexing + if(.not.f_arrays .and. associated(forder)) then + call C_F_POINTER(corder, forder, shape = (/ n /) ) + forder(:) = forder_alloc(:) - 1 + endif +end subroutine ma97_analyse_coord_d + +subroutine ma97_factor_d(matrix_type, cptr, crow, cval, cakeep, cfkeep, & + ccontrol, cinfo, cscale) bind(C) + use hsl_ma97_double_ciface + implicit none + + integer(C_INT), value, intent(in) :: matrix_type + type(C_PTR), value :: cptr + type(C_PTR), value :: crow + type(C_PTR), value :: cval + type(C_PTR) :: cakeep + type(C_PTR) :: cfkeep + type(ma97_control), intent(in) :: ccontrol + type(ma97_info), intent(out) :: cinfo + type(C_PTR), value :: cscale + + integer :: n, nz + integer(C_INT), dimension(:), pointer :: fptr + integer, dimension(:), allocatable, target :: fptr_alloc + integer(C_INT), dimension(:), pointer :: frow + integer, dimension(:), allocatable, target :: frow_alloc + real(wp), dimension(:), pointer :: fval + type(f_ma97_akeep), pointer :: fakeep + type(f_ma97_fkeep), pointer :: ffkeep + type(f_ma97_control) :: fcontrol + type(f_ma97_info) :: finfo + real(rp), dimension(:), pointer :: fscale + logical :: f_arrays + + ! Copy data in and associate pointers correctly + call C_F_POINTER(cakeep, fakeep) + n = f_ma97_get_n__(fakeep) + nz = f_ma97_get_nz__(fakeep) + call copy_control_in(ccontrol, fcontrol, f_arrays) + if(C_ASSOCIATED(cptr)) then + call C_F_POINTER(cptr, fptr, shape = (/ n+1 /) ) + if(.not.f_arrays) then + allocate(fptr_alloc(n+1)) + fptr_alloc(:) = fptr(:) + 1 + fptr => fptr_alloc + endif + else + nullify(fptr) + endif + if(C_ASSOCIATED(crow)) then + call C_F_POINTER(crow, frow, shape = (/ nz /) ) + if(.not.f_arrays) then + allocate(frow_alloc(nz)) + frow_alloc(:) = frow(:) + 1 + frow => frow_alloc + endif + else + nullify(frow) + endif + call C_F_POINTER(cval, fval, shape = (/ nz /) ) + if(C_ASSOCIATED(cscale)) then + call C_F_POINTER(cscale, fscale, shape = (/ n /)) + else + nullify(fscale) + endif + + if(.not.C_ASSOCIATED(cfkeep)) then + allocate(ffkeep) + cfkeep = C_LOC(ffkeep) + else + call C_F_POINTER(cfkeep, ffkeep) + endif + + ! Call the Fortran routine + if(associated(fscale)) then + if(associated(fptr)) then + if(associated(frow)) then + call f_ma97_factor(matrix_type, fval, fakeep, ffkeep, fcontrol, & + finfo, ptr=fptr, row=frow, scale=fscale) + else + call f_ma97_factor(matrix_type, fval, fakeep, ffkeep, fcontrol, & + finfo, ptr=fptr, scale=fscale) + endif + else + if(associated(frow)) then + call f_ma97_factor(matrix_type, fval, fakeep, ffkeep, fcontrol, & + finfo, row=frow, scale=fscale) + else + call f_ma97_factor(matrix_type, fval, fakeep, ffkeep, fcontrol, & + finfo, scale=fscale) + endif + endif + else + if(associated(fptr)) then + if(associated(frow)) then + call f_ma97_factor(matrix_type, fval, fakeep, ffkeep, fcontrol, & + finfo, ptr=fptr, row=frow) + else + call f_ma97_factor(matrix_type, fval, fakeep, ffkeep, fcontrol, & + finfo, ptr=fptr) + endif + else + if(associated(frow)) then + call f_ma97_factor(matrix_type, fval, fakeep, ffkeep, fcontrol, & + finfo, row=frow) + else + call f_ma97_factor(matrix_type, fval, fakeep, ffkeep, fcontrol, & + finfo) + endif + endif + endif + + ! Copy information out to the C structure + call copy_info_out(finfo, cinfo) +end subroutine ma97_factor_d + +subroutine ma97_factor_solve_d(matrix_type, cptr, crow, cval, nrhs, cx, ldx, & + cakeep, cfkeep, ccontrol, cinfo, cscale) bind(C) + use hsl_ma97_double_ciface + implicit none + + integer(C_INT), value, intent(in) :: matrix_type + type(C_PTR), value :: cptr + type(C_PTR), value :: crow + type(C_PTR), value :: cval + integer(C_INT), value, intent(in) :: nrhs + type(C_PTR), value :: cx + integer(C_INT), value, intent(in) :: ldx + type(C_PTR) :: cakeep + type(C_PTR) :: cfkeep + type(ma97_control), intent(in) :: ccontrol + type(ma97_info), intent(out) :: cinfo + type(C_PTR), value :: cscale + + integer :: n, nz + integer(C_INT), dimension(:), pointer :: fptr + integer, dimension(:), allocatable, target :: fptr_alloc + integer(C_INT), dimension(:), pointer :: frow + integer, dimension(:), allocatable, target :: frow_alloc + real(wp), dimension(:), pointer :: fval + real(wp), dimension(:,:), pointer :: fx + type(f_ma97_akeep), pointer :: fakeep + type(f_ma97_fkeep), pointer :: ffkeep + type(f_ma97_control) :: fcontrol + type(f_ma97_info) :: finfo + real(rp), dimension(:), pointer :: fscale + logical :: f_arrays + + ! Copy data in and associate pointers correctly + call C_F_POINTER(cakeep, fakeep) + n = f_ma97_get_n__(fakeep) + nz = f_ma97_get_nz__(fakeep) + call copy_control_in(ccontrol, fcontrol, f_arrays) + if(C_ASSOCIATED(cptr)) then + call C_F_POINTER(cptr, fptr, shape = (/ n+1 /) ) + if(.not.f_arrays) then + allocate(fptr_alloc(n+1)) + fptr_alloc(:) = fptr(:) + 1 + fptr => fptr_alloc + endif + else + nullify(fptr) + endif + if(C_ASSOCIATED(crow)) then + call C_F_POINTER(crow, frow, shape = (/ nz /) ) + if(.not.f_arrays) then + allocate(frow_alloc(nz)) + frow_alloc(:) = frow(:) + 1 + frow => frow_alloc + endif + else + nullify(frow) + endif + call C_F_POINTER(cval, fval, shape = (/ nz /) ) + call C_F_POINTER(cx, fx, shape = (/ ldx, nrhs /) ) + if(C_ASSOCIATED(cscale)) then + call C_F_POINTER(cscale, fscale, shape = (/ n /)) + else + nullify(fscale) + endif + + if(.not.C_ASSOCIATED(cfkeep)) then + allocate(ffkeep) + cfkeep = C_LOC(ffkeep) + else + call C_F_POINTER(cfkeep, ffkeep) + endif + + ! Call the Fortran routine + if(associated(fscale)) then + if(associated(fptr)) then + if(associated(frow)) then + call f_ma97_factor_solve(matrix_type, fval, nrhs, fx, ldx, fakeep, & + ffkeep, fcontrol, finfo, ptr=fptr, row=frow, scale=fscale) + else + call f_ma97_factor_solve(matrix_type, fval, nrhs, fx, ldx, fakeep, & + ffkeep, fcontrol, finfo, ptr=fptr, scale=fscale) + endif + else + if(associated(frow)) then + call f_ma97_factor_solve(matrix_type, fval, nrhs, fx, ldx, fakeep, & + ffkeep, fcontrol, finfo, row=frow, scale=fscale) + else + call f_ma97_factor_solve(matrix_type, fval, nrhs, fx, ldx, fakeep, & + ffkeep, fcontrol, finfo, scale=fscale) + endif + endif + else + if(associated(fptr)) then + if(associated(frow)) then + call f_ma97_factor_solve(matrix_type, fval, nrhs, fx, ldx, fakeep, & + ffkeep, fcontrol, finfo, ptr=fptr, row=frow) + else + call f_ma97_factor_solve(matrix_type, fval, nrhs, fx, ldx, fakeep, & + ffkeep, fcontrol, finfo, ptr=fptr) + endif + else + if(associated(frow)) then + call f_ma97_factor_solve(matrix_type, fval, nrhs, fx, ldx, fakeep, & + ffkeep, fcontrol, finfo, row=frow) + else + call f_ma97_factor_solve(matrix_type, fval, nrhs, fx, ldx, fakeep, & + ffkeep, fcontrol, finfo) + endif + endif + endif + + ! Copy information out to the C structure + call copy_info_out(finfo, cinfo) +end subroutine ma97_factor_solve_d + +subroutine ma97_solve_d(job, nrhs, cx, ldx, cakeep, cfkeep, ccontrol, cinfo) & + bind(C) + use hsl_ma97_double_ciface + implicit none + + integer(C_INT), value, intent(in) :: job + integer(C_INT), value, intent(in) :: nrhs + type(C_PTR), value :: cx + integer(C_INT), value, intent(in) :: ldx + type(C_PTR) :: cakeep + type(C_PTR) :: cfkeep + type(ma97_control), intent(in) :: ccontrol + type(ma97_info), intent(out) :: cinfo + + real(wp), dimension(:,:), pointer :: fx + type(f_ma97_akeep), pointer :: fakeep + type(f_ma97_fkeep), pointer :: ffkeep + type(f_ma97_control) :: fcontrol + type(f_ma97_info) :: finfo + logical :: f_arrays + + ! Copy data in and associate pointers correctly + call copy_control_in(ccontrol, fcontrol, f_arrays) + call C_F_POINTER(cx, fx, shape = (/ ldx, nrhs /) ) + call C_F_POINTER(cakeep, fakeep) + call C_F_POINTER(cfkeep, ffkeep) + + ! Call the Fortran routine + if(job.eq.0) then + call f_ma97_solve(nrhs, fx, ldx, fakeep, ffkeep, fcontrol, finfo) + else + call f_ma97_solve(nrhs, fx, ldx, fakeep, ffkeep, fcontrol, finfo, job=job) + endif + + ! Copy information out to the C structure + call copy_info_out(finfo, cinfo) +end subroutine ma97_solve_d + +subroutine ma97_free_akeep_d(cakeep) bind(C) + use hsl_ma97_double_ciface + implicit none + + type(C_PTR) :: cakeep + + type(f_ma97_akeep), pointer :: fakeep ! May be NULL + + if(C_ASSOCIATED(cakeep)) then + call C_F_POINTER(cakeep, fakeep) + call f_ma97_free(fakeep) + deallocate(fakeep) + cakeep = C_NULL_PTR + endif +end subroutine ma97_free_akeep_d + +subroutine ma97_free_fkeep_d(cfkeep) bind(C) + use hsl_ma97_double_ciface + implicit none + + type(C_PTR) :: cfkeep + + type(f_ma97_fkeep), pointer :: ffkeep ! May be NULL + + if(C_ASSOCIATED(cfkeep)) then + call C_F_POINTER(cfkeep, ffkeep) + call f_ma97_free(ffkeep) + deallocate(ffkeep) + cfkeep = C_NULL_PTR + endif +end subroutine ma97_free_fkeep_d + +subroutine ma97_finalise_d(cakeep, cfkeep) bind(C) + use hsl_ma97_double_ciface + implicit none + + type(C_PTR) :: cakeep + type(C_PTR) :: cfkeep + + interface + subroutine ma97_free_akeep_d(cakeep) bind(C) + use hsl_ma97_double_ciface + implicit none + type(C_PTR) :: cakeep + end subroutine ma97_free_akeep_d + subroutine ma97_free_fkeep_d(cfkeep) bind(C) + use hsl_ma97_double_ciface + implicit none + type(C_PTR) :: cfkeep + end subroutine ma97_free_fkeep_d + end interface + + call ma97_free_akeep_d(cakeep) + call ma97_free_fkeep_d(cfkeep) +end subroutine ma97_finalise_d + +subroutine ma97_enquire_posdef_d(cakeep, cfkeep, ccontrol, cinfo, cd) bind(C) + use hsl_ma97_double_ciface + implicit none + + type(C_PTR) :: cakeep + type(C_PTR) :: cfkeep + type(ma97_control), intent(in) :: ccontrol + type(ma97_info), intent(out) :: cinfo + type(C_PTR), value :: cd + + type(f_ma97_akeep), pointer :: fakeep + type(f_ma97_fkeep), pointer :: ffkeep + type(f_ma97_control) :: fcontrol + type(f_ma97_info) :: finfo + real(rp), dimension(:), pointer :: fd + logical :: f_arrays + integer :: n + + ! Copy data in and associate pointers correctly + call copy_control_in(ccontrol, fcontrol, f_arrays) + call C_F_POINTER(cakeep, fakeep) + n = f_ma97_get_n__(fakeep) + call C_F_POINTER(cfkeep, ffkeep) + call C_F_POINTER(cd, fd, shape = (/ n /) ) + + ! Call the Fortran routine + call f_ma97_enquire_posdef(fakeep, ffkeep, fcontrol, finfo, fd) + + ! Copy information out to the C structure + call copy_info_out(finfo, cinfo) +end subroutine ma97_enquire_posdef_d + +subroutine ma97_enquire_indef_d(cakeep, cfkeep, ccontrol, cinfo, cpiv_order, & + cd) bind(C) + use hsl_ma97_double_ciface + implicit none + + type(C_PTR) :: cakeep + type(C_PTR) :: cfkeep + type(ma97_control), intent(in) :: ccontrol + type(ma97_info), intent(out) :: cinfo + type(C_PTR), value :: cpiv_order + type(C_PTR), value :: cd + + type(f_ma97_akeep), pointer :: fakeep + type(f_ma97_fkeep), pointer :: ffkeep + type(f_ma97_control) :: fcontrol + type(f_ma97_info) :: finfo + real(wp), dimension(:,:), pointer :: fd + integer(C_INT), dimension(:), pointer :: fpiv_order + integer(C_INT), dimension(:), allocatable, target :: fpiv_order_alloc + logical :: f_arrays + integer :: n + + ! Copy data in and associate pointers correctly + call copy_control_in(ccontrol, fcontrol, f_arrays) + call C_F_POINTER(cakeep, fakeep) + n = f_ma97_get_n__(fakeep) + call C_F_POINTER(cfkeep, ffkeep) + if(C_ASSOCIATED(cpiv_order)) then + call C_F_POINTER(cpiv_order, fpiv_order, shape = (/ n /) ) + if(.not.f_arrays) then + allocate(fpiv_order_alloc(n)) + fpiv_order_alloc(:) = fpiv_order(:) + 1 + fpiv_order => fpiv_order_alloc + endif + else + nullify(fpiv_order) + endif + if(C_ASSOCIATED(cd)) then + call C_F_POINTER(cd, fd, shape = (/ n, 2 /) ) + else + nullify(fd) + endif + + ! Call the Fortran routine + if(associated(fpiv_order)) then + if(associated(fd)) then + call f_ma97_enquire_indef(fakeep, ffkeep, fcontrol, finfo, & + piv_order=fpiv_order, d=fd) + else + call f_ma97_enquire_indef(fakeep, ffkeep, fcontrol, finfo, & + piv_order=fpiv_order) + endif + else + if(associated(fd)) then + call f_ma97_enquire_indef(fakeep, ffkeep, fcontrol, finfo, d=fd) + else + call f_ma97_enquire_indef(fakeep, ffkeep, fcontrol, finfo) + endif + endif + + ! Copy information out to the C structure + call copy_info_out(finfo, cinfo) + + ! Copy piv_order out if using C indexing + if(.not.f_arrays .and. associated(fpiv_order)) then + call C_F_POINTER(cpiv_order, fpiv_order, shape = (/ n /) ) + fpiv_order(:) = abs(fpiv_order_alloc(:)) - 1 + endif +end subroutine ma97_enquire_indef_d + +subroutine ma97_alter_d(cd, cakeep, cfkeep, ccontrol, cinfo) bind(C) + use hsl_ma97_double_ciface + implicit none + + type(C_PTR), value :: cd + type(C_PTR) :: cakeep + type(C_PTR) :: cfkeep + type(ma97_control), intent(in) :: ccontrol + type(ma97_info), intent(out) :: cinfo + + real(wp), dimension(:,:), pointer :: fd + type(f_ma97_akeep), pointer :: fakeep + type(f_ma97_fkeep), pointer :: ffkeep + type(f_ma97_control) :: fcontrol + type(f_ma97_info) :: finfo + logical :: f_arrays + integer :: n + + ! Copy data in and associate pointers correctly + call copy_control_in(ccontrol, fcontrol, f_arrays) + call C_F_POINTER(cakeep, fakeep) + n = f_ma97_get_n__(fakeep) + call C_F_POINTER(cd, fd, shape = (/ n, 2 /) ) + call C_F_POINTER(cfkeep, ffkeep) + + call f_ma97_alter(fd, fakeep, ffkeep, fcontrol, finfo) + + ! Copy information out to the C structure + call copy_info_out(finfo, cinfo) +end subroutine ma97_alter_d + +subroutine ma97_solve_fredholm_d(nrhs, cflag_out, cx, ldx, cakeep, cfkeep, & + ccontrol, cinfo) bind(C) + use hsl_ma97_double_ciface + implicit none + + integer(C_INT), value, intent(in) :: nrhs + type(C_PTR), value :: cflag_out + type(C_PTR), value :: cx + integer(C_INT), value, intent(in) :: ldx + type(C_PTR) :: cakeep + type(C_PTR) :: cfkeep + type(ma97_control), intent(in) :: ccontrol + type(ma97_info), intent(out) :: cinfo + + integer(C_INT), dimension(:), pointer :: fflag_out + real(wp), dimension(:,:), pointer :: fx + logical, dimension(:), allocatable :: fflag_out_logical + type(f_ma97_akeep), pointer :: fakeep + type(f_ma97_fkeep), pointer :: ffkeep + type(f_ma97_control) :: fcontrol + type(f_ma97_info) :: finfo + logical :: f_arrays + + ! Copy data in and associate pointers correctly + call copy_control_in(ccontrol, fcontrol, f_arrays) + call C_F_POINTER(cflag_out, fflag_out, shape = (/ nrhs /) ) + call C_F_POINTER(cx, fx, shape = (/ ldx, 2*nrhs /) ) + allocate(fflag_out_logical(nrhs)) + call C_F_POINTER(cakeep, fakeep) + call C_F_POINTER(cfkeep, ffkeep) + + ! Call the Fortran routine + call f_ma97_solve_fredholm(nrhs, fflag_out_logical, fx, ldx, & + fakeep, ffkeep, fcontrol, finfo) + + ! Copy information out to the C structure + call copy_info_out(finfo, cinfo) + + ! Copy flag_out to C version + where(fflag_out_logical(:)) + fflag_out(:) = 1 + elsewhere + fflag_out(:) = 0 + end where +end subroutine ma97_solve_fredholm_d + +subroutine ma97_lmultiply_d(ctrans, k, cx, ldx, cy, ldy, cakeep, cfkeep, & + ccontrol, cinfo) bind(C) + use hsl_ma97_double_ciface + implicit none + + integer(C_INT), value, intent(in) :: ctrans + integer(C_INT), value, intent(in) :: k + type(C_PTR), value :: cx + integer(C_INT), value, intent(in) :: ldx + type(C_PTR), value :: cy + integer(C_INT), value, intent(in) :: ldy + type(C_PTR) :: cakeep + type(C_PTR) :: cfkeep + type(ma97_control), intent(in) :: ccontrol + type(ma97_info), intent(out) :: cinfo + + logical :: ftrans + real(wp), dimension(:,:), pointer :: fx + real(wp), dimension(:,:), pointer :: fy + type(f_ma97_akeep), pointer :: fakeep + type(f_ma97_fkeep), pointer :: ffkeep + type(f_ma97_control) :: fcontrol + type(f_ma97_info) :: finfo + logical :: f_arrays + + ! Copy data in and associate pointers correctly + call copy_control_in(ccontrol, fcontrol, f_arrays) + ftrans = (ctrans.ne.0) + call C_F_POINTER(cx, fx, shape = (/ ldx, k /) ) + call C_F_POINTER(cy, fy, shape = (/ ldx, k /) ) + call C_F_POINTER(cakeep, fakeep) + call C_F_POINTER(cfkeep, ffkeep) + + ! Call the Fortran routine + call f_ma97_lmultiply(ftrans, k, fx, ldx, fy, ldy, fakeep, ffkeep, & + fcontrol, finfo) + + ! Copy information out to the C structure + call copy_info_out(finfo, cinfo) +end subroutine ma97_lmultiply_d + +subroutine ma97_sparse_fwd_solve_d(nbi, cbindex, cb, corder, cnxi, & + cxindex, cx, cakeep, cfkeep, ccontrol, cinfo) bind(C) + use hsl_ma97_double_ciface + implicit none + + integer(C_INT), value, intent(in) :: nbi + type(C_PTR), value :: cbindex + type(C_PTR), value :: cb + type(C_PTR), value :: corder + type(C_PTR), value :: cnxi + type(C_PTR), value :: cxindex + type(C_PTR), value :: cx + type(C_PTR) :: cakeep + type(C_PTR) :: cfkeep + type(ma97_control), intent(in) :: ccontrol + type(ma97_info), intent(out) :: cinfo + + integer(C_INT), dimension(:), pointer :: fbindex + integer(C_INT), dimension(:), allocatable, target :: fbindex_alloc + real(wp), dimension(:), pointer :: fb + integer(C_INT), dimension(:), pointer :: forder + integer(C_INT), dimension(:), allocatable, target :: forder_alloc + integer(C_INT), pointer :: fnxi + integer(C_INT), dimension(:), pointer :: fxindex + real(wp), dimension(:), pointer :: fx + type(f_ma97_akeep), pointer :: fakeep + type(f_ma97_fkeep), pointer :: ffkeep + type(f_ma97_control) :: fcontrol + type(f_ma97_info) :: finfo + logical :: f_arrays + integer :: n + + logical, dimension(:), allocatable :: lflag ! FIXME inefficient + + ! Copy data in and associate pointers correctly + call copy_control_in(ccontrol, fcontrol, f_arrays) + call C_F_POINTER(cakeep, fakeep) + call C_F_POINTER(cfkeep, ffkeep) + n = f_ma97_get_n__(fakeep) + call C_F_POINTER(cbindex, fbindex, shape = (/ nbi /) ) + if(.not.f_arrays) then + allocate(fbindex_alloc(nbi)) + fbindex_alloc(:) = fbindex(:) + 1 + fbindex => fbindex_alloc + endif + call C_F_POINTER(cb, fb, shape = (/ n /) ) + call C_F_POINTER(corder, forder, shape = (/ n /) ) + if(.not.f_arrays) then + allocate(forder_alloc(n)) + forder_alloc(:) = forder(:) + 1 + forder => forder_alloc + endif + call C_F_POINTER(cnxi, fnxi) + call C_F_POINTER(cxindex, fxindex, shape = (/ n /) ) + call C_F_POINTER(cx, fx, shape = (/ n /) ) + + ! FIXME inefficient + allocate(lflag(n)) + lflag(:) = .false. + + ! Call the Fortran routine + call f_ma97_sparse_fwd_solve(nbi, fbindex, fb, forder, lflag, fnxi, & + fxindex, fx, fakeep, ffkeep, fcontrol, finfo) + + ! Copy information out to the C structure + call copy_info_out(finfo, cinfo) + + ! Modify xindex for C ordering + if(.not.f_arrays) then + fxindex(:) = fxindex(:) - 1 + endif +end subroutine ma97_sparse_fwd_solve_d diff --git a/coinhsl/hsl_ma97/C/hsl_ma97d_ciface.lo b/coinhsl/hsl_ma97/C/hsl_ma97d_ciface.lo new file mode 100644 index 0000000..f5e3258 --- /dev/null +++ b/coinhsl/hsl_ma97/C/hsl_ma97d_ciface.lo @@ -0,0 +1,12 @@ +# coinhsl/hsl_ma97/C/hsl_ma97d_ciface.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4.6 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/hsl_ma97d_ciface.o' + +# Name of the non-PIC object +non_pic_object=none + diff --git a/coinhsl/hsl_ma97/hsl_ma97d.f90 b/coinhsl/hsl_ma97/hsl_ma97d.f90 new file mode 100644 index 0000000..2b640ce --- /dev/null +++ b/coinhsl/hsl_ma97/hsl_ma97d.f90 @@ -0,0 +1,8684 @@ +! COPYRIGHT (c) 2011,2012 Science and Technology Facilities Council +! Original date 20 December 2011, Version 1.0.0 +! +! Written by: Jonathan Hogg and Jennifer Scott +! +! Version 2.3.0 +! See ChangeLog for history +! + +! +! To convert from double: +! * Change wp +! * Change _double +! * Change BLAS calls: daxpy, dgemm, dgemv, dpotrf, dswap, dsyrk, dtrsm, dtrsv, +! dnrm2, dtrmv, dtrmm +! * Change HSL calls: mc30ad, mc77id, mc77ad +! * Change control%u default to 0.1 +! * Change control%small to 1e-12 +! +module hsl_ma97_double +!$ use omp_lib + !%%use logger + use hsl_mc34_double + use hsl_mc64_double + use hsl_mc68_integer + use hsl_mc69_double + use hsl_mc78_integer + use hsl_mc80_double + implicit none + + private + public :: ma97_akeep, ma97_fkeep, ma97_control, ma97_info + public :: ma97_analyse, ma97_analyse_coord, ma97_factor, ma97_factor_solve, & + ma97_solve, ma97_solve_fredholm, ma97_free, ma97_finalise, & + ma97_enquire_posdef, ma97_enquire_indef, ma97_alter, ma97_lmultiply, & + ma97_sparse_fwd_solve + public :: ma97_get_n__, ma97_get_nz__ + !public :: cmp_fkeep + + integer, parameter :: wp = kind(0d0) + integer, parameter :: long = selected_int_kind(18) + + real(wp), parameter :: one = 1.0_wp + real(wp), parameter :: zero = 0.0_wp + + integer, parameter :: nemin_default = 8 ! node amalgamation parameter + + ! Success flag + integer, parameter :: MA97_SUCCESS = 0 + + ! Error flags + integer, parameter :: MA97_ERROR_CALL_SEQUENCE = -1 + integer, parameter :: MA97_ERROR_A_N_OOR = -2 + integer, parameter :: MA97_ERROR_A_PTR = -3 + integer, parameter :: MA97_ERROR_A_ALL_OOR = -4 + integer, parameter :: MA97_ERROR_MATRIX_TYPE = -5 + integer, parameter :: MA97_ERROR_IMAG_DIAGONAL = -6 + integer, parameter :: MA97_ERROR_SINGULAR = -7 + integer, parameter :: MA97_ERROR_NOT_POS_DEF = -8 + integer, parameter :: MA97_ERROR_INFINITY = -9 + integer, parameter :: MA97_ERROR_PTR_ROW = -10 + integer, parameter :: MA97_ERROR_ORDER = -11 + integer, parameter :: MA97_ERROR_X_SIZE = -12 + integer, parameter :: MA97_ERROR_JOB_OOR = -13 + integer, parameter :: MA97_ERROR_NOT_LLT = -14 + integer, parameter :: MA97_ERROR_NOT_LDLT = -15 + integer, parameter :: MA97_ERROR_ALLOCATION = -16 + integer, parameter :: MA97_ERROR_NO_METIS = -17 + integer, parameter :: MA97_ERROR_MC68 = -18 + integer, parameter :: MA97_ERROR_MC77 = -19 + integer, parameter :: MA97_ERROR_VAL = -20 + integer, parameter :: MA97_ERROR_NO_SAVED_SCALING= -21 + integer, parameter :: MA97_ERROR_NBI_OOR = -22 + integer, parameter :: MA97_ERROR_UNKNOWN = -99 + + ! warning flags + integer, parameter :: MA97_WARNING_IDX_OOR = 1 + integer, parameter :: MA97_WARNING_DUP_IDX = 2 + integer, parameter :: MA97_WARNING_DUP_AND_OOR = 3 + integer, parameter :: MA97_WARNING_MISSING_DIAGONAL = 4 + integer, parameter :: MA97_WARNING_MISS_DIAG_OORDUP = 5 + integer, parameter :: MA97_WARNING_ANAL_SINGULAR = 6 + integer, parameter :: MA97_WARNING_FACT_SINGULAR = 7 + integer, parameter :: MA97_WARNING_MATCH_ORD_NO_SCALE=8 + + ! solve job values + integer, parameter :: MA97_SOLVE_JOB_ALL = 0 ! PLD(PL)^TX = B + integer, parameter :: MA97_SOLVE_JOB_FWD = 1 ! PLX = B + integer, parameter :: MA97_SOLVE_JOB_DIAG = 2 ! DX = B (indef only) + integer, parameter :: MA97_SOLVE_JOB_BWD = 3 ! (PL)^TX = B + integer, parameter :: MA97_SOLVE_JOB_DIAG_BWD = 4 ! D(PL)^TX = B (indef) + + ! Assorted fixed parameters (could be made part of control) + integer(long), parameter :: BLK_SZ = 2**20 ! 8+4MB pages (real+int) + + ! + ! These parameters are used for diagnostic output for generating profiles + ! and pictures of the parallel tree decomposition + ! + !%%!logical, parameter :: dolog = .true. + !%%logical, parameter :: dolog = .false. + !%%integer, parameter :: LOG_UNIT = 15 + + !%%!logical, parameter :: dograph = .true. + !%%logical, parameter :: dograph = .false. + !%%integer, parameter :: GRAPH_UNIT = 16 + + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + ! Type for custom allocator + ! Used to aggregate many small allocations by doing a single big allocation + ! and chopping it up. + ! Note: Only supports freeall operation, not individual frees. + type smalloc_type + real(wp), dimension(:), allocatable :: rmem ! real memory + integer(long) :: rmem_size ! needed as size(rmem,kind=long) is f2003 + integer(long) :: rhead = 0 ! last location containing useful information + ! in rmem + integer, dimension(:), allocatable :: imem ! integer memory + integer(long) :: imem_size ! needed as size(imem,kind=long) is f2003 + integer(long) :: ihead = 0 ! last location containing useful information + ! in imem + type(smalloc_type), pointer :: next_alloc => null() + type(smalloc_type), pointer :: top_real => null() ! Last page where real + ! allocation was successful + type(smalloc_type), pointer :: top_int => null() ! Last page where integer + ! allocation was successful +!$ integer(omp_lock_kind) :: lock + end type smalloc_type + + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + ! Stack memory allocation type + type stack_mem_type + real(wp), dimension(:), allocatable :: mem ! real memory + integer(long) :: mem_size ! needed as size(mem,kind=long) is f2003 + integer(long) :: head = 0 ! last location containing useful information + type(stack_mem_type), pointer :: below => null() ! next stack frame down + end type stack_mem_type + + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + ! + ! Data type for information generated in analyse phase + ! + type ma97_akeep + private + + logical :: check ! copy of check as input to analyse phase + integer :: flag ! copy of error flag. + integer :: maxmn ! maximum value of blkm or blkn + integer :: n ! Dimension of matrix + integer :: ne ! Set to number of entries input by user. + integer(long) :: nfactor + integer :: nnodes = -1 ! Number of nodes in assembly tree + integer :: num_two ! This is set to 0 as we ignore any negative signs + ! that indicate 2x2 pivot (analyse does not exploit them) + + ! child_list(child_ptr(node):child_ptr(node+1)-1) is list of children + ! of node. Used to ensure we always sum contributions from children + ! in the same order + integer, dimension(:), allocatable :: child_ptr + integer, dimension(:), allocatable :: child_list + integer, dimension(:), allocatable :: invp ! inverse of pivot order that + ! is passed to factorize phase + integer, dimension(:), allocatable :: level ! level(i) of the assembly + ! tree at which node i sits. root is level 1. + integer, dimension(:,:), allocatable :: nlist ! map from A to factors + ! For nodes i, the entries nlist(1:2, nptr(i):nptr(i+1)-1) define + ! a relationship: + ! nodes(node)%lcol( nlist(2,j) ) = val( nlist(1,j) ) + integer, dimension(:), allocatable :: nptr ! Entries into nlist for + ! nodes of the assembly tree. Has length nnodes+1 + integer, dimension(:), allocatable :: rlist ! rlist(rptr(i):rptr(i+1)-1) + ! contains the row indices for node i of the assembly tree. + ! At each node, the list + ! is in elimination order. Allocated within mc78_analyse. + integer(long), dimension(:), allocatable :: rptr ! Pointers into rlist + ! for nodes of assembly tree. Has length nnodes+1. + ! Allocated within mc78_analyse. + integer, dimension(:), allocatable :: sparent ! sparent(i) is parent + ! of node i in assembly tree. sparent(i)=nnodes+1 if i is a root. + ! The parent is always numbered higher than each of its children. + ! Allocated within mc78_analyse. + integer, dimension(:), allocatable :: sptr ! (super)node pointers. + ! Supernode i consists of sptr(i) through sptr(i+1)-1. + ! Allocated within mc78_analyse. + integer(long), dimension(:), allocatable :: subtree_work ! For each node, + ! the number of flops involved in the subtree rooted at that node. + + ! Following components are for cleaned up matrix data. + ! LOWER triangle only. We have to retain these for factorize phase + ! as used if the user wants to do scaling. + ! These components are NOT used if check is set to .false. + ! on call to ma97_analyse. + integer, allocatable :: ptr(:) ! column pointers + integer, allocatable :: row(:)! row indices + integer :: lmap ! used by hsl_mc69 + integer, allocatable :: map(:) ! used by hsl_mc69 + + ! Following components are cached members of info + integer :: matrix_dup + integer :: matrix_outrange + integer :: matrix_missing_diag + integer :: maxdepth + integer(long) :: num_flops ! not copied to info in factor, but used to + ! determine if parallelism should be used + integer :: num_sup + integer :: ordering + + ! Scaling from matching-based ordering + real(wp), dimension(:), allocatable :: scaling + end type ma97_akeep + + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + ! Data type for storing each node of the factors + type node_type + integer :: nelim + integer :: ndelay + real(wp), dimension(:), pointer :: lcol ! values in factors + ! (will also include unneeded data for any columns delayed from this + ! node) + integer, dimension(:), pointer :: perm ! permutation of columns at this + ! node: perm(i) is column index in expected global elimination order + ! that is actually eliminated at local elimination index i + ! Assuming no delays or permutation this will be + ! sptr(node):sptr(node+1)-1 + ! Following components are used to index directly into contiguous arrays + ! lcol and perm without taking performance hit for passing pointers + type(smalloc_type), pointer :: rsmptr, ismptr + integer(long) :: rsmsa, ismsa + end type node_type + + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + ! + ! Data type for data generated in factorise phase + ! + type ma97_fkeep + private + + integer :: flag ! copy of error flag. + real(wp), dimension(:), allocatable :: scaling ! Stores scaling for + ! each entry (in original matrix order) + type(node_type), dimension(:), allocatable :: nodes ! Stores pointers + ! to information about nodes + type(smalloc_type), pointer :: alloc=>null() ! Linked list of memory pages + ! pointed to by nodes variable + logical :: pos_def ! set to true if user indicates matrix pos. definite + + ! Info components to copy on solve + integer :: matrix_rank + integer :: maxfront + integer :: num_delay + integer(long) :: num_factor + integer(long) :: num_flops + integer :: num_neg + integer :: num_two + end type ma97_fkeep + + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + ! + ! Data type for temporary stack data that is only needed transiently during + ! factorise phase + ! Each instance represents a "page" of memory + ! + type stack_type + real(wp), dimension(:), pointer :: val => null() ! generated element + ! Following components allow us to pass contiguous array val without + ! taking performance hit for passing pointers + type(stack_mem_type), pointer :: stptr => null() + integer(long) :: stsa + end type stack_type + + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + ! + ! Data type for per-thread stats. This is amalgamated after end of parallel + ! section to get info parameters of same name. + ! + type thread_stats + integer :: flag = MA97_SUCCESS + integer :: st = 0 + integer :: maxfront = 0 ! Maximum front size + integer(long) :: num_factor = 0_long ! Number of entries in factors + integer(long) :: num_flops = 0_long ! Number of floating point operations + integer :: num_delay = 0 ! Number of delayed variables + integer :: num_neg = 0 ! Number of negative pivots + integer :: num_two = 0 ! Number of 2x2 pivots + integer :: num_zero = 0 ! Number of zero pivots + end type thread_stats + + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + ! + ! This type is used to pass buf around for each thread such that it can + ! be reallocated independantly + ! + type real_ptr_type + real(wp), pointer :: chkptr => null() + real(wp), dimension(:), allocatable :: val + end type real_ptr_type + + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + ! + ! Data type for control parameters + ! + type ma97_control + logical :: action = .true. ! used in indefinite case only. + ! If true and the matrix is found to be + ! singular, computation continues with a warning. + ! Otherwise, terminates with error MA97_ERROR_SINGULAR. + integer(long) :: factor_min = 20000000 ! min number of expected flops + ! before parallel execution is used in factorization (=2e7) + integer :: nemin = nemin_default ! Min. number of eliminations at a tree + ! node for amalgamation not to be considered. + real(wp) :: multiplier = 1.1 ! size to multiply expected memory size by + ! when doing initial memory allocation to allow for delays. + integer :: ordering = 5 ! controls choice of ordering + ! 0 Order must be supplied by user + ! 1 An approximate minimum degree ordering is used. + ! 2 A minimum degree ordering is used (as in MA27). + ! 3 METIS ordering with default settings is used. + ! 4 MA47 ordering for indefinite matrices is used. + ! 5 Automatic choice between AMD and METIS. Parallel (DEFAULT) + ! 6 Automatic choice between AMD and METIS. Serial. + ! 7 Matching with AMD on compressed matrix. + ! 8 Matching with METIS on compressed matrix. + integer :: print_level = 0 ! Controls diagnostic printing. + ! Possible values are: + ! < 0: no printing. + ! 0: error and warning messages only. + ! 1: as 0 plus basic diagnostic printing. + ! > 1: as 1 plus some more detailed diagnostic messages. + integer :: scaling = 0 ! controls use of scaling. + ! <=0: user supplied (or no) scaling + ! 1: mc64 + ! 2: mc77 + ! 3: mc64 from mc80 + ! >=4: mc30 + real(wp) :: small = 1e-20_wp ! Minimum pivot size (absolute value of a + ! pivot must be of size at least small to be accepted). + logical :: solve_blas3 = .false. ! Use dgemm rather than dgemv in solve + ! with a single rhs if true + integer(long) :: solve_min = 100000 ! Minimum value of info%num_factor to + ! deploy parallel solve on + logical :: solve_mf = .false. ! Do we use s/n (false) or m/f (true) solve? + real(wp) :: u = 0.01 + integer :: unit_diagnostics = 6 ! unit number for diagnostic printing. + ! Printing is suppressed if unit_diagnostics < 0. + integer :: unit_error = 6 ! unit number for error messages. + ! Printing is suppressed if unit_error < 0. + integer :: unit_warning = 6 ! unit number for warning messages. + ! Printing is suppressed if unit_warning < 0. + + ! + ! Undocumented + ! + integer(long) :: min_subtree_work = int(1e5) ! Minimum amount of work + ! to aim for in each parallel task for subtree decomposition + integer :: min_ldsrk_work = int(1e4) ! Minimum amount of work to aim + ! for in an ldsrk subtask + + ! + ! Added after initial release + ! + real(wp) :: consist_tol = epsilon(one) ! used on call to + ! ma97_solve_fredholm to + ! determine if system is consistent (singular case only) + end type ma97_control + + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + ! + ! Data type for information returned by code + ! + type ma97_info + integer :: flag ! Takes one of the enumerated flag values: + ! MA97_SUCCESS + ! MA97_ERROR_XXX + ! MA97_WARNING_XXX + integer :: flag68 = 0 ! error flag from hsl_mc68 + integer :: flag77 = 0 ! error flag from mc77 + integer :: matrix_dup = 0 ! Number of duplicated entries. + integer :: matrix_rank = 0 ! Rank of matrix (anal=structral, fact=actual) + integer :: matrix_outrange = 0 ! Number of out-of-range entries. + integer :: matrix_missing_diag = 0 ! Number of missing diag. entries + integer :: maxdepth ! Maximum depth of tree + integer :: maxfront ! Maximum front size + integer(long) :: num_factor = 0_long ! Number of entries in factors + integer(long) :: num_flops = 0_long ! Number of floating point operations + integer :: num_delay = 0 ! Number of delayed variables + integer :: num_neg = 0 ! Number of negative pivots + integer :: num_sup = 0 ! Number of supernodes + integer :: num_two = 0 ! Number of 2x2 pivots used by factorization + integer :: ordering = 0 ! ordering actually used + integer :: stat = 0 ! stat parameter + end type ma97_info + + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + ! Make interfaces generic. + interface ma97_analyse + module procedure analyse_double + end interface ma97_analyse + + interface ma97_analyse_coord + module procedure ma97_analyse_coord_double + end interface ma97_analyse_coord + + interface ma97_factor + module procedure ma97_factor_double + end interface ma97_factor + + interface ma97_factor_solve + module procedure ma97_factor_solve_double + module procedure ma97_factor_solve_one_double + end interface ma97_factor_solve + + interface ma97_solve + module procedure ma97_solve_one_double + module procedure ma97_solve_mult_double + end interface ma97_solve + + interface ma97_solve_fredholm + module procedure ma97_solve_fredholm_double + end interface ma97_solve_fredholm + + interface ma97_free + module procedure free_akeep_double + module procedure free_fkeep_double + end interface ma97_free + + interface ma97_finalise + module procedure finalise_both_double + end interface ma97_finalise + + interface ma97_enquire_posdef + module procedure ma97_enquire_posdef_double + end interface ma97_enquire_posdef + + interface ma97_enquire_indef + module procedure ma97_enquire_indef_double + end interface ma97_enquire_indef + + interface ma97_alter + module procedure ma97_alter_double + end interface ma97_alter + + interface ma97_lmultiply + module procedure ma97_lmultiply_one_double + module procedure ma97_lmultiply_mult_double + end interface ma97_lmultiply + + interface ma97_sparse_fwd_solve + module procedure ma97_sparse_fwd_solve_double + end interface ma97_sparse_fwd_solve + + interface ma97_get_n__ + module procedure ma97_get_n_double + end interface ma97_get_n__ + + interface ma97_get_nz__ + module procedure ma97_get_nz_double + end interface ma97_get_nz__ + + ! Make smalloc generic + interface smalloc + module procedure real_alloc, int_alloc + end interface smalloc + + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +contains + +!**************************************************************************** +! +! Analyse phase. +! Matrix entered in CSC format (lower triangle). +! The user optionally inputs the pivot order. If not, HSL_MC68 called. +! Structure is then expanded. +! Supervariables are computed +! and then the assembly tree is constructed and the data structures +! required by the factorization are set up. +! There is no checking of the user's data if check = .false. +! Otherwise, HSL_MC69 used to clean data. +! +subroutine analyse_double(check, n, ptr, row, akeep, control, info, & + order, val) + logical, intent(in) :: check ! if set to true, matrix data is checked + ! and cleaned data stored in akeep + integer, intent(in) :: n ! order of A + integer, intent(in) :: row(:) ! row indices of lower triangular part + integer, intent(in) :: ptr(:) ! col pointers for lower triangular part + type(ma97_akeep), intent(out) :: akeep ! See derived-type declaration + type(ma97_control), intent(in) :: control ! See derived-type declaration + type(ma97_info), intent(out) :: info ! See derived-type declaration + integer, optional, intent(inout) :: order(:) + ! Must be present and set on entry if control%ordering = 0. + ! If control%ordering = 0 and i is used to index a variable, |order(i)| + ! must hold its position in the pivot sequence. If a 1x1 pivot i is + ! required, the user must set order(i)>0. If a 2x2 pivot involving + ! variables i and j is required, the user must set + ! order(i)<0, order(j)<0 and |order(j)| = |order(i)|+1. + ! If i is not used to index a variable, + ! order(i) must be set to zero. + ! On exit, holds the pivot order to be used by factorization. + ! Note: this input is consistent with our out-of-core solvers. + !!!!! Note: although we allow 2x2 pivots to be input, we actually ignore + ! the signs (we reset signs of order after call to hsl_mc68 or hsl_mc80) + real(wp), optional, intent(in) :: val(:) ! must be present + ! if a matching-based elimination ordering is required + ! (control%ordering 7 or 8). + ! If present, val(k) must hold the value of the entry in row(k). + + character(50) :: context ! Procedure name (used when printing). + integer :: flag69 ! error flag for hsl_mc69 + integer :: mp ! stream number for diagnostic messages + integer :: i,j + integer :: nout ! stream for errors + integer :: nout1 ! stream for warnings + integer :: nz ! entries in expanded matrix + integer :: ord80 ! controls ordering of compressed matrix within mc80 + integer :: st ! stat parameter + + integer, dimension(:), allocatable :: order2 + integer, dimension(:), allocatable :: perm + integer, dimension(:), allocatable :: ptr2 ! col. pointers for expanded mat + integer, dimension(:), allocatable :: row2 ! row indices for expanded matrix + + ! the following are only used for matching-based orderings + real(wp), dimension(:), allocatable :: val_clean ! cleaned values if + ! val is present and checking is required. + real(wp), dimension(:), allocatable :: val2 ! expanded matrix if + ! val is present. + + type(mc80_control) :: control80 + type(mc80_info) :: info80 + + ! Initialise + context = 'ma97_analyse' + call ma97_free(akeep) + info%flag = 0 + info%matrix_missing_diag = 0 + info%matrix_outrange = 0 + info%matrix_dup = 0 + info%matrix_rank = n + info%maxdepth = 0 + info%num_sup = 0 + info%ordering = 0 + info%stat = 0 + + ! Set stream numbers + mp = control%unit_diagnostics + nout = control%unit_error + if (control%print_level < 0) nout = -1 + nout1 = control%unit_warning + if (control%print_level < 0) nout1 = -1 + + ! Print status on entry + if (control%print_level>=1 .and. mp>=0) then + write (mp,'(/a)') ' On entry to ma97_analyse:' + write (mp,'(a,i15)') ' control%print_level = ', & + control%print_level + write (mp,'(a,i15)') ' control%unit_diagnostics = ',mp + write (mp,'(a,i15)') ' control%unit_error = ',control%unit_error + write (mp,'(a,i15)') ' control%unit_warning = ',control%unit_warning + write (mp,'(a,i15)') ' control%nemin = ',control%nemin + write (mp,'(a,i15)') ' control%ordering = ',control%ordering + write (mp,'(a,i15)') ' n = ',n + end if + + akeep%check = check + akeep%n = n + akeep%flag = 0 + + ! Checking of matrix data + if (n < 0) then + info%flag = MA97_ERROR_A_N_OOR + call ma97_print_flag(context,nout,info%flag) + akeep%flag = info%flag + return + end if + + if (n .eq. 0) then + akeep%nnodes = 0 + allocate(akeep%sptr(0), stat=st) ! used to check if analyse has been run + if (st .ne. 0) go to 490 + akeep%matrix_dup = 0 + akeep%matrix_missing_diag = 0 + akeep%matrix_outrange = 0 + akeep%maxdepth = 0 + akeep%num_sup = 0 + akeep%ordering = 0 + return + end if + + ! check control%ordering has a valid value + if (control%ordering < 0 .or. control%ordering > 8) then + info%flag = MA97_ERROR_ORDER + call ma97_print_flag(context,nout,info%flag) + akeep%flag = info%flag + return + end if + + ! check val present when expected + if (control%ordering.eq.7 .or. control%ordering.eq.8) then + if (.not.present(val)) then + info%flag = MA97_ERROR_VAL + call ma97_print_flag(context,nout,info%flag) + akeep%flag = info%flag + return + end if + end if + + akeep%ne = ptr(n+1)-1 + + st = 0 + if (check) then + deallocate (akeep%ptr,stat=st) + allocate (akeep%ptr(n+1),stat=st) + if (st .ne. 0) go to 490 + + if (present(val)) then + call mc69_cscl_convert(HSL_MATRIX_REAL_SYM_INDEF, n, n, ptr, row, & + akeep%ptr, akeep%row, flag69, val_in=val, val_out=val_clean, & + lmap=akeep%lmap, map=akeep%map, & + noor=info%matrix_outrange, ndup=info%matrix_dup) + else + call mc69_cscl_convert(HSL_MATRIX_REAL_SYM_INDEF, n, n, ptr, row, & + akeep%ptr, akeep%row, flag69, lmap=akeep%lmap, map=akeep%map, & + noor=info%matrix_outrange, ndup=info%matrix_dup) + end if + ! Check for errors + if (flag69 < 0) then + if (flag69 .eq. -1) info%flag = MA97_ERROR_ALLOCATION + if (flag69 .eq. -5) info%flag = MA97_ERROR_A_PTR + if (flag69 .eq. -6) info%flag = MA97_ERROR_A_PTR + if (flag69 .eq. -10) info%flag = MA97_ERROR_A_ALL_OOR + call ma97_print_flag(context,nout,info%flag) + akeep%flag = info%flag + return + end if + + ! Check whether warning needs to be raised + ! Note: same numbering of positive flags as in mc69 + if (flag69 > 0) then + info%flag = flag69 + call ma97_print_flag(context,nout1,info%flag) + end if + nz = akeep%ptr(n+1) - 1 + else + nz = ptr(n+1)-1 + end if + + ! If the pivot order is not supplied, we need to compute an order. + ! Otherwise, we check the supplied order. + + deallocate (akeep%invp,stat=st) + allocate (akeep%invp(n),perm(n),order2(n),ptr2(n+1),row2(2*nz),stat=st) + if (st .ne. 0) go to 490 + if(control%ordering.eq.7 .or. control%ordering.eq.8) then + allocate(akeep%scaling(n), val2(2*nz), stat=st) + if (st .ne. 0) go to 490 + end if + + select case(control%ordering) + case(0) + if (.not.present(order)) then + ! we have an error since user should have supplied the order + info%flag = MA97_ERROR_ORDER + akeep%flag = info%flag + call ma97_print_flag(context,nout,info%flag) + return + end if + call check_order(n,order,akeep%invp,perm,akeep,control,info) + if (info%flag < 0) go to 490 + order2(1:n) = order(1:n) + if (check) then + call expand_pattern(n, nz, akeep%ptr, akeep%row, ptr2, row2) + else + call expand_pattern(n, nz, ptr, row, ptr2, row2) + end if + info%ordering = 0 + case(7:8) + ! matching-based ordering required + ! Expand the matrix as more efficient to do it and then + ! call hsl_mc80 with full matrix supplied + + if (check) then + call expand_matrix(n, nz, akeep%ptr, akeep%row, val_clean, ptr2, & + row2, val2) + deallocate (val_clean,stat=st) + else + call expand_matrix(n, nz, ptr, row, val, ptr2, row2, val2) + end if + + if (control%ordering .eq. 7) ord80 = 1 + if (control%ordering .eq. 8) ord80 = 3 + + !control80%unmatched_last = .true. + !control80%unmatched_scale_zero = .true. + + call mc80_order_full(ord80, n, ptr2, row2, val2, order2, control80, & + info80, scale=akeep%scaling) + + select case(info80%flag) + case(0) + ! Success; do nothing + case(1) + ! singularity warning required + info%flag = MA97_WARNING_ANAL_SINGULAR + call ma97_print_flag(context,nout1,info%flag) + case(-1) + info%flag = MA97_ERROR_ALLOCATION + info%stat = info80%stat + call ma97_print_flag(context,nout,info%flag) + akeep%flag = info%flag + return + case(-4) + info%flag = MA97_ERROR_MC68 + call ma97_print_flag(context,nout,info%flag) + akeep%flag = info%flag + return + case(-6) + info%flag = MA97_ERROR_NO_METIS + call ma97_print_flag(context,nout,info%flag) + akeep%flag = info%flag + return + case default + info%flag = MA97_ERROR_UNKNOWN + call ma97_print_flag(context,nout,info%flag) + akeep%flag = info%flag + return + end select + + info%matrix_rank = info80%compress_rank + info%ordering = control%ordering + ! we do not allow input of 2x2 pivots and so we get rid of negative signs + do i = 1,n + j = abs(order2(i)) + perm(i) = j + end do + deallocate (val2,stat=st) + case default + ! ordering computed using hsl_mc68 and then pattern of matrix expanded + if (check) then + call compute_order(n,nz,akeep%ptr,akeep%row,order2,akeep%invp,perm, & + control,info) + call expand_pattern(n, nz, akeep%ptr, akeep%row, ptr2, row2) + else + call compute_order(n,nz,ptr,row,order2,akeep%invp,perm, & + control,info) + call expand_pattern(n, nz, ptr, row, ptr2, row2) + end if + if (info%flag < 0) go to 490 + end select + + + ! perform rest of analyse + if (check) then + call analyse_phase(n, akeep%ptr, akeep%row, ptr2, row2, order2, & + akeep%invp, perm, akeep, control, info) + else + call analyse_phase(n, ptr, row, ptr2, row2, order2, akeep%invp, perm, & + akeep, control, info) + end if + + if (present(order)) order(1:n) = abs(order2(1:n)) + + 490 continue + info%stat = st + if (info%stat .ne. 0) then + info%flag = MA97_ERROR_ALLOCATION + call ma97_print_flag(context,nout,info%flag,st=info%stat) + end if + akeep%flag = info%flag + +end subroutine analyse_double + +!**************************************************************************** +! +! Analyse phase. +! Matrix entered in coordinate format. +! HSL_MC69 is used to convert the data to CSC format. +! The user optionally inputs the pivot order. If not, HSL_MC68 called. +! Structure is then expanded. +! Supervariables are computed +! and then the assembly tree is constructed and the data structures +! required by the factorization are set up. +! +subroutine ma97_analyse_coord_double(n, ne, row, col, akeep, control, & + info, order, val) + integer, intent(in) :: n ! order of A + integer, intent(in) :: ne ! entries to be input by user + integer, intent(in) :: row(:) ! row indices + integer, intent(in) :: col(:) ! col indices + type(ma97_akeep), intent(out) :: akeep ! See derived-type declaration + type(ma97_control), intent(in) :: control ! See derived-type declaration + type(ma97_info), intent(out) :: info ! See derived-type declaration + integer, intent(inout), optional :: order(:) + ! Must be present and set on entry if control%ordering = 0 + ! i is used to index a variable, |order(i)| must + ! hold its position in the pivot sequence. If a 1x1 pivot i is required, + ! the user must set order(i)>0. If a 2x2 pivot involving variables + ! i and j is required, the user must set + ! order(i)<0, order(j)<0 and |order(j)| = |order(i)|+1. + ! If i is not used to index a variable, + ! order(i) must be set to zero. + ! On exit, holds the pivot order to be used by factorization. + !!!!! Note: although we allow 2x2 pivots to be input, we actually ignore + ! the signs (we reset signs of order after call to hsl_mc68 or hsl_mc80) + real(wp), optional, intent(in) :: val(:) ! must be present + ! if a matching-based elimination ordering is required + ! (control%ordering 7 or 8). + ! If present, val(k) must hold value of entry in row(k) and col(k). + + integer, dimension(:), allocatable :: perm + ! Allocated to have size n. + + integer, dimension(:), allocatable :: ptr2 ! col. pointers for expanded mat + integer, dimension(:), allocatable :: row2 ! row indices for expanded matrix + integer, dimension(:), allocatable :: order2 ! pivot order + + type(mc80_control) :: control80 + type(mc80_info) :: info80 + + real(wp), dimension(:), allocatable :: val_clean ! cleaned values if + ! val is present. + real(wp), dimension(:), allocatable :: val2 ! expanded matrix (val present) + + character(50) :: context ! Procedure name (used when printing). + integer :: flag69 ! error flag for hsl_mc69 + integer :: i + integer :: mp ! stream number for diagnostic messages + integer :: nout ! stream for errors + integer :: nout1 ! stream for warnings + integer :: nz ! entries in expanded matrix + integer :: ord80 ! controls ordering of compressed matrix within mc80 + integer :: st ! stat parameter + + ! Initialise + context = 'ma97_analyse_coord' + call ma97_free(akeep) + info%flag = 0 + info%matrix_missing_diag = 0 + info%matrix_outrange = 0 + info%matrix_dup = 0 + info%matrix_rank = n + info%maxdepth = 0 + info%num_sup = 0 + info%ordering = 0 + info%stat = 0 + + ! Set stream numbers + mp = control%unit_diagnostics + nout = control%unit_error + if (control%print_level < 0) nout = -1 + nout1 = control%unit_warning + if (control%print_level < 0) nout1 = -1 + + ! Output status on entry + if (control%print_level>=1 .and. mp>=0) then + write (mp,'(/a)') ' On entry to ma97_analyse_coord:' + write (mp,'(a,i15)') ' control%print_level = ', & + control%print_level + write (mp,'(a,i15)') ' control%unit_diagnostics = ',mp + write (mp,'(a,i15)') ' control%unit_error = ',control%unit_error + write (mp,'(a,i15)') ' control%unit_warning = ',control%unit_warning + write (mp,'(a,i15)') ' control%nemin = ',control%nemin + write (mp,'(a,i15)') ' control%ordering = ',control%ordering + write (mp,'(a,i15)') ' n = ',n + write (mp,'(a,i15)') ' ne = ',ne + end if + + akeep%check = .true. + akeep%n = n + akeep%ne = ne + akeep%flag = 0 + + ! + ! Checking of matrix data + ! + if (n < 0 .or. ne < 0) then + info%flag = MA97_ERROR_A_N_OOR + akeep%flag = info%flag + call ma97_print_flag(context,nout,info%flag) + return + end if + + if (n .eq. 0) then + akeep%nnodes = 0 + allocate(akeep%sptr(0), stat=st) ! used to check if analyse has been run + if (st .ne. 0) go to 490 + akeep%matrix_dup = 0 + akeep%matrix_missing_diag = 0 + akeep%matrix_outrange = 0 + akeep%maxdepth = 0 + akeep%num_sup = 0 + akeep%ordering = 0 + return + end if + + ! check control%ordering has a valid value + if (control%ordering < 0 .or. control%ordering > 8) then + info%flag = MA97_ERROR_ORDER + call ma97_print_flag(context,nout,info%flag) + akeep%flag = info%flag + return + end if + + ! check val present when expected + if (control%ordering.eq.7 .or. control%ordering.eq.8) then + if (.not.present(val)) then + info%flag = MA97_ERROR_VAL + call ma97_print_flag(context,nout,info%flag) + akeep%flag = info%flag + return + end if + end if + + st = 0 + deallocate (akeep%ptr,stat=st) + allocate (akeep%ptr(n+1),stat=st) + if (st .ne. 0) go to 490 + + if (present(val)) then + call mc69_coord_convert(HSL_MATRIX_REAL_SYM_INDEF, n, n, ne, row, col, & + akeep%ptr, akeep%row, flag69, val_in=val, val_out=val_clean, & + lmap=akeep%lmap, map=akeep%map, & + noor=info%matrix_outrange, ndup=info%matrix_dup) + else + call mc69_coord_convert(HSL_MATRIX_REAL_SYM_INDEF, n, n, ne, row, col, & + akeep%ptr, akeep%row, flag69, lmap=akeep%lmap, map=akeep%map, & + noor=info%matrix_outrange, ndup=info%matrix_dup) + end if + + ! Check for errors + if (flag69 < 0) then + if (flag69 .eq. -1) info%flag = MA97_ERROR_ALLOCATION + if (flag69 .eq. -10) info%flag = MA97_ERROR_A_ALL_OOR + call ma97_print_flag(context,nout,info%flag) + akeep%flag = info%flag + return + end if + + ! Check whether warning needs to be raised + ! Note: same numbering of positive flags as in mc69 + if (flag69 > 0) then + info%flag = flag69 + call ma97_print_flag(context,nout1,info%flag) + akeep%flag = info%flag + end if + + nz = akeep%ptr(n+1) - 1 + + ! If the pivot order is not supplied, we need to compute an order + ! here, before we expand the matrix structure. + ! Otherwise, we must check the supplied order. + + deallocate(akeep%invp, stat=st) + allocate (akeep%invp(n),perm(n),order2(n),ptr2(n+1),row2(2*nz),stat=st) + if (st .ne. 0) go to 490 + if(control%ordering.eq.7 .or. control%ordering.eq.8) then + allocate(val2(2*nz),akeep%scaling(n),stat=st) + if (st .ne. 0) go to 490 + end if + + select case(control%ordering) + case(0) + if (.not.present(order)) then + ! we have an error since user should have supplied the order + info%flag = MA97_ERROR_ORDER + akeep%flag = info%flag + call ma97_print_flag(context,nout,info%flag) + return + end if + call check_order(n,order,akeep%invp,perm,akeep,control,info) + if (info%flag < 0) go to 490 + order2(1:n) = order(1:n) + call expand_pattern(n, nz, akeep%ptr, akeep%row, ptr2, row2) + info%ordering = 0 + + case(7:8) + ! matching-based ordering required + + call expand_matrix(n, nz, akeep%ptr, akeep%row, val_clean, ptr2, row2, & + val2) + deallocate (val_clean,stat=st) + + if (control%ordering .eq. 7) ord80 = 1 + if (control%ordering .eq. 8) ord80 = 3 + + call mc80_order_full(ord80,n,ptr2,row2,val2,order2,control80,info80,& + scale=akeep%scaling) + + select case(info80%flag) + case(0) + ! Success; do nothing + case(1) + ! singularity warning required + info%flag = MA97_WARNING_ANAL_SINGULAR + call ma97_print_flag(context,nout1,info%flag) + case(-1) + info%flag = MA97_ERROR_ALLOCATION + info%stat = info80%stat + call ma97_print_flag(context,nout,info%flag) + akeep%flag = info%flag + return + case(-4) + info%flag = MA97_ERROR_MC68 + call ma97_print_flag(context,nout,info%flag) + akeep%flag = info%flag + return + case(-6) + info%flag = MA97_ERROR_NO_METIS + call ma97_print_flag(context,nout,info%flag) + akeep%flag = info%flag + return + case default + info%flag = MA97_ERROR_UNKNOWN + call ma97_print_flag(context,nout,info%flag) + akeep%flag = info%flag + return + end select + + info%matrix_rank = info80%compress_rank + info%ordering = control%ordering + do i = 1,n + perm(i) = abs(order2(i)) + end do + deallocate (val2,stat=st) + + case default + call compute_order(n,nz,akeep%ptr,akeep%row,order2,akeep%invp,perm, & + control,info) + if (info%flag < 0) go to 490 + call expand_pattern(n, nz, akeep%ptr, akeep%row, ptr2, row2) + end select + + + ! we now have the expanded structure held using ptr2, row2 + ! and we are ready to get on with the analyse phase. + call analyse_phase(n, akeep%ptr, akeep%row, ptr2, row2, order2, & + akeep%invp, perm, akeep, control, info) + if (info%flag < 0) go to 490 + + if (present(order)) order(1:n) = abs(order2(1:n)) + + 490 continue + info%stat = st + if (info%stat .ne. 0) then + info%flag = MA97_ERROR_ALLOCATION + call ma97_print_flag(context,nout,info%flag,st=info%stat) + end if + akeep%flag = info%flag + +end subroutine ma97_analyse_coord_double + +!**************************************************************************** + +! +! Given lower triangular part of A held in row and ptr, expand to +! upper and lower triangular parts (pattern only). No checks. +! +! Note: we do not use hsl_mc34 here to expand A since, if we did, we would +! an extra copy of the lower triangle into the full structure before +! calling hsl_mc34 +! +subroutine expand_pattern(n,nz,ptr,row,aptr,arow) + integer, intent(in) :: n ! order of system + integer, intent(in) :: nz + integer, intent(in) :: ptr(n+1) + integer, intent(in) :: row(nz) + integer, intent(out) :: aptr(n+1) + integer, intent(out) :: arow(2*nz) + + integer :: i,j,k + + ! Set aptr(j) to hold no. nonzeros in column j + aptr(:) = 0 + do j = 1, n + do k = ptr(j), ptr(j+1) - 1 + i = row(k) + aptr(i) = aptr(i) + 1 + if (j.eq.i) cycle + aptr(j) = aptr(j) + 1 + end do + end do + + ! Set aptr(j) to point to where row indices will end in arow + do j = 2, n + aptr(j) = aptr(j-1) + aptr(j) + end do + aptr(n+1) = aptr(n) + 1 + + ! Fill arow and aptr + do j = 1, n + do k = ptr(j), ptr(j+1) - 1 + i = row(k) + arow(aptr(i)) = j + aptr(i) = aptr(i) - 1 + if (j.eq.i) cycle + arow(aptr(j)) = i + aptr(j) = aptr(j) - 1 + end do + end do + do j = 1,n + aptr(j) = aptr(j) + 1 + end do +end subroutine expand_pattern + +!**************************************************************************** +! +! Given lower triangular part of A held in row, val and ptr, expand to +! upper and lower triangular parts. + +subroutine expand_matrix(n,nz,ptr,row,val,aptr,arow,aval) + + integer, intent(in) :: n ! order of system + integer, intent(in) :: nz + integer, intent(in) :: ptr(n+1) + integer, intent(in) :: row(nz) + real(wp), intent(in) :: val(nz) + integer, intent(out) :: aptr(n+1) + integer, intent(out) :: arow(2*nz) + real(wp), intent(out) :: aval(2*nz) + + integer :: i,j,k,ipos,jpos + real(wp) :: atemp + + ! Set aptr(j) to hold no. nonzeros in column j + aptr(:) = 0 + do j = 1, n + do k = ptr(j), ptr(j+1) - 1 + i = row(k) + aptr(i) = aptr(i) + 1 + if (j.eq.i) cycle + aptr(j) = aptr(j) + 1 + end do + end do + + ! Set aptr(j) to point to where row indices will end in arow + do j = 2, n + aptr(j) = aptr(j-1) + aptr(j) + end do + aptr(n+1) = aptr(n) + 1 + + ! Fill arow, aval and aptr + do j = 1, n + do k = ptr(j), ptr(j+1) - 1 + i = row(k) + atemp = val(k) + ipos = aptr(i) + arow(ipos) = j + aval(ipos) = atemp + aptr(i) = ipos - 1 + if (j.eq.i) cycle + jpos = aptr(j) + arow(jpos) = i + aval(jpos) = atemp + aptr(j) = jpos - 1 + end do + end do + do j = 1,n + aptr(j) = aptr(j) + 1 + end do + +end subroutine expand_matrix + + +!**************************************************************************** +! +! This routine requires the LOWER triangular part of A +! to be held in CSC format. +! The user has supplied a pivot order and this routine checks it is OK +! and returns an error if not. Also sets perm, invp. +! +subroutine check_order(n, order, invp, perm, akeep, control, info) + integer, intent(in) :: n ! order of system + integer, intent(inout) :: order(:) + ! If i is used to index a variable, |order(i)| must + ! hold its position in the pivot sequence. If 1x1 pivot i required, + ! the user must set order(i)>0. If a 2x2 pivot involving variables + ! i and j is required, the user must set + ! order(i)<0, order(j)<0 and |order(j)| = |order(i)|+1. + ! If i is not used to index a variable, order(i) must be set to zero. + ! !!!! In this version, signs are reset to positive value + integer, intent(out) :: invp(n) + ! Used to check order and then holds inverse of perm. + integer, intent(out) :: perm(n) + type (ma97_akeep), intent(inout) :: akeep + type (ma97_control), intent(in) :: control + type (ma97_info), intent(inout) :: info + + character(50) :: context ! Procedure name (used when printing). + + integer :: i, j + integer :: k, l + integer :: nout ! stream for error messages + integer :: num_null ! number of unused variables + + context = 'ma97_analyse' + nout = control%unit_error + if (control%print_level < 0) nout = -1 + + if (size(order) < n) then + ! Order is too short + info%flag = MA97_ERROR_ORDER + akeep%flag = info%flag + call ma97_print_flag(context,nout,info%flag) + return + end if + + ! initialise + num_null = 0 + invp(:) = 0 + + do i = 1,n + order(i) = abs(order(i)) + end do + + ! Check user-supplied order and copy the absolute values to invp. + ! Also add up number of variables that are not used (null rows) + do i = 1, n + j = order(i) + if (j .eq. 0) then + num_null = num_null + 1 + cycle + end if + if (j > n) exit + if (invp(j) .ne. 0) exit ! Duplicate found + invp(j) = i + end do + if (i-1 .ne. n) then + info%flag = MA97_ERROR_ORDER + akeep%flag = info%flag + call ma97_print_flag(context,nout,info%flag) + return + end if + + ! ensure invp is set for null rows/cols (want abs(invp) to hold + ! a permutation) + if (num_null > 0) then + k = 1 + do i = 1,n + j = order(i) + if (j.ne.0) cycle + do l = k,n + if (invp(l) .eq. 0) exit + end do + invp(l) = i + k = l + 1 + end do + end if + + ! set perm to be inverse of invp (=abs(order) if num_null = 0) + do i = 1, n + j = abs(invp(i)) + perm(j) = i + end do + +end subroutine check_order + +!**************************************************************************** +! +! This routine requires the LOWER triangular part of A +! to be held in CSC format. +! This routines computes a pivot order. +! +subroutine compute_order(n, ne, ptr, row, order, invp, perm, & + control, info) + integer, intent(in) :: n ! order of system + integer, intent(in) :: ne ! entries in lower triangle of A + integer, intent(in) :: row(ne) ! row indices + integer, intent(in) :: ptr(n+1) ! col pointers + integer, intent(out) :: order(:) ! set by HSL_MC68 + integer, intent(out) :: invp(n) + ! Used to check order and then holds inverse of perm. + integer, intent(out) :: perm(n) + type (ma97_control), intent(in) :: control + type (ma97_info), intent(inout) :: info + + ! Following parameters are used for heuristic choice between AMD and + ! MeTiS. See report RAL-TR-2006-001: + ! "Towards an automatic ordering for a symmetric sparse direct solver" + ! I.S. Duff and J.A. Scott + integer, parameter :: bigN = int(1e5) + real(wp), parameter :: c(3) = (/ 3.0, 1.8, 10.0 /) + + type (mc68_control) :: control68 + + character(50) :: context ! Procedure name (used when printing). + + integer :: nout ! stream for error messages + integer :: nout1 ! stream for warnings + integer :: ord68 + integer :: flag, st + + ! Variables used in automatic determination of ordering method + logical :: oxo + integer(long) :: amd_nzl, metis_nzl + integer :: i, j, sz11, sz22 + integer, dimension(:), allocatable :: order2, invp2, perm2 + + context = 'ma97_analyse' + nout = control%unit_error + if (control%print_level < 0) nout = -1 + nout1 = control%unit_warning + if (control%print_level < 0) nout1 = -1 + + ! switch off hsl_mc68 printing + control68%lp = -1 + control68%wp = -1 + control68%mp = -1 + control68%print_level = -1 + + select case(control%ordering) + case(1:4) ! As per equivalent mc68 option: AMDD, AMD, MeTiS, MA47 + ord68 = control%ordering + call mc68_wrap(ord68, n, ne, ptr, row, order, invp, perm, & + control68, flag, info%stat, info%flag68) + case(5) ! Automatic choice between AMD and MeTiS (parallel) + ! FIXME: This heuristic could do with further validation + if(n.gt.bigN) then + ! n is moderatly large, just use MeTiS if possible + ord68 = 3 ! MeTiS + call mc68_wrap(ord68, n, ne, ptr, row, order, invp, perm, & + control68, flag, info%stat, info%flag68) + if(flag.eq.MA97_ERROR_NO_METIS) then + ord68 = 1 ! AMD + call mc68_wrap(ord68, n, ne, ptr, row, order, invp, perm, & + control68, flag, info%stat, info%flag68) + end if + else ! n is small, use same heuristic as in serial + ! Check if we have an OXO matrix: + ! Count size of a possible (2,2) block + sz22 = 0 + do i = n, 1, -1 + if(ptr(i).ne.ptr(i+1)) exit + sz22 = sz22 + 1 + end do + oxo = (sz22.gt.0) + sz11 = n - sz22 + ! Check if matching (1,1) block is also empty + oxo22a: do i = 1, sz11 + do j = ptr(i), ptr(i+1)-1 + if(row(j).lt.sz11) then + oxo = .false. + exit oxo22a + end if + end do + end do oxo22a + if(oxo) then + if(sz11 .gt. c(2)*sz22) then + ord68 = 1 ! AMD + call mc68_wrap(ord68, n, ne, ptr, row, order, invp, perm, & + control68, flag, info%stat, info%flag68) + else + ord68 = 3 ! MeTiS + call mc68_wrap(ord68, n, ne, ptr, row, order, invp, perm, & + control68, flag, info%stat, info%flag68) + if(flag.eq.MA97_ERROR_NO_METIS) then + ord68 = 1 ! AMD + call mc68_wrap(ord68, n, ne, ptr, row, order, invp, perm, & + control68, flag, info%stat, info%flag68) + end if + end if + else + ord68 = 1 ! AMD + call mc68_wrap(ord68, n, ne, ptr, row, order, invp, perm, & + control68, flag, info%stat, info%flag68) + ! Find predicted number of entries in factors + amd_nzl = get_nzl(n, ptr, row, perm, st) + if(st.ne.0) goto 10 + if(real(amd_nzl,kind=wp) .gt. c(3)*real(ne,kind=wp)) then + ! Handle errors from call for AMD + if(flag.lt.0) then + info%flag = flag + if (info%flag .ne. MA97_ERROR_ALLOCATION) & + call ma97_print_flag(context,nout,info%flag,st=info%stat) + return + elseif(flag.gt.0) then + info%flag = flag + call ma97_print_flag(context,nout1,info%flag) + end if + ! Allocate arrays to store MeTiS ordering temporarily + allocate(order2(n), invp2(n), perm2(n), stat=st) + if(st.ne.0) goto 10 + ord68 = 3 ! MeTiS + call mc68_wrap(ord68, n, ne, ptr, row, order2, invp2, perm2, & + control68, flag, info%stat, info%flag68) + if(flag.eq.MA97_ERROR_NO_METIS) then + ord68 = 1 ! AMD + flag = 0; info%flag68 = 0; info%stat = 0 + elseif(flag.ge.0) then + ! Find predicted number of entries in factors + metis_nzl = get_nzl(n, ptr, row, perm2, st) + if(st.ne.0) goto 10 + if(metis_nzl .lt. amd_nzl) then + ! Use MeTiS ordering + ord68 = 3 ! MeTiS + order(:) = order2(:) + invp(:) = invp2(:) + perm(:) = perm2(:) + else + ! Use AMD ordering + ord68 = 1 ! AMD + end if + end if + end if + end if + end if + case(6) ! Automatic choice between AMD and MeTiS (serial) + ! For more details, see RAL-TR-2006-001: + ! "Towards an automatic ordering for a symmetric sparse direct solver" + ! I.S. Duff and J.A. Scott + if(n.gt.bigN) then + if(ne .lt. c(1)*n) then + ord68 = 1 ! AMD + call mc68_wrap(ord68, n, ne, ptr, row, order, invp, perm, & + control68, flag, info%stat, info%flag68) + else + ord68 = 3 ! MeTiS + call mc68_wrap(ord68, n, ne, ptr, row, order, invp, perm, & + control68, flag, info%stat, info%flag68) + if(flag.eq.MA97_ERROR_NO_METIS) then + ord68 = 1 ! AMD + call mc68_wrap(ord68, n, ne, ptr, row, order, invp, perm, & + control68, flag, info%stat, info%flag68) + end if + end if + else + ! Check if we have an OXO matrix: + ! Count size of a possible (2,2) block + sz22 = 0 + do i = n, 1, -1 + if(ptr(i).ne.ptr(i+1)) exit + sz22 = sz22 + 1 + end do + oxo = (sz22.gt.0) + sz11 = n - sz22 + ! Check if matching (1,1) block is also empty + oxo22b: do i = 1, sz11 + do j = ptr(i), ptr(i+1)-1 + if(row(j).lt.sz11) then + oxo = .false. + exit oxo22b + end if + end do + end do oxo22b + if(oxo) then + if(sz11 .gt. c(2)*sz22) then + ord68 = 1 ! AMD + call mc68_wrap(ord68, n, ne, ptr, row, order, invp, perm, & + control68, flag, info%stat, info%flag68) + else + ord68 = 3 ! MeTiS + call mc68_wrap(ord68, n, ne, ptr, row, order, invp, perm, & + control68, flag, info%stat, info%flag68) + if(flag.eq.MA97_ERROR_NO_METIS) then + ord68 = 1 ! AMD + call mc68_wrap(ord68, n, ne, ptr, row, order, invp, perm, & + control68, flag, info%stat, info%flag68) + end if + end if + else + ord68 = 1 ! AMD + call mc68_wrap(ord68, n, ne, ptr, row, order, invp, perm, & + control68, flag, info%stat, info%flag68) + ! Find predicted number of entries in factors + amd_nzl = get_nzl(n, ptr, row, perm, st) + if(st.ne.0) goto 10 + if(real(amd_nzl,kind=wp) .gt. c(3)*real(ne,kind=wp)) then + ! Handle errors from call for AMD + if(flag.lt.0) then + info%flag = flag + if (info%flag .ne. MA97_ERROR_ALLOCATION) & + call ma97_print_flag(context,nout,info%flag,st=info%stat) + return + elseif(flag.gt.0) then + info%flag = flag + call ma97_print_flag(context,nout1,info%flag) + end if + ! Allocate arrays to store MeTiS ordering temporarily + allocate(order2(n), invp2(n), perm2(n), stat=st) + if(st.ne.0) goto 10 + ord68 = 3 ! MeTiS + call mc68_wrap(ord68, n, ne, ptr, row, order2, invp2, perm2, & + control68, flag, info%stat, info%flag68) + if(flag.eq.MA97_ERROR_NO_METIS) then + ord68 = 1 ! AMD + flag = 0; info%flag68 = 0; info%stat = 0 + elseif(flag.ge.0) then + ! Find predicted number of entries in factors + metis_nzl = get_nzl(n, ptr, row, perm2, st) + if(st.ne.0) goto 10 + if(metis_nzl .lt. amd_nzl) then + ! Use MeTiS ordering + ord68 = 3 ! MeTiS + order(:) = order2(:) + invp(:) = invp2(:) + perm(:) = perm2(:) + else + ! Use AMD ordering + ord68 = 1 ! AMD + end if + end if + end if + end if + end if + case default + info%flag = MA97_ERROR_ORDER + call ma97_print_flag(context,nout,info%flag,st=info%stat) + return + end select + info%ordering = ord68 + + if(flag.lt.0) then + info%flag = flag + if (info%flag .ne. MA97_ERROR_ALLOCATION) & + call ma97_print_flag(context,nout,info%flag,st=info%stat) + return + elseif(flag.gt.0) then + info%flag = flag + call ma97_print_flag(context,nout1,info%flag) + end if + + return + + 10 continue + info%flag = MA97_ERROR_ALLOCATION + info%stat = st + call ma97_print_flag(context,nout,info%flag,st=info%stat) + return +end subroutine compute_order + +!**************************************************************************** + +! +! Following function is based on mc78_analyse, but only goes as far as +! required to calculate the number of entries in L (without amalgamation) +! +integer(long) function get_nzl(n, ptr, row, perm, st) + integer, intent(in) :: n ! Dimension of system + integer, dimension(n+1), intent(in) :: ptr ! Column pointers + integer, dimension(ptr(n+1)-1), intent(in) :: row ! Row indices + integer, dimension(n), intent(in) :: perm + ! perm(i) must hold position of i in the pivot sequence. + integer, intent(out) :: st + + integer :: realn + integer :: i + integer, dimension(:), allocatable :: cc, parent, perm2, invp + integer, dimension(:), allocatable :: ptr2, row2 + + get_nzl = huge(0) + + ! Allocate memory + allocate(invp(n+1), perm2(n), parent(n), cc(n+1), ptr2(n+1), & + row2(2*ptr(n+1)), stat=st) + if(st.ne.0) return + + ! Expand matrix + ptr2(1:n+1) = ptr(1:n+1) + row2(1:ptr(n+1)-1) = row(1:ptr(n+1)-1) + call mc34_expand(n, row2, ptr2, invp) ! invp used as workspace + + ! Initialise inverse permutation + perm2(1:n) = perm(1:n) + do i = 1, n + invp(perm(i)) = i + end do + + ! Build elimination tree + call mc78_etree(n, ptr2, row2, perm2, invp, parent, st) + if(st.ne.0) return + + ! Postorder tree (modifies perm!) + call mc78_postorder(n, realn, ptr2, perm2, invp, parent, st) + if(st.ne.0) return + + ! Determine column counts + call mc78_col_counts(n, ptr2, row2, perm2, invp, parent, cc, st) + if(st.ne.0) return + + ! Calculate stats + do i = 1, n+1 + invp(i) = i + end do + call mc78_stats(n, invp, cc, nfact=get_nzl) +end function get_nzl + +!**************************************************************************** + +! This subroutine wraps a call to mc68_order with the given ord68 ordering +! to minimise error checking and other post-processing repetition. +subroutine mc68_wrap(ord68, n, ne, ptr, row, order, invp, perm, & + control68, flag, stat, flag68) + integer, intent(in) :: ord68 + integer, intent(in) :: n ! order of system + integer, intent(in) :: ne ! entries in lower triangle of A + integer, intent(in) :: row(ne) ! row indices + integer, intent(in) :: ptr(n+1) ! col pointers + integer, intent(out) :: order(:) ! set by HSL_MC68 + integer, intent(out) :: invp(n) + ! Used to check order and then holds inverse of perm. + integer, intent(out) :: perm(n) + type (mc68_control), intent(in) :: control68 + integer, intent(out) :: flag + integer, intent(out) :: stat + integer, intent(out) :: flag68 + + ! mc68 derived types + type (MC68_info) :: info68 + + integer :: i, j + integer :: k + integer :: l + integer :: num_null ! number of unused variables + + flag = 0 + flag68 = 0 + stat = 0 + + call mc68_order(ord68,n,ptr,row,order,control68,info68) + + if (info68%flag < 0) then + select case(info68%flag) + case(-1) + flag = MA97_ERROR_ALLOCATION + stat = info68%stat + case(-4) + flag = MA97_ERROR_ORDER + case(-5) + flag = MA97_ERROR_NO_METIS + case default + flag = MA97_ERROR_MC68 + flag68 = info68%flag + end select + return + elseif (info68%flag > 1) then + flag = MA97_WARNING_ANAL_SINGULAR + end if + + if (ord68 .eq. 4) then + !!! the pivot sequence will contain 2x2 pivots. In this + ! version we are going to ignore 2x2 pivots + do i = 1,n + order(i) = abs(order(i)) + end do + end if + + ! Add up number of variables that are not used (null rows) + + !!!! HSL_MC68 spec sheet says that order(i) = 0 if row i is null + ! but is this correct? Looks as though order contains a permutation + ! (at least if min deg-type algorithm used) so maybe don't + ! need the checks on order(i) being 0?? + + num_null = 0 + invp(:) = 0 + + do i = 1, n + j = order(i) + if (j .eq. 0) then + ! Variable i is not used + num_null = num_null + 1 + cycle + end if + invp(j) = i + end do + + ! ensure invp is set for null rows/cols (want abs(invp) to hold + ! a permutation) + if (num_null > 0) then + k = 1 + do i = 1,n + j = order(i) + if (j.ne.0) cycle + do l = k,n + if (invp(l) .eq. 0) exit + end do + invp(l) = i + k = l + 1 + end do + end if + + ! set perm to be inverse of invp (=abs(order) if num_null = 0) + do i = 1, n + j = abs(invp(i)) + perm(j) = i + end do +end subroutine mc68_wrap + +!**************************************************************************** + +! +! This routine requires the LOWER and UPPER triangular parts of A +! to be held in CSC format using ptr2 and row2 +! AND lower triangular part held using ptr and row. +! +! On exit from this routine, order is set to order +! input to factorization. +! +subroutine analyse_phase(n, ptr, row, ptr2, row2, order, invp, perm, & + akeep, control, info) + integer, intent(in) :: n ! order of system + integer, intent(in) :: ptr(n+1) ! col pointers (lower triangle) + integer, intent(in) :: row(ptr(n+1)-1) ! row indices (lower triangle) + integer, intent(in) :: ptr2(n+1) ! col pointers (whole matrix) + integer, intent(in) :: row2(ptr2(n+1)-1) ! row indices (whole matrix) + integer, dimension(n), intent(inout) :: order + ! On exit, holds the pivot order to be used by factorization. + integer, dimension(n), intent(out) :: invp + ! Work array. Used to hold inverse of order but + ! is NOT set to inverse for the final order that is returned. + integer, dimension(n), intent(inout) :: perm + ! On entry to mc78_analyse, perm(i) holds position of i in pivot + ! sequence. On exit from mc78_analyse holds the pivot order + ! to be used by ma97_factor. perm is copied to order + ! before return to user. + type (ma97_akeep), intent(inout) :: akeep + type (ma97_control), intent(in) :: control + type (ma97_info), intent(inout) :: info + + type(mc78_control) :: control78 + + character(50) :: context ! Procedure name (used when printing). + integer, dimension(:), allocatable :: child_next, child_head ! linked + ! list for children, used to build akeep%child_ptr, akeep%child_list + + integer :: blkm, blkn + integer :: info78 ! error flag for hsl_mc78 + integer :: i, j , k + integer :: nout, nout1 ! streams for errors and warnings + integer :: nz ! ptr(n+1)-1 + integer :: st + + context = 'ma97_analyse' + nout = control%unit_error + if (control%print_level < 0) nout = -1 + nout1 = control%unit_warning + if (control%print_level < 0) nout1 = -1 + + ! Check nemin (a node is merged with its parent if both involve + ! fewer than nemin eliminations). If out of range, use the default + control78%nemin = control%nemin + if (control78%nemin < 1) control78%nemin = nemin_default + + ! switch off printing from hsl_mc78 + control78%unit_error = -1 + control78%unit_warning = -1 + + ! we want null/rows columns to raise a warning + control78%ssa_abort = .false. + + ! switch on sorting within each supernode row list. + control78%sort = .true. + + ! Uncomment next line to do MA57 style s/n amalgamation + !control78%heuristic = 3; control78%nemin = 16 + + call mc78_analyse(n, ptr2, row2, perm, akeep%nnodes, akeep%sptr, & + akeep%sparent, akeep%rptr,akeep%rlist, & + control78, info78, stat=st, nfact=akeep%nfactor, & + nflops=info%num_flops) + info%num_factor = akeep%nfactor + + ! only posible non-zero values for error flag are +1 and -1. + select case(info78) + case(1) + if (info%flag .ne. MA97_WARNING_ANAL_SINGULAR) then + info%flag = MA97_WARNING_ANAL_SINGULAR + call ma97_print_flag(context,nout1,info%flag) + end if + case(-1) + ! allocation error + go to 490 + end select + + ! copy perm into order and set invp to hold inverse of order + do i = 1,n + j = perm(i) + order(i) = j + invp(j) = i + end do + ! any unused variables are at the end and so can set order for them + do j = akeep%sptr(akeep%nnodes+1), n + i = invp(j) + order(i) = 0 + end do + + ! Build map from A to L in nptr, nlist + nz = ptr(n+1) - 1 + allocate(akeep%nptr(n+1), akeep%nlist(2,nz), stat=st) + if (st .ne. 0) go to 490 + + call build_map(n, ptr, row, order, invp, akeep%nnodes, akeep%sptr, & + akeep%rptr, akeep%rlist, akeep%nptr, akeep%nlist, st) + if (st .ne. 0) go to 490 + + ! Find maxmn and setup levels + allocate(akeep%level(akeep%nnodes+1), stat=st) + if (st .ne. 0) go to 490 + + akeep%maxmn = 0 + akeep%level(akeep%nnodes+1) = 0 + info%maxfront = 0 + info%maxdepth = 0 + do i = akeep%nnodes, 1, -1 + blkn = akeep%sptr(i+1) - akeep%sptr(i) + blkm = int(akeep%rptr(i+1) - akeep%rptr(i)) + akeep%maxmn = max(akeep%maxmn, blkm, blkn) + akeep%level(i) = akeep%level(akeep%sparent(i)) + 1 + info%maxfront = max(info%maxfront, blkn) + info%maxdepth = max(info%maxdepth, akeep%level(i)) + end do + + ! Setup child_ptr, child_next and calculate work per subtree + allocate(child_next(akeep%nnodes+1), child_head(akeep%nnodes+1), & + akeep%child_ptr(akeep%nnodes+2), akeep%child_list(akeep%nnodes), & + akeep%subtree_work(akeep%nnodes+1), stat=st) + if (st .ne. 0) go to 490 + child_head(:) = -1 + do i = akeep%nnodes, 1, -1 ! backwards so child list is in order + blkn = akeep%sptr(i+1) - akeep%sptr(i) + blkm = int(akeep%rptr(i+1) - akeep%rptr(i)) + j = akeep%sparent(i) + ! Add to parent's child linked list + child_next(i) = child_head(j) + child_head(j) = i + ! Calculate extra work at this node + akeep%subtree_work(i) = 0 + do k = blkm, blkm-blkn+1, -1 + akeep%subtree_work(i) = akeep%subtree_work(i) + k**2 + end do + end do + akeep%subtree_work(akeep%nnodes+1) = 0 + ! Add work up tree, build child_ptr and child_list + akeep%child_ptr(1) = 1 + do i = 1, akeep%nnodes+1 + if(i.lt.akeep%nnodes+1) then + j = akeep%sparent(i) + akeep%subtree_work(j) = akeep%subtree_work(j) + akeep%subtree_work(i) + end if + j = child_head(i) + akeep%child_ptr(i+1) = akeep%child_ptr(i) + do while(j.ne.-1) + akeep%child_list(akeep%child_ptr(i+1)) = j + akeep%child_ptr(i+1) = akeep%child_ptr(i+1) + 1 + j = child_next(j) + end do + end do + + ! Info + info%matrix_rank = akeep%sptr(akeep%nnodes+1)-1 + info%num_sup = akeep%nnodes + + ! Store copy of info data in akeep + akeep%flag = info%flag + akeep%matrix_dup = info%matrix_dup + akeep%matrix_missing_diag = info%matrix_missing_diag + akeep%matrix_outrange = info%matrix_outrange + akeep%maxdepth = info%maxdepth + akeep%num_sup = info%num_sup + akeep%ordering = info%ordering + akeep%num_flops = info%num_flops + + return + + 490 continue + info%stat = st + if (info%stat .ne. 0) then + info%flag = MA97_ERROR_ALLOCATION + call ma97_print_flag(context,nout,info%flag,st=info%stat) + end if + +end subroutine analyse_phase + +!**************************************************************************** +! +! Build a map from A to nodes +! lcol( nlist(2,i) ) = val( nlist(1,i) ) +! nptr defines start of each node in nlist +! +subroutine build_map(n, ptr, row, perm, invp, nnodes, sptr, rptr, rlist, & + nptr, nlist, st) + ! Original matrix A + integer, intent(in) :: n + integer, dimension(n+1), intent(in) :: ptr + integer, dimension(ptr(n+1)-1), intent(in) :: row + ! Permutation and its inverse (some entries of perm may be negative to + ! act as flags for 2x2 pivots, so need to use abs(perm)) + integer, dimension(n), intent(in) :: perm + integer, dimension(n), intent(in) :: invp + ! Supernode partition of L + integer, intent(in) :: nnodes + integer, dimension(nnodes+1), intent(in) :: sptr + ! Row indices of L + integer(long), dimension(nnodes+1), intent(in) :: rptr + integer, dimension(rptr(nnodes+1)-1), intent(in) :: rlist + ! Output mapping + integer, dimension(nnodes+1), intent(out) :: nptr + integer, dimension(2, ptr(n+1)-1), intent(out) :: nlist + ! Error check paramter + integer, intent(out) :: st + + integer :: i, j, k, p + integer(long) :: jj + integer :: blkm + integer :: col + integer :: node + integer, dimension(:), allocatable :: ptr2, row2, origin + integer, dimension(:), allocatable :: map + + allocate(map(n), ptr2(n+3), row2(ptr(n+1)-1), origin(ptr(n+1)-1), stat=st) + if(st.ne.0) return + + ! + ! Build transpose of A in ptr2, row2. Store original posn of entries in + ! origin array. + ! + ! Count number of entries in row i in ptr2(i+2). Don't include diagonals. + ptr2(:) = 0 + do i = 1, n + do j = ptr(i), ptr(i+1)-1 + k = row(j) + if (k.eq.i) cycle + ptr2(k+2) = ptr2(k+2) + 1 + end do + end do + ! Work out row starts such that row i starts in posn ptr2(i+1) + ptr2(1:2) = 1 + do i = 1, n + ptr2(i+2) = ptr2(i+2) + ptr2(i+1) + end do + ! Drop entries into place + do i = 1, n + do j = ptr(i), ptr(i+1)-1 + k = row(j) + if (k.eq.i) cycle + row2(ptr2(k+1)) = i + origin(ptr2(k+1)) = j + ptr2(k+1) = ptr2(k+1) + 1 + end do + end do + + ! + ! Build nptr, nlist map + ! + p = 1 + do node = 1, nnodes + blkm = int(rptr(node+1) - rptr(node)) + nptr(node) = p + + ! Build map for node indices + do jj = rptr(node), rptr(node+1)-1 + map(rlist(jj)) = int(jj-rptr(node)+1) + end do + + ! Build nlist from A-lower transposed + do j = sptr(node), sptr(node+1)-1 + col = invp(j) + do i = ptr2(col), ptr2(col+1)-1 + k = abs(perm(row2(i))) ! row of L + if (k 0 + ! must hold right-hand sides on entry. On exit, holds solution. + type(ma97_akeep), intent(in) :: akeep + type(ma97_fkeep), intent(inout) :: fkeep + type(ma97_control), intent(in) :: control + type(ma97_info), intent(out) :: info + real(wp), dimension(akeep%n), optional, intent(inout) :: scale ! used to hold + ! row and column scaling factors. Must be set on entry if + ! control%scaling <= 0 + integer, dimension(akeep%n+1), optional, intent(in) :: ptr ! must be + ! present if on call to analyse phase, check = .false.. Must be unchanged + ! since that call. + integer, dimension(*), optional, intent(in) :: row ! must be present if + ! on call to analyse phase, check = .false.. Must be unchanged + ! since that call. + + real(wp), dimension(:), allocatable :: val2 + character(len=50) :: context + + logical :: abort + integer :: i + logical :: lsolve ! set to true if want to solve at same time as factorize + integer :: n, nz + integer :: nout, nout1 + integer :: mp + integer :: r + logical :: sing + integer :: st + type(stack_type), dimension(:), target, allocatable :: stack ! one entry + ! for each node, used to keep track of where memory is + type(thread_stats), dimension(:), allocatable :: stats ! one copy + ! per thread, accumulates per thread statistics that are then summed to + ! obtain global stats in info. + integer, dimension(:,:), allocatable :: map ! work array, one copy per + ! thread. Size (0:n, num_threads), with 0 index used to track which + ! node current map refers to. + type(real_ptr_type), dimension(:), allocatable :: buf ! stores pointer + ! to work array. One copy (and work array) per thread. + integer :: num_threads, this_thread + ! Solve parameters. Tree is broken up into multiple chunks. Parent-child + ! relations between chunks are stored in fwd_ptr and fwd (see solve routine + ! comments) + integer :: nchunk, local_job + integer, dimension(:), allocatable :: chunk_sa, chunk_en, fwd_ptr, fwd + type(smalloc_type), pointer :: next_alloc + + lsolve = .true. + if (ldx .eq. 0 .and. nrhs .eq. 0) lsolve = .false. + + ! Setup for any printing we may require + context = 'ma97_factor' + mp = control%unit_diagnostics + if (lsolve) context = 'ma97_factor_solve' + nout = control%unit_error + if (control%print_level < 0) nout = -1 + nout1 = control%unit_warning + if (control%print_level < 0) nout1 = -1 + + ! Perform appropriate printing + if (control%print_level >= 1 .and. mp >= 0) then + if (matrix_type == HSL_MATRIX_REAL_SYM_PSDEF) then + write (mp,'(//a,i2,a)') & + ' Entering ma97_factor with matrix_type = ', matrix_type, ' and :' + write (mp,'(a,5(/a,i12),5(/a,es12.4))') & + ' control parameters (control%) :', & + ' print_level Level of diagnostic printing = ', & + control%print_level, & + ' unit_diagnostics Unit for diagnostics = ', & + control%unit_diagnostics, & + ' unit_error Unit for errors = ', & + control%unit_error, & + ' unit_warning Unit for warnings = ', & + control%unit_warning, & + ' scaling Scaling control = ', & + control%scaling + else + write (mp,'(//a,i2,a)') & + ' Entering ma97_factor with matrix_type = ', matrix_type, ' and :' + write (mp,'(a,i12,a,5(/a,i12),5(/a,es12.4))') & + ' matrix_type = ', & + matrix_type, & + ' control parameters (control%) :', & + ' print_level Level of diagnostic printing = ', & + control%print_level, & + ' unit_diagnostics Unit for diagnostics = ', & + control%unit_diagnostics, & + ' unit_error Unit for errors = ', & + control%unit_error, & + ' unit_warning Unit for warnings = ', & + control%unit_warning, & + ' scaling Scaling control = ', & + control%scaling, & + ' small Small pivot size = ', & + control%small, & + ' u Initial relative pivot tolerance = ', & + control%u, & + ' multiplier Multiplier for increasing array sizes = ', & + control%multiplier + end if + + if (lsolve .and. nrhs > 0) then + write (mp,'(a,i12/a,i12)') & + ' ldx = ', & + ldx, & + ' nrhs = ', & + nrhs + end if + end if + + if (.not.allocated(akeep%sptr) .or. akeep%flag < 0) then + ! Analyse cannot have been run + info%flag = MA97_ERROR_CALL_SEQUENCE + call ma97_print_flag(context,nout,info%flag) + fkeep%flag = info%flag + return + end if + + ! Initialize info output + info%flag = MA97_SUCCESS + info%matrix_dup = akeep%matrix_dup + info%matrix_missing_diag = akeep%matrix_missing_diag + info%matrix_outrange = akeep%matrix_outrange + info%maxdepth = akeep%maxdepth + info%num_sup = akeep%num_sup + info%ordering = akeep%ordering + info%maxfront = 0 + info%num_neg = 0 + info%num_delay = 0 + info%num_factor = 0 + info%num_flops = 0 + info%num_sup = akeep%nnodes + info%num_two = 0 + info%stat = 0 + + fkeep%flag = 0 + st = 0 + + n = akeep%n + + if (akeep%nnodes.eq.0) then + info%flag = MA97_SUCCESS + info%matrix_rank = 0 + fkeep%flag = info%flag + return + end if + + select case(matrix_type) + case(HSL_MATRIX_REAL_SYM_PSDEF) + fkeep%pos_def = .true. + case(HSL_MATRIX_REAL_SYM_INDEF) + fkeep%pos_def = .false. + case default + info%flag = MA97_ERROR_MATRIX_TYPE + call MA97_print_flag(context,nout,info%flag) + return + end select + + ! If matrix has been checked, produce a clean version of val in val2 + if (akeep%check) then + nz = akeep%ptr(n+1) - 1 + allocate (val2(nz),stat=st) + if (st .ne. 0) go to 10 + call mc69_set_values(matrix_type, akeep%lmap, akeep%map, val, & + nz, val2) + else + ! analyse run with no checking so must have ptr and row present + if (.not.present(ptr)) info%flag = MA97_ERROR_PTR_ROW + if (.not.present(row)) info%flag = MA97_ERROR_PTR_ROW + if (info%flag < 0) then + call ma97_print_flag(context,nout,info%flag) + fkeep%flag = info%flag + return + end if + nz = akeep%ne + end if + + ! At this point, either ptr, row, val + ! or akeep%ptr, akeep%row, val2 + ! hold the lower triangular part of A + + ! + ! Perform scaling if required + ! + if (control%scaling.gt.0 .or. present(scale)) then + if(allocated(fkeep%scaling)) then + if(size(fkeep%scaling).lt.n) then + deallocate(fkeep%scaling, stat=st) + allocate(fkeep%scaling(n), stat=st) + end if + else + allocate(fkeep%scaling(n), stat=st) + end if + if (st.ne.0) go to 10 + else + deallocate(fkeep%scaling, stat=st) + end if + + if(allocated(akeep%scaling) .and. control%scaling.lt.3) then + info%flag = MA97_WARNING_MATCH_ORD_NO_SCALE + call ma97_print_flag(context,nout1,info%flag) + end if + + select case (control%scaling) + case(:0) ! User supplied or none + if (present(scale)) then + do i = 1, n + fkeep%scaling(i) = scale(akeep%invp(i)) + end do + end if + case(1) ! MC64 + if (akeep%check) then + call mc64_scale(n, akeep%ptr, akeep%row, val2, & + fkeep%scaling, akeep%invp, st, control%action, sing) + else + call mc64_scale(n, ptr, row, val, fkeep%scaling, akeep%invp, & + st, control%action, sing) + end if + if (st .ne. 0) go to 10 + + if (sing) then + info%flag = MA97_ERROR_SINGULAR + call ma97_print_flag(context,nout,info%flag) + fkeep%flag = info%flag + return + end if + if (present(scale)) then + do i = 1, n + scale(akeep%invp(i)) = fkeep%scaling(i) + end do + end if + + case(2) ! MC77 + if (akeep%check) then + call mc77_scale(n, akeep%invp, akeep%ptr, akeep%row, val2, & + fkeep%scaling, info%flag77, st) + else + call mc77_scale(n, akeep%invp, ptr, row, val, fkeep%scaling, & + info%flag77, st) + end if + if (st .ne. 0) go to 10 + if (info%flag77 < 0) then + ! unexpected error + info%flag = MA97_ERROR_MC77 + call ma97_print_flag(context,nout,info%flag) + fkeep%flag = info%flag + return + end if + if (present(scale)) then + do i = 1, n + scale(akeep%invp(i)) = fkeep%scaling(i) + end do + end if + case(3) ! MC64 calculated during ordering + if (.not.allocated(akeep%scaling)) then + ! No scaling saved from analyse phase + info%flag = MA97_ERROR_NO_SAVED_SCALING + call ma97_print_flag(context,nout,info%flag) + fkeep%flag = info%flag + return + end if + do i = 1, n + fkeep%scaling(i) = akeep%scaling(akeep%invp(i)) + end do + case(4:) ! MC30 + if (akeep%check) then + call mc30_scale(n, akeep%invp, akeep%ptr, akeep%row, val2, & + fkeep%scaling, info%flag77, st) + else + call mc30_scale(n, akeep%invp, ptr, row, val, fkeep%scaling, & + info%flag77, st) + end if + if (st .ne. 0) go to 10 + if (info%flag77 < 0) then + ! unexpected error + info%flag = MA97_ERROR_MC77 + call ma97_print_flag(context,nout,info%flag) + fkeep%flag = info%flag + return + end if + if (present(scale)) then + do i = 1, n + scale(akeep%invp(i)) = fkeep%scaling(i) + end do + end if + end select + + ! Peform scaling of rhs if required + if (allocated(fkeep%scaling) .and. nrhs.ge.1) then + do r = 1, nrhs + do i = 1, n + x(akeep%invp(i),r) = x(akeep%invp(i),r) * fkeep%scaling(i) + end do + end do + end if + !if(allocated(fkeep%scaling)) & + ! print *, "minscale, maxscale = ", minval(fkeep%scaling), & + ! maxval(fkeep%scaling) + + ! Setup data storage + if(allocated(fkeep%nodes)) then + if(size(fkeep%nodes).lt.akeep%nnodes+1) then + deallocate(fkeep%nodes,stat=st) + allocate(fkeep%nodes(akeep%nnodes+1), stat=st) + if (st .ne. 0) go to 10 + end if + else + allocate(fkeep%nodes(akeep%nnodes+1), stat=st) + if (st .ne. 0) go to 10 + end if + fkeep%nodes(1:akeep%nnodes+1)%ndelay = 0 + + allocate(stack(akeep%nnodes), stat=st) + if (st .ne. 0) go to 10 + ! Do an inital storage allocation: + ! * control%multiplier * n integers (for nodes(:)%perm) + ! * control%multiplier * (nfactor+2*n) reals (for nodes(:)%lcol) + if(associated(fkeep%alloc)) then + if(fkeep%alloc%imem_size.lt. & + max(n+0_long, int(control%multiplier*n,kind=long))) then + deallocate(fkeep%alloc%imem, stat=st) + fkeep%alloc%imem_size = & + max(n+0_long, int(control%multiplier*n,kind=long)) + allocate(fkeep%alloc%imem(fkeep%alloc%imem_size),stat=st) + if (st .ne. 0) go to 10 + end if + if(fkeep%alloc%rmem_size.lt. max(akeep%nfactor+2*n, & + int(control%multiplier*real(akeep%nfactor,wp)+2*n,kind=long))) then + deallocate(fkeep%alloc%rmem, stat=st) + fkeep%alloc%rmem_size = max(akeep%nfactor+2*n, & + int(control%multiplier*real(akeep%nfactor,wp)+2*n,kind=long)) + allocate(fkeep%alloc%rmem(fkeep%alloc%rmem_size), stat=st) + if (st .ne. 0) go to 10 + end if + next_alloc => fkeep%alloc + do while(associated(next_alloc)) + next_alloc%rhead = 0 + next_alloc%ihead = 0 + next_alloc => next_alloc%next_alloc + end do + nullify(fkeep%alloc%top_real, fkeep%alloc%top_int) + + else + allocate(fkeep%alloc, stat=st) + if (st .ne. 0) go to 10 + call smalloc_setup(fkeep%alloc, & + max(n+0_long, int(control%multiplier*n,kind=long)), & + max(akeep%nfactor+2*n, & + int(control%multiplier*real(akeep%nfactor,wp)+2*n,kind=long)), st) + if (st .ne. 0) go to 10 + end if + + num_threads = 1 +!$ num_threads = omp_get_max_threads() + + ! If we only have a small amount of work then force serial execution + if(akeep%num_flops.lt.control%factor_min) num_threads = 1 + + allocate(stats(num_threads), map(0:n, num_threads), buf(num_threads), & + stat=st) + if (st .ne. 0) go to 10 + map(0, :) = -1 ! initally map unassociated with any node + + !%%if(dolog) open(unit=LOG_UNIT, file="ma97.log") + !%%if(dograph) then + !%% open(unit=GRAPH_UNIT, file="ma97.dot") + !%% write(GRAPH_UNIT, "(a)") "graph tree {" + !%%end if + if(num_threads.gt.1) then + ! Do actual factorization + abort = .false. +!$OMP PARALLEL DEFAULT(NONE) & +!$OMP PRIVATE(this_thread) & +!$OMP SHARED(abort, akeep, buf, control, fkeep, i, info, ldx, map, n, & +!$OMP nrhs, stack, stats, val, val2, x) + + this_thread = 1 +!$ this_thread = omp_get_thread_num()+1 + + allocate(buf(this_thread)%val(akeep%maxmn*128), & + stat=stats(this_thread)%st) + if (stats(this_thread)%st .ne. 0) then + abort = .true. + stats(this_thread)%flag = MA97_ERROR_ALLOCATION + end if +!$OMP SINGLE + if (akeep%check) then + if (allocated(fkeep%scaling)) then + call inner_factor(1, akeep%nnodes+1, fkeep%pos_def, n, & + akeep%nnodes, akeep%child_ptr, akeep%child_list, & + akeep%subtree_work, akeep%invp, akeep%nptr, akeep%nlist, & + val2, fkeep%nodes, akeep%sptr, akeep%sparent, akeep%level, & + akeep%rptr, akeep%rlist, fkeep%alloc, stack, map, buf, & + nrhs, x, ldx, control, stats, abort, scale=fkeep%scaling) + else + call inner_factor(1, akeep%nnodes+1, fkeep%pos_def, n, & + akeep%nnodes, akeep%child_ptr, akeep%child_list, & + akeep%subtree_work, akeep%invp, akeep%nptr, akeep%nlist, & + val2, fkeep%nodes, akeep%sptr, akeep%sparent, akeep%level, & + akeep%rptr, akeep%rlist, fkeep%alloc, stack, map, buf, & + nrhs, x, ldx, control, stats, abort) + end if + else + if (allocated(fkeep%scaling)) then + call inner_factor(1, akeep%nnodes+1, fkeep%pos_def, n, & + akeep%nnodes, akeep%child_ptr, akeep%child_list, & + akeep%subtree_work, akeep%invp, akeep%nptr, akeep%nlist, & + val, fkeep%nodes, akeep%sptr, akeep%sparent, akeep%level, & + akeep%rptr, akeep%rlist, fkeep%alloc, stack, map, buf, & + nrhs, x, ldx, control, stats, abort, scale=fkeep%scaling) + else + call inner_factor(1, akeep%nnodes+1, fkeep%pos_def, n, & + akeep%nnodes, akeep%child_ptr, akeep%child_list, & + akeep%subtree_work, akeep%invp, akeep%nptr, akeep%nlist, & + val, fkeep%nodes, akeep%sptr, akeep%sparent, akeep%level, & + akeep%rptr, akeep%rlist, fkeep%alloc, stack, map, buf, & + nrhs, x, ldx, control, stats, abort) + end if + end if + if (stats(this_thread)%st .ne. 0) then + abort = .true. + stats(this_thread)%flag = MA97_ERROR_ALLOCATION + end if +!$OMP END SINGLE NOWAIT +!$OMP END PARALLEL + + else ! running on a single thread + + allocate(buf(1)%val(akeep%maxmn*128), stat=st) + if(st.ne.0) goto 10 + + if (akeep%check) then + if (allocated(fkeep%scaling)) then + call subtree_factor(1, akeep%nnodes, fkeep%pos_def, & + akeep%child_ptr, akeep%child_list, n, akeep%invp, akeep%nptr, & + akeep%nlist, val2, akeep%nnodes, fkeep%nodes, akeep%sptr, & + akeep%sparent, akeep%level, akeep%rptr, akeep%rlist, & + fkeep%alloc, stack, map, 1, buf, nrhs, x, ldx, control, & + stats, 1, scale=fkeep%scaling) + else + call subtree_factor(1, akeep%nnodes, fkeep%pos_def, & + akeep%child_ptr, akeep%child_list, n, akeep%invp, akeep%nptr, & + akeep%nlist, val2, akeep%nnodes, fkeep%nodes, akeep%sptr, & + akeep%sparent, akeep%level, akeep%rptr, akeep%rlist, & + fkeep%alloc, stack, map, 1, buf, nrhs, x, ldx, control, & + stats, 1) + end if + else + if (allocated(fkeep%scaling)) then + call subtree_factor(1, akeep%nnodes, fkeep%pos_def, & + akeep%child_ptr, akeep%child_list, n, akeep%invp, akeep%nptr, & + akeep%nlist, val, akeep%nnodes, fkeep%nodes, akeep%sptr, & + akeep%sparent, akeep%level, akeep%rptr, akeep%rlist, & + fkeep%alloc, stack, map, 1, buf, nrhs, x, ldx, control, & + stats, 1, scale=fkeep%scaling) + else + call subtree_factor(1, akeep%nnodes, fkeep%pos_def, & + akeep%child_ptr, akeep%child_list, n, akeep%invp, akeep%nptr, & + akeep%nlist, val, akeep%nnodes, fkeep%nodes, akeep%sptr, & + akeep%sparent, akeep%level, akeep%rptr, akeep%rlist, & + fkeep%alloc, stack, map, 1, buf, nrhs, x, ldx, control, & + stats, 1) + end if + end if + + end if + + !%%if(dolog) close(LOG_UNIT) + !%%if(dograph) then + !%% write(GRAPH_UNIT, "(a)") "}" + !%% close(GRAPH_UNIT) + !%%end if + + ! Do reductions + i = minval(stats(:)%flag) + if(i.lt.0) then + info%flag = i + info%stat = maxval(stats(:)%st) + if(info%stat.eq.0) info%stat = minval(stats(:)%st) + st = info%stat + end if + i = max(info%flag, maxval(stats(:)%flag)) + info%maxfront = maxval(stats(:)%maxfront) + info%num_factor = sum(stats(:)%num_factor) + info%num_flops = sum(stats(:)%num_flops) + info%num_delay = sum(stats(:)%num_delay) + info%num_neg = sum(stats(:)%num_neg) + info%num_two = sum(stats(:)%num_two) + info%matrix_rank = akeep%sptr(akeep%nnodes+1)-1 - sum(stats(:)%num_zero) + + if (info%flag < 0) then + call ma97_print_flag(context, nout, info%flag) + fkeep%flag = info%flag + return + end if + + ! Do back subs if lsolve = .true. + if (lsolve) then + if (control%print_level >= 1 .and. control%unit_diagnostics >= 0) & + write (control%unit_diagnostics,'(/a,i8,a)') & + ' Factorisation complete. Solving for ',nrhs,' right-hand sides' + ! We aim to have 4 chunks per thread to hopefully provide sufficient + ! tree-level parallelism. Following call divides tree into these + ! chunks. + call slv_calc_chunk(akeep%nnodes, fkeep%nodes, akeep%sparent, & + akeep%rptr, 4*num_threads, nchunk, chunk_sa, chunk_en, fwd_ptr, & + fwd, st) + if(st.ne.0) goto 10 + local_job = MA97_SOLVE_JOB_DIAG_BWD + if(fkeep%pos_def) local_job = MA97_SOLVE_JOB_DIAG + !call subtree_bwd_slv(akeep%nnodes, 1, local_job, fkeep%pos_def, & + ! akeep%nnodes, fkeep%nodes, akeep%sptr, akeep%rptr, akeep%rlist, & + ! akeep%invp, nrhs, x, ldx, info%stat) +!$OMP PARALLEL DEFAULT(SHARED) IF(info%num_factor.ge.control%solve_min) +!$OMP SINGLE + call bwd_slv_tasks(nchunk+1, chunk_sa, chunk_en, fwd_ptr, fwd, & + local_job, fkeep%pos_def, akeep%nnodes, fkeep%nodes, & + akeep%sptr, akeep%rptr, akeep%rlist, akeep%invp, nrhs, x, ldx, & + control%solve_blas3, st) +!$OMP END SINGLE NOWAIT +!$OMP END PARALLEL + if(st.ne.0) goto 10 + + if (allocated(fkeep%scaling)) then + do r = 1, nrhs + do i = 1, n + x(akeep%invp(i),r) = x(akeep%invp(i),r) * fkeep%scaling(i) + end do + end do + end if + end if + + if(akeep%n.ne.info%matrix_rank) then + ! Rank deficient + ! Note: If we reach this point then must be control%action=.true. + info%flag = MA97_WARNING_FACT_SINGULAR + call ma97_print_flag(context, nout1, info%flag) + end if + + if (control%print_level >= 1 .and. control%unit_diagnostics >= 0) then + if (lsolve) then + write (control%unit_diagnostics,'(/a)') & + ' Completed factorisation and solve with:' + else + write (control%unit_diagnostics,'(/a)') & + ' Completed factorisation with:' + end if + write (control%unit_diagnostics, & + '(a,2(/a,i12),2(/a,es12.4),5(/a,i12))') & + ' information parameters (info%) :', & + ' flag Error flag = ',& + info%flag, & + ' maxfront Maximum frontsize = ',& + info%maxfront, & + ' num_factor Number of entries in L = ',& + real(info%num_factor), & + ' num_flops Number of flops performed = ',& + real(info%num_flops), & + ' num_two Number of 2x2 pivots used = ',& + info%num_two, & + ' num_delay Number of delayed eliminations = ',& + info%num_delay, & + ' rank Computed rank = ',& + info%matrix_rank, & + ' num_neg Computed number of negative eigenvalues = ',& + info%num_neg + + end if + + fkeep%flag = info%flag + fkeep%matrix_rank = info%matrix_rank + fkeep%maxfront = info%maxfront + fkeep%num_delay = info%num_delay + fkeep%num_factor = info%num_factor + fkeep%num_flops = info%num_flops + fkeep%num_neg = info%num_neg + fkeep%num_two = info%num_two + return + !!!!!!!!!!!!!!!!!!!! + + ! + ! Error handling + ! + 10 continue + info%flag = MA97_ERROR_ALLOCATION + info%stat = st + fkeep%flag = info%flag + call ma97_print_flag(context, nout, info%flag, st=info%stat) + +end subroutine ma97_factor_solve_double + +!************************************************************** +! +! Call mc64 to get a scaling, then symmetrize it +! +subroutine mc64_scale(n, ptr, row, val, scaling, invp, st, action, sing) + integer, intent(in) :: n ! order of system + integer, intent(in) :: ptr(n+1) ! column pointers of A + integer, intent(in) :: row(*) ! row indices of A (lower triangle) + real(wp), intent(in) :: val(*) ! entries of A (in same order as in row). + real(wp), dimension(n), intent(out) :: scaling + integer, dimension(n), intent(in) :: invp + integer, intent(out) :: st ! stat parameter + logical, intent(in) :: action ! controls action if matrix found to be + ! singular + logical, intent(out) :: sing ! set to true if matrix found to be singular + + type(mc64_control) :: control64 + type(mc64_info) :: info64 + + integer :: i + integer, dimension(:), allocatable :: perm64 + real(wp), dimension(:), allocatable :: cscale + + allocate(perm64(2*n), cscale(2*n), stat=st) + if (st .ne. 0) return + sing = .false. + control64%checking = 1 ! checking disabled + control64%ldiag = -1 ! printing disabled + call mc64_matching(5, HSL_MATRIX_REAL_SYM_INDEF, n, n, ptr, row, val, & + control64, info64, perm64, scale=cscale) + select case(info64%flag) + case(0) + ! success; do nothing + case(1) + ! structually singular matrix + if(.not.action) then + ! abort + sing = .true. + return + end if + case(2) + ! large scaling factors; do nothing + case(-5) + ! allocation error + st = info64%stat + return + case default + ! some other error; should never happen + ! signal through stat=-99 + st = -99 + return + end select + + do i = 1, n + scaling(i) = exp(cscale(invp(i))) + end do + +end subroutine mc64_scale + +!******************************* +! +! Following Ruiz and Ucar +! "A symmetry preserving algorithm for matrix scaling" +! we do one iteration of the inf norm and then 3 of the one norm. +! +subroutine mc77_scale(n, invp, ptr, row, val, scaling, info, st) + integer, intent(in) :: n ! order of system + integer, dimension(n), intent(in) :: invp + integer, intent(in) :: ptr(n+1) ! column pointers of A + integer, intent(in) :: row(*) ! row indices of A (lower triangle) + real(wp), intent(in) :: val(*) ! entries of A (in same order as in row). + real(wp), dimension(n), intent(out) :: scaling + integer, intent(out) :: info + integer, intent(out) :: st + + integer :: ne, i, j, k + + integer, allocatable, dimension(:) :: iw + real(wp), allocatable, dimension(:) :: dw + real(wp), dimension(:), allocatable :: val2 + + integer :: icntl77(10), info77(10) + real(wp) :: cntl77(10), rinfo77(10) + + ! Take absolute value of matrix to avoid overheads + ne = ptr(n+1)-1 + allocate(val2(ne), iw(2*n), dw(2*n), stat=st) + if (st .ne. 0) then + info = MA97_ERROR_ALLOCATION + return + end if + val2(1:ne) = abs(val(1:ne)) + + ! Set controls + call mc77id(icntl77, cntl77) + icntl77(1) = -1 ! error messages + icntl77(2) = -1 ! warning messages + icntl77(3) = -1 ! diagnostic messages + icntl77(4) = -1 ! disable checking + icntl77(5) = 1 ! absolute value precomputed + icntl77(6) = -1 ! symmetric matrix + + + ! Single iteration of inf norm + icntl77(7) = 1 ! max number of iterations + call mc77ad(0, n, n, ne, ptr, row, val2, iw, size(iw), & + dw, size(dw), icntl77, cntl77, info77, rinfo77) + + info = info77(1) + if (info < 0) return + + do i = 1, n + scaling(i) = 1/dw(invp(i)) + end do + + ! Apply scaling + ! Note: we could modify mc77 to take an input vector of scaling to make + ! this step unnesscary + do i = 1, n + do j = ptr(i), ptr(i+1)-1 + k = row(j) + val2(j) = scaling(i) * val2(j) * scaling(k) + end do + end do + + + ! Up to 3 iterations of one norm + icntl77(7) = 3 ! max number of iterations + call mc77ad(1, n, n, ptr(n+1)-1, ptr, row, val2, iw, size(iw), & + dw, size(dw), icntl77, cntl77, info77, rinfo77) + + info = info77(1) + if (info < 0) return + + do i = 1, n + scaling(i) = scaling(i) / dw(invp(i)) + end do + +end subroutine mc77_scale + + +subroutine mc30_scale(n, invp, ptr, row, val, scaling, info, st) + integer, intent(in) :: n ! order of system + integer, dimension(n), intent(in) :: invp + integer, intent(in) :: ptr(n+1) ! column pointers of A + integer, intent(in) :: row(*) ! row indices of A (lower triangle) + real(wp), intent(in) :: val(*) ! entries of A (in same order as in row). + real(wp), dimension(n), intent(out) :: scaling + integer, intent(out) :: info + integer, intent(out) :: st + + integer :: nnz, i + integer, allocatable, dimension(:) :: col + real(wp), allocatable, dimension(:) :: work, scale30 + + info = 0 + st = 0 + + nnz = ptr(n+1)-1 + allocate(col(nnz), stat=st) + if (st .ne. 0) then + info = MA97_ERROR_ALLOCATION + return + end if + + do i = 1, n + col(ptr(i):ptr(i+1)-1) = i + end do + + allocate(work(4*n), scale30(n), stat=st) + if (st .ne. 0) then + info = MA97_ERROR_ALLOCATION + return + end if + call mc30ad(n, nnz, val, row, col, scale30, work, 6, info) + + ! Exponentiate scaling factors + do i = 1, n + scaling(i) = exp(scale30(invp(i))) + end do + + ! Avoid scaling if factors are too large + if(maxval(scaling)>1d40) scaling(:) = 1 +end subroutine mc30_scale + +!**************************************************************************** +! +! This subroutine performs the parallel decomposition at a tree level. +! +! For a given node it loops over the children and creates a task for each +! of them. Consecutive children are combined if they have less than +! control%min_subtree_work between them. If a child subtree contains more than +! control%min_subtree_work below it then a recursive call is made to this +! subroutine for the node at the top of that child subtree. Otherwise one or +! more children are passed to subtree_factor to do the actual main work. +! Once all children have been factored then subtree_factor is used to process +! this node only. +! +! This subroutine works recursively. The current subtree is defined by the +! nodes sa:en. +! +recursive subroutine inner_factor(sa, en, pos_def, n, nnodes, child_ptr, & + child_list, subtree_work, invp, nptr, nlist, val, & + nodes, sptr, sparent, level, rptr, rlist, alloc2, stack, map, buf, & + nrhs, x, ldx, control, stats, abort, scale, ntask, recursed) + integer, intent(in) :: sa ! Start node of subtree + integer, intent(in) :: en ! End node of subtree + logical, intent(in) :: pos_def ! True if problem is supposedly pos-definite + integer, intent(in) :: n + integer, intent(in) :: nnodes + integer, dimension(*), intent(in) :: child_ptr + integer, dimension(*), intent(in) :: child_list + integer(long), dimension(*), intent(in) :: subtree_work ! Amount of work + ! below a subtree + integer, dimension(*), intent(in) :: invp + integer, dimension(*), intent(in) :: nptr + integer, dimension(2,*), intent(in) :: nlist + real(wp), dimension(*), intent(in) :: val + type(node_type), dimension(*), intent(inout) :: nodes + integer, dimension(*), intent(in) :: sptr + integer, dimension(*), intent(in) :: sparent + integer, dimension(*), intent(in) :: level + integer(long), dimension(*), intent(in) :: rptr + integer, dimension(*), intent(in) :: rlist + type(smalloc_type), target, intent(inout) :: alloc2 ! Contains actual + ! memory allocated to contain L. Everything else points to it. + type(stack_type), dimension(*), target :: stack ! Has an entry for every node + integer, dimension(0:n,*), intent(out) :: map ! One copy for each thread + ! work array containing mapping for node map(0) (which will change) + type(real_ptr_type), dimension(*), intent(inout) :: buf ! Work + ! array, one for each thread + integer, intent(in) :: nrhs + integer, intent(in) :: ldx + real(wp), dimension(ldx, *), intent(inout) :: x + type(ma97_control), intent(in) :: control + type(thread_stats), dimension(*), intent(inout) :: stats ! thread-level + ! info parameters, one for each thread. + logical, intent(inout) :: abort ! Global abort flag. + real(wp), dimension(*), optional, intent(in) :: scale + integer, optional :: ntask ! Target number of tasks below this node + integer, optional :: recursed ! Counts recursion depth to avoid stack + ! overflows + + integer, parameter :: maxrecurse = 500 ! max levels of recursion to avoid + ! stack overflow + + integer :: cnode + integer :: i + + integer :: this_thread + integer :: node + + !%%type(log_type) :: ltask + + integer :: current_start, current_end + integer(long) :: current_work + + integer :: myntask, myrecursed + integer :: num_threads + + !%%character(len=8) :: n1, n2 + + if(abort) return + + num_threads = 1 +!$ num_threads = omp_get_max_threads() + + ! Calculate number of tasks for subprocesses to use. + ! If this is the root then set ntask to be 4 times the total available + ! threads. Otherwise use whatever our parent told us to use. + myntask = 4*num_threads + if(present(ntask)) then + myntask = ntask + elseif(num_threads.eq.1) then + myntask = 1 + end if + + if(present(recursed)) then + myrecursed = recursed + 1 + else + myrecursed = 1 + end if + + this_thread = 1 +!$ this_thread = omp_get_thread_num()+1 + + !print *, "INNER FACTOR", sa, en, "on", this_thread + + node = en + + ! + ! Loop over children. Combine them if together they have less than + ! control%min_subtree_work, otherwise fire off last child as a task and + ! start a new combined task with this child subtree. + ! + + current_start = sa + current_end = sa-1 + current_work = 0 + do i = child_ptr(en), child_ptr(en+1)-1 + cnode = child_list(i) + !print *, " child", cnode + ! Factorize subtree rooted at cnode + if(current_work+subtree_work(cnode).gt.control%min_subtree_work) then + ! Create a new task + if(current_work.gt.0) then + ! As we're going to have more than one task below this one, + ! assign each to generate half as many tasks. + if(current_start.eq.sa) myntask = myntask / 2 + !%%if(dograph) then + !%% call node_name(n1, en) + !%% call node_name(n2, current_end) + !%% write(GRAPH_UNIT, "(4a)") n1, " -- ", n2, ";" + !%%end if +!$OMP TASK DEFAULT(NONE) IF(myntask.gt.1) & +!$OMP FIRSTPRIVATE(current_end, current_start, current_work, myntask, & +!$OMP myrecursed) & +!%%!$OMP PRIVATE(ltask) & +!$OMP PRIVATE(this_thread) & +!$OMP SHARED(abort, alloc2, buf, child_list, child_ptr, control, invp, & +!$OMP ldx, level, map, n, nnodes, nodes, nlist, nptr, nrhs, num_threads,& +!$OMP pos_def, rlist, rptr, scale, sparent, sptr, stack, stats, & +!$OMP subtree_work, x, val) + this_thread = 1 +!$ this_thread = omp_get_thread_num()+1 + if(.not.abort .and. (myrecursed.ge.maxrecurse .or. & + current_work.le.control%min_subtree_work)) then + !%%if(dolog .and. myntask.gt.1) & + !%% call log_start(ltask, "SF", current_end) + call subtree_factor(current_start, current_end, pos_def, & + child_ptr, child_list, n, invp, nptr, nlist, val, nnodes, & + nodes, sptr, sparent, level, rptr, rlist, alloc2, stack, & + map(:,this_thread), num_threads, buf, nrhs, x, ldx, control, & + stats, myntask, scale=scale) + !%%if(dolog .and. myntask.gt.1) call log_stop(ltask, LOG_UNIT) + if(stats(this_thread)%flag.lt.0) abort = .true. + if(stats(this_thread)%st.ne.0) abort = .true. + else + call inner_factor(current_start, current_end, pos_def, n, & + nnodes, child_ptr, child_list, subtree_work, invp, nptr, nlist,& + val, nodes, sptr, sparent, level, rptr, rlist, alloc2, stack, & + map, buf, nrhs, x, ldx, control, stats, abort, scale=scale, & + ntask=myntask, recursed=myrecursed) + end if +!$OMP END TASK + end if + current_start = current_end+1 + current_end = cnode + current_work = subtree_work(cnode) + else + ! Merge with any previous outstanding children into a single task + current_end = cnode + current_work = current_work + subtree_work(cnode) + end if + end do + if(current_end.ge.current_start) then + ! Create a new task + !%%if(dograph) then + !%% call node_name(n1, en) + !%% call node_name(n2, current_end) + !%% write(GRAPH_UNIT, "(4a)") n1, " -- ", n2, ";" + !%%end if +!$OMP TASK DEFAULT(NONE) IF(myntask.gt.1) & +!$OMP FIRSTPRIVATE(current_end, current_start, current_work, myntask, & +!$OMP myrecursed) & +!%%!$OMP PRIVATE(ltask) & +!$OMP PRIVATE(this_thread) & +!$OMP SHARED(abort, alloc2, buf, child_list, child_ptr, control, invp, & +!$OMP ldx, level, map, n, nnodes, nodes, nlist, nptr, nrhs, num_threads,& +!$OMP pos_def, rlist, rptr, scale, sparent, sptr, stack, stats, val, x, & +!$OMP subtree_work) + this_thread = 1 +!$ this_thread = omp_get_thread_num()+1 + if(.not. abort .and. ( myrecursed.ge.maxrecurse .or. & + current_work.le.control%min_subtree_work)) then + !%%if(dolog .and. myntask.gt.1) & + !%% call log_start(ltask, "SF", current_end) + + call subtree_factor(current_start, current_end, pos_def, & + child_ptr, child_list, n, invp, nptr, nlist, val, nnodes, nodes, & + sptr, sparent, level, rptr, rlist, alloc2, stack, & + map(:,this_thread), num_threads, buf, nrhs, x, ldx, control, & + stats, myntask, scale=scale) + !%%if(dolog .and. myntask.gt.1) call log_stop(ltask, LOG_UNIT) + if(stats(this_thread)%flag.lt.0) abort = .true. + if(stats(this_thread)%st.ne.0) abort = .true. + else + call inner_factor(current_start, current_end, pos_def, n, & + nnodes, child_ptr, child_list, subtree_work, invp, nptr, nlist, & + val, nodes, sptr, sparent, level, rptr, rlist, alloc2, stack, map,& + buf, nrhs, x, ldx, control, stats, abort, scale=scale, & + ntask=myntask, recursed=myrecursed) + end if +!$OMP END TASK + end if + + ! Now wait for all child subtrees to complete before we try and assemble them +!$OMP TASKWAIT + if(abort) return + + ! Reset number of threads for this level (if it has been changed) + myntask = 2*num_threads + if(present(ntask)) then + myntask = ntask + elseif(num_threads.eq.1) then + myntask = 1 + end if + +! this_thread = 1 +!!$ this_thread = omp_get_thread_num()+1 + + if(node.le.nnodes) then + !%%if(dolog) call log_start(ltask, "FS", node) + call subtree_factor(node, node, pos_def, child_ptr, child_list, & + n, invp, nptr, nlist, val, nnodes, nodes, sptr, sparent, level, & + rptr, rlist, alloc2, stack, map(:,this_thread), num_threads, buf, & + nrhs, x, ldx, control, stats, & + myntask, scale=scale) + if(stats(this_thread)%flag.lt.0) abort = .true. + if(stats(this_thread)%st.ne.0) abort = .true. + !%%if(dolog) call log_stop(ltask, LOG_UNIT) + end if + return + +end subroutine inner_factor + +!******************************* +! +! This subroutine factorises the subtree(s) that include nodes sa through +! en. Any elements being passed to nodes numbered higher than en are allocated +! using Fortran allocate statemenets rather than stack_alloc. +! +! We maintain the factors seperately from the generated elements to avoid +! copying. Factors are stored in alloc, but pointed to by entries of nodes(:) +! for ease of reference. +! +! Generated elements are stored in a pair of stacks (need two so we can copy +! from child to parent). They are not touched until the factorization has +! been performed on columns that we expect to eliminate. +! +! Entries of A are only added to L just before they are expected to be +! eliminated. +! +subroutine subtree_factor(sa, en, pos_def, child_ptr, child_list, n, & + invp, nptr, nlist, val, nnodes, nodes, sptr, sparent, level, rptr, & + rlist, alloc, stack, map, num_threads, buf, nrhs, x, ldx, & + control, stats, ntask, scale) + integer, intent(in) :: sa ! Start node of subtree + integer, intent(in) :: en ! End node of subtree + logical, intent(in) :: pos_def ! True if problem is supposedly pos-definite + integer, dimension(*), intent(in) :: child_ptr + integer, dimension(*), intent(in) :: child_list + integer, intent(in) :: n + integer, dimension(*), intent(in) :: invp + integer, dimension(*), intent(in) :: nptr + integer, dimension(2,*), intent(in) :: nlist + real(wp), dimension(*), intent(in) :: val + ! Note: gfortran-4.3 bug requires explicit size of nodes array + integer, intent(in) :: nnodes + type(node_type), dimension(nnodes), intent(inout) :: nodes + integer, dimension(*), intent(in) :: sptr + integer, dimension(*), intent(in) :: sparent + integer, dimension(*), intent(in) :: level + integer(long), dimension(*), intent(in) :: rptr + integer, dimension(*), intent(in) :: rlist + type(smalloc_type), target, intent(inout) :: alloc ! Contains actual memory + ! allocations for L. Everything else (within the subtree) is just a + ! pointer to this. + type(stack_type), dimension(*), target :: stack + integer, dimension(0:*), intent(inout) :: map ! map refers to node specified + ! by map(0), which is changed as we iterate. At task scheduling points + ! this may change in non-obvious ways, so we need to track this carefully. + ! explicit size required on buf to avoid gfortran-4.3 bug + integer, intent(in) :: num_threads + type(real_ptr_type), dimension(num_threads), intent(inout) :: buf + integer, intent(in) :: nrhs + integer, intent(in) :: ldx + real(wp), dimension(ldx, *), intent(inout) :: x + type(ma97_control), intent(in) :: control + type(thread_stats), dimension(*), intent(inout) :: stats + real(wp), dimension(*), optional, intent(in) :: scale + integer, intent(in) :: ntask + + integer :: blkm + integer :: blkn + integer :: cblkm + integer :: cblkn + integer :: cn + integer :: cm + integer :: cnd + integer :: cnode + integer :: i + integer(long) :: ii + integer(long) :: ip + integer(long) :: ip1 + integer :: j + integer(long) :: jj + integer :: k + integer(long) :: kk + integer :: m + integer :: nd + integer :: ndelay + integer :: nelim + integer :: parent + integer(long) :: stack_sz + integer :: this_thread + + integer :: node + real(wp), dimension(:), pointer :: lcol + real(wp), dimension(:), pointer :: lstack + integer, dimension(:), pointer :: lperm + real(wp), dimension(:), allocatable :: xlocal + type(stack_type), pointer :: lsptr + type(stack_mem_type), pointer :: stack_mem_odd, stack_mem_even + real(wp) :: dummy(1) + + this_thread = 1 +!$ this_thread = omp_get_thread_num() + 1 + + !print *, "SUBTREE ", sa, en, "on", omp_get_thread_num() + + nullify(stack_mem_odd, stack_mem_even) + + if(nrhs.ge.1) then + allocate(xlocal(nrhs*n), stat=stats(this_thread)%st) + if (stats(this_thread)%st.ne.0) go to 10 + end if + + do node = sa, en + ! Setup basic data about node + ndelay = nodes(node)%ndelay + blkn = sptr(node+1) - sptr(node) + ndelay + blkm = int(rptr(node+1) - rptr(node)) + ndelay + parent = sparent(node) + !print *, "NODE ", node, "(", blkm, "x", blkn, ")" + + stats(this_thread)%maxfront = max(stats(this_thread)%maxfront, blkn) + + ! Allocate memory for L (lcol(1:blkm*blkn)), D (lcol(blkm*blkn+1:) and + ! the local permutation (lperm). + call smalloc(alloc, nodes(node)%lcol, (blkn+0_long)*blkm+2*blkn, & + nodes(node)%rsmptr, nodes(node)%rsmsa, stats(this_thread)%st) + if (stats(this_thread)%st .ne. 0) go to 10 + lcol => nodes(node)%lcol + call smalloc(alloc, nodes(node)%perm, blkn+0_long, & + nodes(node)%ismptr, nodes(node)%ismsa, stats(this_thread)%st) + if (stats(this_thread)%st .ne. 0) go to 10 + lperm => nodes(node)%perm + + ! Zero node + lcol(:) = 0 + + ! Add A + if (present(scale)) then + do i = nptr(node), nptr(node+1)-1 + j = nlist(2,i) + k = (j-1) / (blkm-ndelay) + 1 ! local column + j = mod(j-1, blkm-ndelay) + 1 ! local row + ip = (ndelay+k-1)*blkm + ndelay+j + j = rlist( rptr(node)+j-1 ) + k = rlist( rptr(node)+k-1 ) + lcol(ip) = scale(j) * val(nlist(1,i)) * scale(k) + end do + else + do i = nptr(node), nptr(node+1)-1 + j = nlist(2,i) + kk = (j-1) / (blkm-ndelay) ! column + kk = (ndelay+kk)*blkm + mod(j-1, blkm-ndelay)+1 + ndelay + lcol(kk) = val(nlist(1,i)) + end do + end if + + ! Build map only if we have children + if (child_ptr(node).ne.child_ptr(node+1)) then + ! Note: In parallel we may skip to a different node part way through + ! using map, but not normally the case. Store which node map is + ! associated with to be safe. + map(0) = node + do jj = rptr(node), rptr(node+1)-1 + map(rlist(jj)) = ndelay + int(jj-rptr(node))+1 + end do + end if + + ! Add contribution from children + nd = 0 + do cn = child_ptr(node), child_ptr(node+1)-1 + cnode = child_list(cn) + lsptr => stack(cnode) + !print *, "found child ", cnode + cnd = nodes(cnode)%ndelay + cblkn = sptr(cnode+1)-sptr(cnode) + cblkm = int(rptr(cnode+1)-rptr(cnode)) + cnd + m = blkm - blkn + cm = cblkm - cblkn - cnd + + ! Multifrontal update - pull update off stack + ! Loop over (expected) uneliminated columns of child + if (associated(lsptr%val)) then + ! Note: If all variables at child are delayed there is no update! + do ii = rptr(cnode)+cblkn, rptr(cnode+1)-1 + if (map(rlist(ii)) .gt. blkn) cycle ! lstack gets done later + ! Column goes into lcol; loop over rows + ip = ( map(rlist(ii)) - 1_long ) * blkm + ip1 = ( ii - rptr(cnode)-cblkn ) * (cm+1) + 1 + do jj = ii, rptr(cnode+1)-1 + k = map(rlist(jj)) + lcol(ip+k) = lcol(ip+k) + lsptr%val(ip1) + ip1 = ip1 + 1 + end do + end do + end if + + ! Add delayed columns to map + k = nd + do i = nodes(cnode)%nelim+1, cblkn+cnd + j = nodes(cnode)%perm(i) + k = k + 1 + lperm(k) = j + map( j ) = i-nodes(cnode)%nelim + end do + ip = (nd+0_long)*blkm + ! Copy delayed columns into place + do i = nodes(cnode)%nelim+1, cblkn+cnd + ip1 = (i-1_long)*cblkm + ! Delayed rows + lcol(ip+nd+1:ip+nd+cblkn+cnd-nodes(cnode)%nelim) = & + nodes(cnode)%lcol(ip1+nodes(cnode)%nelim+1:ip1+cblkn+cnd) + ! Expected rows + ip1 = ip1 + cblkn + cnd + 1 + do jj = rptr(cnode)+cblkn, rptr(cnode+1)-1 + k = map( rlist(jj) ) + lcol(ip+k) = nodes(cnode)%lcol(ip1) + ip1 = ip1 + 1 + end do + ip = ip + blkm + end do + nd = nd + cblkn+cnd - nodes(cnode)%nelim + end do + + ! Initialise lperm + j = ndelay + 1 + do i = sptr(node), sptr(node+1)-1 + lperm(j) = i + j = j + 1 + end do + + !print *, "pre lcol = " + !print "(5es12.4)", lcol + !if (blkm.ge.10 .or. blkn.ge.10) & + ! print *, "node sz ", blkm, blkn, "(", ndelay, ")" + + ! Factor the current node + call rfact_block(pos_def, blkm, blkn, blkn, ndelay, & + !lcol(1:blkm*blkn), & + nodes(node)%rsmptr%rmem(nodes(node)%rsmsa), & + blkm, & + !lcol(blkm*blkn+1:), & + nodes(node)%rsmptr%rmem(nodes(node)%rsmsa+(blkm+0_long)*blkn), & + buf, & + !lperm, & + nodes(node)%ismptr%imem(nodes(node)%ismsa), & + nelim, control, stats, & + !lcol, & + nodes(node)%rsmptr%rmem(nodes(node)%rsmsa), & + 0, ntask) + if(stats(this_thread)%flag.lt.0) then + call stack_free_all(stack_mem_odd) + call stack_free_all(stack_mem_even) + return + endif + !print *, "Delayed", blkn-nelim + + do i = blkm, blkm-nelim+1, -1 + stats(this_thread)%num_factor = stats(this_thread)%num_factor + i + stats(this_thread)%num_flops = stats(this_thread)%num_flops + i**2 + end do + + ! Record delays + nodes(node)%nelim = nelim + stats(this_thread)%num_delay = stats(this_thread)%num_delay + blkn - nelim + + !print *, "lperm = ", lperm + !print *, "post = " + !print "(4es12.4)", lcol + + ! Generate element if we are not a root (and there have been eliminations) + if (blkm.ne.blkn) then + stack_sz = (blkm-blkn+0_long)**2 + (blkm-blkn+0_long)*nrhs + if(parent.le.en) then ! Is generated element in this subtree? + lsptr => stack(node) + ! Allocate space to store generated element + ! To allow copying from child to parent but still operate using + ! stacks, have different stacks for odd and even levels of the tree + if (mod(level(node),2).eq.0) then + call stack_alloc(stack_mem_even, lsptr%val, stack_sz, & + stats(this_thread)%st) + if (stats(this_thread)%st .ne. 0) go to 10 + lsptr%stptr => stack_mem_even + lsptr%stsa = stack_mem_even%head - stack_sz + 1 + else + call stack_alloc(stack_mem_odd, lsptr%val, stack_sz, & + stats(this_thread)%st) + if (stats(this_thread)%st .ne. 0) go to 10 + lsptr%stptr => stack_mem_odd + lsptr%stsa = stack_mem_odd%head - stack_sz + 1 + end if + lstack => lsptr%val + else + ! At root, need to pass generated element back to caller, so + ! allocate using Fortran allocate + lsptr => stack(node) + allocate(lsptr%val(stack_sz), stat=stats(this_thread)%st) + if (stats(this_thread)%st .ne. 0) go to 10 + lstack => lsptr%val + nullify(lsptr%stptr) + end if + end if + + ! Calculate generated element + ! G = buf^T lcol + ! Note: This has the side effect of zeroing the element first + m = blkm-blkn ! size of generated element + if (m.gt.0 .and. nelim.gt.0) then + ip = blkn + 1 + if(pos_def) then + if(associated(lsptr%stptr)) then + call mydsyrk(m, m, nelim, -one, & + !lcol(ip:), & ! equivalent to below line + nodes(node)%rsmptr%rmem(nodes(node)%rsmsa+ip-1), & + blkm, zero, & + !lstack, & ! equivalent to below line + lsptr%stptr%mem(lsptr%stsa), & + m, control%min_ldsrk_work) + else + call mydsyrk(m, m, nelim, -one, & + !lcol(ip:), & ! equivalent to below line + nodes(node)%rsmptr%rmem(nodes(node)%rsmsa+ip-1), & + blkm, zero, & + lstack, & + m, control%min_ldsrk_work) + end if + else + if(associated(lsptr%stptr)) then + call ldsrk(m, m, nelim, -one, & + !lcol(ip:), blkm, & ! equivalent to below line + nodes(node)%rsmptr%rmem(nodes(node)%rsmsa+ip-1), blkm, & + !lcol(blkm*blkn+1:), & ! equivalent to below line + nodes(node)%rsmptr%rmem(nodes(node)%rsmsa+& + (blkm+0_long)*blkn), & + zero, & + !lstack, m, & + lsptr%stptr%mem(lsptr%stsa), m, & + buf, control%min_ldsrk_work, stats) + else + call ldsrk(m, m, nelim, -one, & + !lcol(ip:), blkm, & ! equivalent to below line + nodes(node)%rsmptr%rmem(nodes(node)%rsmsa+ip-1), blkm, & + !lcol(blkm*blkn+1:), & ! equivalent to below line + nodes(node)%rsmptr%rmem(nodes(node)%rsmsa+& + (blkm+0_long)*blkn), & + zero, & + lstack, m, & + buf, control%min_ldsrk_work, stats) + end if + if(stats(this_thread)%flag.lt.0) go to 10 + end if + elseif (m.gt.0) then + lstack(:) = 0.0_wp + end if + + if (child_ptr(node).ne.child_ptr(node+1) .and. map(0).ne.node) then + ! Note: In parallel we may skip to a different node part way through + ! using map. This is due to task scheduling points existing for node + ! level parallelism. + ! To get around this in the rare cases where it happens we store the + ! node that the map is assoicated with in map(0) and restore it if + ! it has gone wrong. + ! Note: does not include the delays + map(0) = node + do jj = rptr(node), rptr(node+1)-1 + map(rlist(jj)) = ndelay + int(jj-rptr(node)+1) + end do + end if + + ! Perform forward solve(s) if required + if(nrhs.gt.0) then + ! Pull expected elimination variables from rhs vector + do i = 0, nrhs-1 + do j = 1, blkn + xlocal(j+i*blkn) = x(invp(lperm(j)), i+1) + end do + end do + ! Update map to reflect new permutation from factorization + do i = 1, blkn + map(lperm(i)) = i + end do + ! Pull any updates to elimination variables from children + do cn = child_ptr(node), child_ptr(node+1)-1 + cnode = child_list(cn) + lsptr => stack(cnode) + cnd = nodes(cnode)%ndelay + cblkn = sptr(cnode+1)-sptr(cnode) + cblkm = int(rptr(cnode+1)-rptr(cnode)) + cnd + cm = cblkm - cblkn - cnd + if (associated(lsptr%val)) then + do ii = rptr(cnode)+cblkn, rptr(cnode+1)-1 + if (map(rlist(ii)) .gt. blkn) cycle ! unelim'd vars done later + ip = map(rlist(ii)) + ip1 = cm**2 + ii-(rptr(cnode)+cblkn)+1 + do i = 0, nrhs-1 + xlocal(ip+i*blkn) = & + xlocal(ip+i*blkn) + lsptr%val(ip1+i*cm) + end do + end do + end if + end do + + ! Perform actual solve + if(blkm-blkn.gt.0) then + if(associated(stack(node)%stptr)) then + call slv_fwd_mf(pos_def, nelim, & + !lcol, & + nodes(node)%rsmptr%rmem(nodes(node)%rsmsa), & + blkm, nrhs, xlocal, blkn, & + !lstack((blkm-blkn)**2+1:), & ! equivalent to below line + stack(node)%stptr%mem(stack(node)%stsa+(blkm-blkn)**2), & + blkm-blkn, control%solve_blas3) + else + call slv_fwd_mf(pos_def, nelim, & + !lcol, & + nodes(node)%rsmptr%rmem(nodes(node)%rsmsa), & + blkm, nrhs, xlocal, blkn, & + lstack((blkm-blkn)**2+1:), & ! equivalent to below line + !stack(node)%val((blkm-blkn)**2+1:), & + blkm-blkn, control%solve_blas3) + end if + else + call slv_fwd_mf(pos_def, nelim, lcol, blkm, nrhs, xlocal, blkn, & + dummy, 0, control%solve_blas3) + end if + + ! Copy eliminated (and delayed) variables back to x + do j = 1, blkn + x(invp(lperm(j)), 1:nrhs) = xlocal(j:j+(nrhs-1)*blkn:blkn) + end do + end if + + ! Add any contributions to generated element from children + ! Note: We go backwards here to ensure freed in correct order + do cn = child_ptr(node+1)-1, child_ptr(node), -1 + cnode = child_list(cn) + lsptr => stack(cnode) + !print *, "found child ", cnode + cnd = nodes(cnode)%ndelay + cblkn = sptr(cnode+1)-sptr(cnode) + cblkm = int(rptr(cnode+1)-rptr(cnode)) + cnd + ip1 = 1 + m = blkm - blkn + cm = cblkm - cblkn - cnd + + ! Loop over (expected) uneliminated columns of child + if (associated(lsptr%val)) then + ! Note: If all variables at child are delayed there is no update! + do ii = rptr(cnode)+cblkn, rptr(cnode+1)-1 + if (map(rlist(ii)) .le. blkn) cycle ! Already gone into lcol + ! Column goes into lstack; loop over rows + ip = ( map(rlist(ii)) - blkn - 1 ) * m + ip1 = ( ii - rptr(cnode)-cblkn ) * (cm + 1) + 1 + do jj = ii, rptr(cnode+1)-1 + k = map(rlist(jj)) - blkn + lstack(ip+k) = lstack(ip+k) + lsptr%val(ip1) + ip1 = ip1 + 1 + end do + ! Add rhs contributions to stack too + if(nrhs.gt.0) then + ip = m**2 + map(rlist(ii)) - blkn + ip1 = cm**2 + ii-(rptr(cnode)+cblkn)+1 + do i = 0, nrhs-1 + lstack(ip+i*m) = lstack(ip+i*m) + lsptr%val(ip1+i*cm) + end do + end if + end do + end if + + ! Now remove old pointer + if(associated(lsptr%stptr)) then + stack_sz = size(lsptr%val) ! Explicit var to work around g95 bug + if (mod(level(cnode),2).eq.0) then + call stack_free(stack_mem_even, stack_sz); + else + call stack_free(stack_mem_odd, stack_sz); + end if + else + deallocate(lsptr%val, stat=stats(this_thread)%st) + end if + end do + + ! Store generated element (and/or delays) in list for attention at parent + if (blkm.ne.blkn) then + if(parent.gt.en) then + ! Need an atomic update as multiple tasks may try and update this +!$OMP ATOMIC + nodes(parent)%ndelay = nodes(parent)%ndelay + blkn - nelim + else + ! Can be non-atomic as contained in subtree this task owns + nodes(parent)%ndelay = nodes(parent)%ndelay + blkn - nelim + end if + end if + + end do + !print *, " done subtree ", sa, en, "on", omp_get_thread_num() + + return + + 10 continue + stats(this_thread)%flag = MA97_ERROR_ALLOCATION + return + +end subroutine subtree_factor + +!******************************* +! +! This subroutine performs the forward solve corresponding to the subtree +! sa:en using a multifrontal style. Updates to variables eliminated at +! parent nodes are passed up the tree via a stack. +! +! This code is closely related to the subtree_factor routine above. +! +subroutine subtree_fwd_solve(sa, en, pos_def, child_ptr, child_list, n, & + invp, nnodes, nodes, sptr, sparent, level, rptr, & + rlist, stack, map, nrhs, x, ldx, blas3, st) + integer, intent(in) :: sa + integer, intent(in) :: en + logical, intent(in) :: pos_def + integer, dimension(*), intent(in) :: child_ptr + integer, dimension(*), intent(in) :: child_list + integer, intent(in) :: n + integer, dimension(*), intent(in) :: invp + ! Note: gfortran-4.3 bug requires explicit size of nodes array + integer, intent(in) :: nnodes + type(node_type), dimension(nnodes), intent(in) :: nodes + integer, dimension(*), intent(in) :: sptr + integer, dimension(*), intent(in) :: sparent + integer, dimension(*), intent(in) :: level + integer(long), dimension(*), intent(in) :: rptr + integer, dimension(*), intent(in) :: rlist + type(stack_type), dimension(*), target :: stack + integer, dimension(0:*), intent(inout) :: map + integer, intent(in) :: nrhs + integer, intent(in) :: ldx + real(wp), dimension(ldx, *), intent(inout) :: x + logical, intent(in) :: blas3 + integer, intent(out) :: st + + integer :: blkm + integer :: blkn + integer :: cblkm + integer :: cblkn + integer :: cn + integer :: cm + integer :: cnd + integer :: cnode + integer :: i + integer(long) :: ii + integer(long) :: ip + integer(long) :: ip1 + integer :: j + integer :: k + integer(long) :: jj + integer :: m + integer :: ndelay + integer :: nelim + integer :: parent + integer(long) :: stack_sz + integer :: this_thread + + integer :: node + real(wp), dimension(:), pointer :: lstack + integer, dimension(:), pointer :: lperm + real(wp), dimension(:), allocatable :: xlocal + type(stack_type), pointer :: lsptr + type(stack_mem_type), pointer :: stack_mem_odd, stack_mem_even + real(wp) :: dummy(1) + + st = 0 + this_thread = 1 +!$ this_thread = omp_get_thread_num() + 1 + + !print *, "SUBTREE ", sa, en, "on", omp_get_thread_num() + + nullify(stack_mem_odd, stack_mem_even) + + if(nrhs.ge.1) then + allocate(xlocal(nrhs*n), stat=st) + if (st.ne.0) return + end if + + do node = sa, en + ! Setup basic data about node + ndelay = nodes(node)%ndelay + nelim = nodes(node)%nelim + blkn = sptr(node+1) - sptr(node) + ndelay + blkm = int(rptr(node+1) - rptr(node)) + ndelay + parent = sparent(node) + !print *, "NODE ", node, "(", blkm, "x", blkn, ")" + + lperm => nodes(node)%perm + + ! Build map only if we have children + if (child_ptr(node).ne.child_ptr(node+1)) then + ! Note: In parallel we may skip to a different node part way through + ! using map, but not normally the case. Store which node map is + ! associated with to be safe. + map(0) = node + do jj = rptr(node), rptr(node+1)-1 + map(rlist(jj)) = ndelay + int(jj-rptr(node))+1 + end do + end if + + ! Generate element if we are not a root (and there have been eliminations) + if (blkm.ne.blkn) then + stack_sz = (blkm-blkn+0_long)*nrhs + if(parent.le.en) then ! Is generated element in this subtree? + lsptr => stack(node) + ! Allocate space to store generated element + ! To allow copying from child to parent but still operate using + ! stacks, have different stacks for odd and even levels of the tree + if (mod(level(node),2).eq.0) then + call stack_alloc(stack_mem_even, lsptr%val, stack_sz, st) + if (st .ne. 0) return + lsptr%stptr => stack_mem_even + lsptr%stsa = stack_mem_even%head - stack_sz + 1 + else + call stack_alloc(stack_mem_odd, lsptr%val, stack_sz, st) + if (st .ne. 0) return + lsptr%stptr => stack_mem_odd + lsptr%stsa = stack_mem_odd%head - stack_sz + 1 + end if + lstack => lsptr%val + else + ! At root, need to pass generated element back to caller, so + ! allocate using Fortran allocate + lsptr => stack(node) + allocate(lsptr%val(stack_sz), stat=st) + if (st .ne. 0) return + lstack => lsptr%val + nullify(lsptr%stptr) + end if + end if + + ! + ! Perform forward solve(s) if required + ! + ! Pull expected elimination variables from rhs vector + do k = 1, nrhs + ip = (k-1)*blkn+1 + do j = 1, blkn + xlocal(ip) = x(invp(lperm(j)), k) + ip = ip + 1 + end do + end do + ! Update map with new lperm + do i = 1, blkn + map(lperm(i)) = i + end do + ! Pull any updates to elimination variables from children + do cn = child_ptr(node), child_ptr(node+1)-1 + cnode = child_list(cn) + lsptr => stack(cnode) + cnd = nodes(cnode)%ndelay + cblkn = sptr(cnode+1)-sptr(cnode) + cblkm = int(rptr(cnode+1)-rptr(cnode)) + cnd + cm = cblkm - cblkn - cnd + if (associated(lsptr%val)) then + do k = 1, nrhs + ip1 = (k-1)*cm + do ii = rptr(cnode)+cblkn, rptr(cnode+1)-1 + ip1 = ip1 + 1 + if (map(rlist(ii)) .gt. blkn) cycle ! unelim'd vars done later + ip = map(rlist(ii)) + (k-1)*blkn + xlocal(ip) = xlocal(ip) + lsptr%val(ip1) + end do + end do + end if + end do + + ! Perform actual solve + if(blkm-blkn.gt.0) then + if(associated(stack(node)%stptr)) then + call slv_fwd_mf(pos_def, nelim, & + nodes(node)%rsmptr%rmem(nodes(node)%rsmsa), & + blkm, nrhs, xlocal, blkn, & + !lstack, & + stack(node)%stptr%mem(stack(node)%stsa), & + blkm-blkn, blas3) + else + call slv_fwd_mf(pos_def, nelim, & + nodes(node)%rsmptr%rmem(nodes(node)%rsmsa), & + blkm, nrhs, xlocal, blkn, & + lstack, & + !stack(node)%val, & + blkm-blkn, blas3) + end if + else + call slv_fwd_mf(pos_def, nelim, & + nodes(node)%rsmptr%rmem(nodes(node)%rsmsa), & + blkm, nrhs, xlocal, blkn, & + dummy, 0, blas3) + end if + + ! Copy eliminated (and delayed) variables back to x + do k = 1, nrhs + ip = (k-1)*blkn + do j = 1, blkn + ip = ip + 1 + x(invp(lperm(j)), k) = xlocal(ip) + end do + end do + + ! Add any contributions to generated element from children + ! Note: We go backwards here to ensure freed in correct order + do cn = child_ptr(node+1)-1, child_ptr(node), -1 + cnode = child_list(cn) + lsptr => stack(cnode) + if (associated(lsptr%val)) then + cnd = nodes(cnode)%ndelay + cblkn = sptr(cnode+1)-sptr(cnode) + cblkm = int(rptr(cnode+1)-rptr(cnode)) + cnd + ip1 = 1 + m = blkm - blkn + cm = cblkm - cblkn - cnd + + ! Loop over (expected) uneliminated columns of child + ! Note: If all variables at child are delayed there is no update! + do k = 1, nrhs + ip1 = (k-1)*cm + do ii = rptr(cnode)+cblkn, rptr(cnode+1)-1 + ip1 = ip1 + 1 + if (map(rlist(ii)) .le. blkn) cycle ! Already gone into lcol + ! Add rhs contributions to stack too + if(nrhs.gt.0) then + ip = map(rlist(ii)) - blkn + (k-1)*m + lstack(ip) = lstack(ip) + lsptr%val(ip1) + end if + end do + end do + end if + + ! Now remove old pointer + if(associated(lsptr%stptr)) then + stack_sz = size(lsptr%val) ! explicit var to work around g95 bug + if (mod(level(cnode),2).eq.0) then + call stack_free(stack_mem_even, stack_sz); + else + call stack_free(stack_mem_odd, stack_sz); + end if + else + deallocate(lsptr%val, stat=st) + end if + end do + + end do + !print *, " done subtree ", sa, en, "on", omp_get_thread_num() +end subroutine subtree_fwd_solve + +!************************************************************************* +! +! This subroutine performs a forwards solve in a multifrontal fashion +! (i.e. a contribution is passed up the tree rather than written directly to +! the right-hand-side vector) +! +subroutine slv_fwd_mf(pos_def, nelim, l, ldl, nrhs, x, ldx, xstack, ldxs, blas3) + logical, intent(in) :: pos_def + integer, intent(in) :: nelim + real(wp), dimension(*), intent(in) :: l + integer, intent(in) :: ldl + integer, intent(in) :: nrhs + real(wp), dimension(*), intent(inout) :: x + integer, intent(in) :: ldx + real(wp), dimension(*), intent(out) :: xstack + integer, intent(in) :: ldxs + logical, intent(in) :: blas3 + + ! Have a special case for nrhs=1 (Use BLAS2 rather than BLAS3) + if(nrhs.eq.1 .and. .not.blas3) then + ! Perform solve + if(pos_def) then + call dtrsv('Lower', 'Non-Trans', 'Non-Unit', nelim, l, ldl, x, 1) + else + call dtrsv('Lower', 'Non-Trans', 'Unit', nelim, l, ldl, x, 1) + end if + + ! Update x values corresponding to delays + if(ldx.gt.nelim) then + call dgemv('N', ldx-nelim, nelim, -one, l(nelim+1), ldl, & + x, 1, one, x(nelim+1), 1) + end if + + ! Update uneliminated contributions + if(ldxs.gt.0) then + if(nelim.ne.0) then + call dgemv('N', ldxs, nelim, -one, l(ldx+1), ldl, x, 1, & + zero, xstack, 1) + else + xstack(1:ldxs) = zero + end if + end if + else + ! Perform solve + if(pos_def) then + call dtrsm('Left', 'Lower', 'Non-Trans', 'Non-Unit', nelim, nrhs, & + one, l, ldl, x, ldx) + else + call dtrsm('Left', 'Lower', 'Non-Trans', 'Unit', nelim, nrhs, & + one, l, ldl, x, ldx) + end if + + ! Update x values corresponding to delays + if(ldx.gt.nelim) then + call dgemm('N', 'N', ldx-nelim, nrhs, nelim, -one, l(nelim+1), ldl, & + x, ldx, one, x(nelim+1), ldx) + end if + + ! Update uneliminated contributions + if(ldxs.gt.0) then + call dgemm('N', 'N', ldxs, nrhs, nelim, -one, l(ldx+1), ldl, x, ldx, & + zero, xstack, ldxs) + end if + end if +end subroutine slv_fwd_mf + +!************************************************************************* +! +! Following subroutine handles a symmetric L * L' multiplication by splitting +! it into tasks in order to expose parallelism. +! In the serial case could just use dsyrk (but don't for bit-compatibility). +! Split as: +! ( L_1 ) ( L_1' L_2' ) + ( C_11 ) +! ( L_2 ) ( C_21 C_22 ) +! We avoid ops on C_12 as we are symmetric and don't care. +! Partition is by columns of C. [there may be more rows than columns] +! Recurse for ops on C_11 and C_22. +! Do ops on C_21 ourself. +! +! Note: n <= m +! +subroutine mydsyrk(m, n, k, alpha, l, ldl, beta, c, ldc, & + min_ldsrk_work) + integer, intent(in) :: m ! number of rows in c + integer, intent(in) :: n ! number of cols in c + integer, intent(in) :: k ! number of cols in l and ld + real(wp), intent(in) :: alpha + real(wp), dimension(*), intent(in) :: l + integer, intent(in) :: ldl + real(wp), intent(in) :: beta + real(wp), dimension(*), intent(inout) :: c + integer, intent(in) :: ldc + integer, intent(in) :: min_ldsrk_work + + integer, parameter :: minsz = 64 + + integer(long) :: ip + !%%type(log_type) :: ltask + integer :: blkn, i, blkm, j + + if(n.eq.0) return + + do i = 1, n, minsz + blkn = min(minsz, n-i+1) +!$OMP TASK DEFAULT(NONE) IF(blkn*blkn*k.ge.min_ldsrk_work) & +!$OMP FIRSTPRIVATE(blkn, i) & +!$OMP PRIVATE(ip) & +!%%!$OMP PRIVATE(ltask) & +!$OMP SHARED(alpha, beta, c, k, l, ldc, ldl) + !%%if(dolog) call log_start(ltask, "DL") + ip = (i-1)*ldc + i + call dsyrk('L', 'N', blkn, k, alpha, l(i), ldl, beta, c(ip), ldc) + !%%if(dolog) call log_stop(ltask, LOG_UNIT) +!$OMP END TASK + do j = i+blkn, m, minsz + blkm = min(minsz, m-j+1) +!$OMP TASK DEFAULT(NONE) IF(blkm*blkn*k.ge.min_ldsrk_work) & +!$OMP FIRSTPRIVATE(i, j, blkn, blkm) & +!$OMP PRIVATE(ip) & +!%%!$OMP PRIVATE(ltask) & +!$OMP SHARED(alpha, beta, c, k, l, ldc, ldl) + !%%if(dolog) call log_start(ltask, "DL") + ip = (i-1)*ldc + j + call dgemm('N', 'T', blkm, blkn, k, alpha, l(j), ldl, & + l(i), ldl, beta, c(ip), ldc) + !%%if(dolog) call log_stop(ltask, LOG_UNIT) +!$OMP END TASK + end do + end do +!$OMP TASKWAIT +end subroutine mydsyrk + +!************************************************************************* +! +! Following subroutine handles a symmetric L * D * L' multiplication by +! splitting it into tasks to expose parallelism. +! Split as: +! ( L_1 ) ( L_1'D_1' L_2'D_2' ) + ( C_11 ) +! ( L_2 ) ( C_21 C_22 ) +! We avoid ops on C_12 as we are symmetric and don't care. +! Partition is by columns of C. [there may be more rows than columns] +! Recurse for ops on C_11 and C_22. +! Do ops on C_21 ourself. +! +! Note: n <= m +! +subroutine ldsrk(m, n, k, alpha, l, ldl, d, beta, c, ldc, buf, & + min_ldsrk_work, stats) + integer, intent(in) :: m ! number of rows in c + integer, intent(in) :: n ! number of cols in c + integer, intent(in) :: k ! number of cols in l and ld + real(wp), intent(in) :: alpha + real(wp), dimension(*), target, intent(in) :: l + integer, intent(in) :: ldl + real(wp), dimension(*), intent(in) :: d + real(wp), intent(in) :: beta + real(wp), dimension(*), intent(inout) :: c + integer, intent(in) :: ldc + type(real_ptr_type), dimension(*), intent(inout) :: buf + integer, intent(in) :: min_ldsrk_work + type(thread_stats), dimension(*), intent(inout) :: stats + + integer, parameter :: minsz = 128!64 + + integer(long) :: ip + + integer :: blkn, i, blkm, j + integer :: this_thread + !%%type(log_type) :: ltask + + if(n.eq.0) return + + do i = 1, n, minsz + blkn = min(minsz, n-i+1) + do j = i, m, minsz + blkm = min(minsz, m-j+1) +!$OMP TASK DEFAULT(NONE) IF(blkm*blkn*k.ge.min_ldsrk_work) & +!$OMP FIRSTPRIVATE(i, j, blkn, blkm, alpha, beta, k, ldc, ldl, m, n) & +!$OMP PRIVATE(ip, this_thread) & +!%%!$OMP PRIVATE(ltask) & +!$OMP SHARED(buf, c, d, l, stats) + this_thread = 1 +!$ this_thread = omp_get_thread_num()+1 + if(stats(this_thread)%flag.lt.0) goto 100 + !%%if(dolog) call log_start(ltask, "DL") + ip = (i-1)*ldc + j + ! Note that we may be switched to a thread that hasn't resized its + ! buf array for this node yet. + if(size(buf(this_thread)%val).lt.blkn*k) then + deallocate(buf(this_thread)%val, stat=stats(this_thread)%st) + allocate(buf(this_thread)%val(blkn*k), stat=stats(this_thread)%st) + nullify(buf(this_thread)%chkptr) + if(stats(this_thread)%st.ne.0) then + stats(this_thread)%flag = MA97_ERROR_ALLOCATION + goto 100 + end if + end if + if(.not.associated(buf(this_thread)%chkptr, target=l(i))) then + call calc_ld(blkn, k, ldl, l(i), d, buf(this_thread)%val, & + blkn) + buf(this_thread)%chkptr => l(i) + end if + call dgemm('N', 'T', blkm, blkn, k, alpha, l(j), ldl, & + buf(this_thread)%val, blkn, beta, c(ip), ldc) + !%%if(dolog) call log_stop(ltask, LOG_UNIT) + 100 continue +!$OMP END TASK + end do + end do +!$OMP TASKWAIT +end subroutine ldsrk + +!************************************************* +! +! Subroutine takes a block of L and D^-1, calculates the +! corresponding block of LD +! +subroutine calc_ld(m, n, ldl, l_mat, d_vec, ld_mat, ldld) + integer, intent(in) :: m ! number of rows in block + integer, intent(in) :: n ! number of columns in block + integer, intent(in) :: ldl ! leading dimension of block + real(wp), dimension(n*ldl), intent(in) :: l_mat + real(wp), dimension(2*n), intent(in) :: d_vec + integer, intent(in) :: ldld + real(wp), dimension(n*ldld), intent(out) :: ld_mat + + integer :: row, col + integer :: lptr ! index into l_mat + integer :: ldptr ! index into ld_mat + real(wp) :: d1, d2, d3 + real(wp) :: det + + ! Loop over columns + col = 1 + do while(col.le.n) + lptr = 1 + (col-1)*ldl + ldptr = 1 + (col-1)*ldld + if(d_vec(2*col).eq.zero) then + ! 1x1 pivot + if(d_vec(2*col-1).eq.zero) then + d1 = zero + else + d1 = one/d_vec(2*col-1) + end if + do row = 1, m + ld_mat(ldptr) = l_mat(lptr) * d1 + ldptr = ldptr + 1 + lptr = lptr + 1 + end do + col = col + 1 + else + ! 2x2 pivot + d1 = d_vec(2*col - 1) + d2 = d_vec(2*col) + d3 = d_vec(2*col + 1) + det = d1*d3 - d2*d2 + + d1 = d1 / det + d2 = d2 / det + d3 = d3 / det + ! Loop over rows + do row = 1, m + ld_mat(ldptr ) = d3*l_mat(lptr) - d2*l_mat(lptr+ldl) + ld_mat(ldptr+ldld) = -d2*l_mat(lptr) + d1*l_mat(lptr+ldl) + + ldptr = ldptr + 1 + lptr = lptr + 1 + end do ! rows + col = col + 2 + end if + end do ! cols +end subroutine calc_ld + +!************************************************************************* +! +! Solve phase single x. +! +subroutine ma97_solve_one_double(x, akeep, fkeep, control, info, job) + real(wp), dimension(:), intent(inout) :: x ! On entry, x must + ! be set so that if i has been used to index a variable, + ! x(i) is the corresponding component of the + ! right-hand side.On exit, if i has been used to index a variable, + ! x(i) holds solution for variable i + type(ma97_akeep), intent(in) :: akeep + type(ma97_fkeep), intent(in) :: fkeep + type(ma97_control), intent(in) :: control + type(ma97_info), intent(out) :: info + integer, optional, intent(in) :: job + + integer :: ldx + + ldx = size(x) + call ma97_solve_mult_double(1, x, ldx, akeep, fkeep, control, info, & + job=job) +end subroutine ma97_solve_one_double + +!************************************************************************* + +subroutine ma97_solve_mult_double(nrhs, x, ldx, akeep, fkeep, control, & + info, job) + integer, intent(in) :: nrhs + integer, intent(in) :: ldx + real(wp), dimension(ldx,nrhs), intent(inout) :: x + type(ma97_akeep), intent(in) :: akeep ! On entry, x must + ! be set so that if i has been used to index a variable, + ! x(i,j) is the corresponding component of the + ! right-hand side for the jth system (j = 1,2,..., nrhs). + ! On exit, if i has been used to index a variable, + ! x(i,j) holds solution for variable i to system j + ! For details of keep, control, info : see derived type description + type(ma97_fkeep), intent(in) :: fkeep + type(ma97_control), intent(in) :: control + type(ma97_info), intent(out) :: info + integer, optional, intent(in) :: job ! used to indicate whether + ! partial solution required + ! job = 1 : forward eliminations only (PLX = B) + ! job = 2 : diagonal solve (DX = B) (indefinite case only) + ! job = 3 : backsubs only ((PL)^TX = B) + ! job = 4 : diag and backsubs (D(PL)^TX = B) (indefinite case only) + ! job absent: complete solve performed + + character(50) :: context ! Procedure name (used when printing). + integer :: i, r + integer :: local_job ! local job parameter + integer :: n + integer :: nout + type(stack_type), dimension(:), allocatable, target :: stack + integer, dimension(:,:), allocatable :: map + + integer :: nchunk, num_threads + integer, dimension(:), allocatable :: chunk_sa, chunk_en, fwd_ptr, fwd + + info%flag = MA97_SUCCESS + + ! Perform appropriate printing + if (control%print_level >= 1 .and. control%unit_diagnostics >= 0) then + write (control%unit_diagnostics,'(//a)') & + ' Entering ma97_solve with:' + write (control%unit_diagnostics,'(a,4(/a,i12),(/a,i12))') & + ' control parameters (control%) :', & + ' print_level Level of diagnostic printing = ', & + control%print_level, & + ' unit_diagnostics Unit for diagnostics = ', & + control%unit_diagnostics, & + ' unit_error Unit for errors = ', & + control%unit_error, & + ' unit_warning Unit for warnings = ', & + control%unit_warning, & + ' nrhs = ', & + nrhs + if (nrhs > 1) write (control%unit_diagnostics,'(/a,i12)') & + ' ldx = ', & + ldx + end if + + nout = control%unit_error + if (control%print_level < 0) nout = -1 + context = 'ma97_solve' + + if (akeep%nnodes.eq.0) return + + if (.not. allocated(fkeep%nodes)) then + ! factorize phase has not been performed + info%flag = MA97_ERROR_CALL_SEQUENCE + call ma97_print_flag(context,nout,info%flag) + return + end if + + info%flag = max(MA97_SUCCESS, fkeep%flag) ! Preserve warnings + ! immediate return if already had an error + if (akeep%flag .lt. 0 .or. fkeep%flag .lt. 0) then + info%flag = MA97_ERROR_CALL_SEQUENCE + call ma97_print_flag(context,nout,info%flag) + return + end if + + n = akeep%n + if (ldx .lt. n) then + info%flag = MA97_ERROR_X_SIZE + call ma97_print_flag(context,nout,info%flag) + if (nout .ge. 0) write (nout,'(a,i8,a,i8)') & + ' Increase ldx from ', ldx, ' to at least ', n + return + end if + + if (nrhs .lt. 1) then + info%flag = MA97_ERROR_X_SIZE + call ma97_print_flag(context,nout,info%flag) + if (nout .ge. 0) write (nout,'(a,i8,a,i8)') & + ' nrhs must be at least 1. nrhs = ', nrhs + return + end if + + ! Copy previous phases' info data from akeep and fkeep + info%matrix_dup = akeep%matrix_dup + info%matrix_missing_diag = akeep%matrix_missing_diag + info%matrix_outrange = akeep%matrix_outrange + info%maxdepth = akeep%maxdepth + info%matrix_rank = fkeep%matrix_rank + info%maxfront = fkeep%maxfront + info%num_delay = fkeep%num_delay + info%num_factor = fkeep%num_factor + info%num_flops = fkeep%num_flops + info%num_neg = fkeep%num_neg + info%num_sup = akeep%num_sup + info%num_two = fkeep%num_two + info%ordering = akeep%ordering + + ! Set local_job + local_job = 0 + if (present(job)) then + if (job .lt. 1 .or. job .gt. 4) info%flag = MA97_ERROR_JOB_OOR + if (fkeep%pos_def .and. job == 2) info%flag = MA97_ERROR_JOB_OOR + if (fkeep%pos_def .and. job == 4) info%flag = MA97_ERROR_JOB_OOR + if (info%flag == MA97_ERROR_JOB_OOR) then + call ma97_print_flag(context,nout,info%flag) + return + end if + local_job = job + end if + + if (allocated(fkeep%scaling)) then + if (local_job == MA97_SOLVE_JOB_ALL .or. & + local_job == MA97_SOLVE_JOB_FWD) then + do r = 1, nrhs + !x(1:n,r) = x(1:n,r) * fkeep%scaling(1:n) + do i = 1, n + x(akeep%invp(i),r) = x(akeep%invp(i),r) * fkeep%scaling(i) + end do + end do + end if + end if + + ! We aim to have 4 chunks per thread to hopefully provide sufficient + ! tree-level parallelism. + num_threads = 1 +!$ num_threads = omp_get_max_threads() + call slv_calc_chunk(akeep%nnodes, fkeep%nodes, akeep%sparent, akeep%rptr, & + 4*num_threads, nchunk, chunk_sa, chunk_en, fwd_ptr, fwd, info%stat) + if(info%stat.ne.0) goto 100 + + if(control%solve_mf .and. ( local_job.eq.MA97_SOLVE_JOB_FWD .or. & + local_job.eq.MA97_SOLVE_JOB_ALL) ) then + ! use multifrontal forwards substitution (if doing supernodal then + ! this gets done in inner_solve) + allocate(map(0:akeep%n, num_threads), stack(akeep%nnodes), & + stat=info%stat) + if(info%stat.ne.0) goto 100 + !call subtree_fwd_solve(1, akeep%nnodes, fkeep%pos_def, & + ! akeep%child_ptr, akeep%child_list, akeep%n, akeep%invp, & + ! akeep%nnodes, fkeep%nodes, akeep%sptr, akeep%sparent, & + ! akeep%level, akeep%rptr, akeep%rlist, stack, map(:,1), nrhs, x, & + ! ldx, info%stat) +!$OMP PARALLEL DEFAULT(SHARED) IF(fkeep%num_factor.ge.control%solve_min) +!$OMP SINGLE + call fwd_slv_tasks(nchunk+1, chunk_sa, chunk_en, fwd_ptr, fwd, & + fkeep%pos_def, akeep%child_ptr, akeep%child_list, akeep%n, & + akeep%invp, akeep%nnodes, fkeep%nodes, akeep%sptr, akeep%sparent, & + akeep%level, akeep%rptr, akeep%rlist, stack, map, nrhs, x, ldx, & + control%solve_blas3, info%stat) +!$OMP END SINGLE NOWAIT +!$OMP END PARALLEL + if(info%stat.ne.0) goto 100 + ! Fudge local_job if required to perform backwards solve + if(local_job.eq.MA97_SOLVE_JOB_ALL) then + if(fkeep%pos_def) then + local_job = MA97_SOLVE_JOB_BWD + else + local_job = MA97_SOLVE_JOB_DIAG_BWD + end if + elseif(local_job.eq.MA97_SOLVE_JOB_FWD) then + local_job = -1 ! done + end if + !print *, "post fwd = ", x(1:3,1) + end if + + ! Perform supernodal forward solve or diagonal solve (both in serial) + call inner_solve(fkeep%pos_def, local_job, akeep%nnodes, & + fkeep%nodes, akeep%sptr, akeep%rptr, akeep%rlist, akeep%invp, nrhs, & + x, ldx, control%solve_blas3, info%stat) + if (info%stat .ne. 0) goto 100 + + if(local_job.eq.MA97_SOLVE_JOB_DIAG_BWD .or. & + local_job.eq.MA97_SOLVE_JOB_BWD .or. & + local_job.eq.MA97_SOLVE_JOB_ALL) then + !call subtree_bwd_slv(akeep%nnodes, 1, local_job, fkeep%pos_def, & + ! akeep%nnodes, fkeep%nodes, akeep%sptr, akeep%rptr, akeep%rlist, & + ! akeep%invp, nrhs, x, ldx, info%stat) +!$OMP PARALLEL DEFAULT(SHARED) IF(fkeep%num_factor.ge.control%solve_min) +!$OMP SINGLE + call bwd_slv_tasks(nchunk+1, chunk_sa, chunk_en, fwd_ptr, fwd, & + local_job, fkeep%pos_def, akeep%nnodes, fkeep%nodes, & + akeep%sptr, akeep%rptr, akeep%rlist, akeep%invp, nrhs, x, ldx, & + control%solve_blas3, info%stat) +!$OMP END SINGLE NOWAIT +!$OMP END PARALLEL + end if + if (info%stat .ne. 0) goto 100 + + if (allocated(fkeep%scaling)) then + if (local_job == MA97_SOLVE_JOB_ALL .or. & + local_job == MA97_SOLVE_JOB_BWD .or. & + local_job == MA97_SOLVE_JOB_DIAG_BWD) then + do r = 1, nrhs + !x(1:n,r) = x(1:n,r) * fkeep%scaling(1:n) + do i = 1, n + x(akeep%invp(i),r) = x(akeep%invp(i),r) * fkeep%scaling(i) + end do + end do + end if + end if + !print *, "soln = ", x(1:3,1) + + return + + 100 continue + info%flag = MA97_ERROR_ALLOCATION + call ma97_print_flag(context,nout,info%flag,st=info%stat) + return +end subroutine ma97_solve_mult_double + +!************************************************************************* +! +! Alternative solve phase (A indefinite and singular). +! +subroutine ma97_solve_fredholm_double(nrhs, flag_out, x, ldx, & + akeep, fkeep, control, info) + integer, intent(in) :: nrhs + logical, intent(out) :: flag_out(nrhs) + integer, intent(in) :: ldx + real(wp), dimension(ldx,2*nrhs), intent(inout) :: x ! On entry, x must + ! be set so that if i has been used to index a variable, + ! x(i,j) is the corresponding component of the + ! right-hand side for the jth system (j = 1,2,..., nrhs). + ! On exit, x(1:n,1:nrhs) holds same solution as is computed by ma97_solve + ! and, if flag_out*j)=.false., x(1:n,nrhs+j) + ! holds the Fredholm alternative solution. + ! For details of keep, control, info : see derived type description + type(ma97_akeep), intent(in) :: akeep + type(ma97_fkeep), intent(in) :: fkeep + type(ma97_control), intent(in) :: control + type(ma97_info), intent(out) :: info + + character(50) :: context ! Procedure name (used when printing). + integer :: i, r + integer :: n + integer :: nout + integer :: num_false ! number of inconsistent rhs + integer :: num_rhs_bwd ! number of rhs for back sub (equal to nrhs if no + ! no inconsistent rhs and is equal to 2*nrhs otherwise) + type(stack_type), dimension(:), allocatable, target :: stack + integer, dimension(:,:), allocatable :: map + real(wp), dimension(:), allocatable :: tol + real(wp), external :: dnrm2 + + integer :: nchunk, num_threads + integer, dimension(:), allocatable :: chunk_sa, chunk_en, fwd_ptr, fwd + + info%flag = MA97_SUCCESS + ! initialise flag_out to true (consistent systems) + flag_out(:) = .true. + + ! Perform appropriate printing + if (control%print_level >= 1 .and. control%unit_diagnostics >= 0) then + write (control%unit_diagnostics,'(//a)') & + ' Entering ma97_solve_fredholm with:' + write (control%unit_diagnostics,'(a,4(/a,i12),(/a,i12))') & + ' control parameters (control%) :', & + ' print_level Level of diagnostic printing = ', & + control%print_level, & + ' unit_diagnostics Unit for diagnostics = ', & + control%unit_diagnostics, & + ' unit_error Unit for errors = ', & + control%unit_error, & + ' unit_warning Unit for warnings = ', & + control%unit_warning, & + ' nrhs = ', & + nrhs + if (nrhs > 1) write (control%unit_diagnostics,'(/a,i12)') & + ' ldx = ', & + ldx + end if + + nout = control%unit_error + if (control%print_level < 0) nout = -1 + context = 'ma97_solve_fredholm' + + if (akeep%nnodes.eq.0) return + + if (.not. allocated(fkeep%nodes)) then + ! factorize phase has not been performed + info%flag = MA97_ERROR_CALL_SEQUENCE + call ma97_print_flag(context,nout,info%flag) + return + end if + + info%flag = max(MA97_SUCCESS, fkeep%flag) ! Preserve warnings + ! immediate return if already had an error + if (akeep%flag.lt.0 .or. fkeep%flag.lt.0) then + info%flag = MA97_ERROR_CALL_SEQUENCE + call ma97_print_flag(context,nout,info%flag) + return + end if + + if (nrhs .lt. 1) then + info%flag = MA97_ERROR_X_SIZE + call ma97_print_flag(context,nout,info%flag) + if (nout .ge. 0) write (nout,'(a,i8,a,i8)') & + ' nrhs must be at least 1. nrhs = ', nrhs + return + end if + + ! If matrix is non-singular, call ma97_solve + if (fkeep%flag.ne.MA97_WARNING_FACT_SINGULAR) then + call ma97_solve_mult_double(nrhs, x, ldx, akeep, fkeep, control, info) + return + end if + + n = akeep%n + if (ldx .lt. n) then + info%flag = MA97_ERROR_X_SIZE + call ma97_print_flag(context,nout,info%flag) + if (nout .ge. 0) write (nout,'(a,i8,a,i8)') & + ' Increase ldx from ', ldx, ' to at least ', n + return + end if + + ! Copy previous phases' info data from akeep and fkeep + info%matrix_dup = akeep%matrix_dup + info%matrix_missing_diag = akeep%matrix_missing_diag + info%matrix_outrange = akeep%matrix_outrange + info%maxdepth = akeep%maxdepth + info%matrix_rank = fkeep%matrix_rank + info%maxfront = fkeep%maxfront + info%num_delay = fkeep%num_delay + info%num_factor = fkeep%num_factor + info%num_flops = fkeep%num_flops + info%num_neg = fkeep%num_neg + info%num_sup = akeep%num_sup + info%num_two = fkeep%num_two + info%ordering = akeep%ordering + + if (allocated(fkeep%scaling)) then + do r = 1, nrhs + do i = 1, n + x(akeep%invp(i),r) = x(akeep%invp(i),r) * fkeep%scaling(i) + end do + end do + end if + + allocate(tol(nrhs),stat=info%stat) + if(info%stat.ne.0) goto 100 + ! set tolerances for rhs's + do i = 1,nrhs + tol(i) = control%consist_tol * n * dnrm2(n,x(:,i),1) + end do + + ! We aim to have 4 chunks per thread to hopefully provide sufficient + ! tree-level parallelism. + num_threads = 1 +!$ num_threads = omp_get_max_threads() + call slv_calc_chunk(akeep%nnodes, fkeep%nodes, akeep%sparent, akeep%rptr, & + 4*num_threads, nchunk, chunk_sa, chunk_en, fwd_ptr, fwd, info%stat) + if(info%stat.ne.0) goto 100 + + if(control%solve_mf) then + ! use multifrontal forwards substitution (if doing supernodal then + ! this gets done in inner_solve) + allocate(map(0:akeep%n, num_threads), stack(akeep%nnodes), & + stat=info%stat) + if(info%stat.ne.0) goto 100 + + !call subtree_fwd_solve(1, akeep%nnodes, fkeep%pos_def, & + ! akeep%child_ptr, akeep%child_list, akeep%n, akeep%invp, & + ! akeep%nnodes, fkeep%nodes, akeep%sptr, akeep%sparent, & + ! akeep%level, akeep%rptr, akeep%rlist, stack, map(:,1), nrhs, x, & + ! ldx, info%stat) + +!$OMP PARALLEL DEFAULT(SHARED) IF(fkeep%num_factor.ge.control%solve_min) +!$OMP SINGLE + call fwd_slv_tasks(nchunk+1, chunk_sa, chunk_en, fwd_ptr, fwd, & + fkeep%pos_def, akeep%child_ptr, akeep%child_list, akeep%n, & + akeep%invp, akeep%nnodes, fkeep%nodes, akeep%sptr, akeep%sparent, & + akeep%level, akeep%rptr, akeep%rlist, stack, map, nrhs, x, ldx, & + control%solve_blas3, info%stat) +!$OMP END SINGLE NOWAIT +!$OMP END PARALLEL + if(info%stat.ne.0) goto 100 + + else + ! Perform supernodal forward solve (in serial) + call inner_solve1(fkeep%pos_def, akeep%nnodes, & + fkeep%nodes, akeep%sptr, akeep%rptr, akeep%rlist, akeep%invp, nrhs, & + x, ldx, control%solve_blas3, info%stat) + if (info%stat .ne. 0) goto 100 + end if + + ! Perform diagonal check for consistency and solve (in serial) + + call diag_solve(n, akeep%nnodes, fkeep%nodes, akeep%sptr, & + akeep%rptr, akeep%invp, nrhs, x, ldx, tol, flag_out, num_false) + + ! Back solve is same in supernodal and multifrontal approach + ! We do ONLY the back solve (no diagonal solve) + + !call subtree_bwd_slv(akeep%nnodes, 1, local_job, fkeep%pos_def, & + ! akeep%nnodes, fkeep%nodes, akeep%sptr, akeep%rptr, akeep%rlist, & + ! akeep%invp, nrhs, x, ldx, info%stat) + +!$OMP PARALLEL DEFAULT(SHARED) IF(fkeep%num_factor.ge.control%solve_min) +!$OMP SINGLE + if (num_false.eq.0) then + ! no inconsistent right-hand sides so just do standard back sub. + num_rhs_bwd = nrhs + else + ! back sub for both the consistent and inconsistent right-hand sides + num_rhs_bwd = 2*nrhs + end if + call bwd_slv_tasks(nchunk+1, chunk_sa, chunk_en, fwd_ptr, fwd, & + MA97_SOLVE_JOB_BWD, fkeep%pos_def, akeep%nnodes, & + fkeep%nodes, akeep%sptr, akeep%rptr, akeep%rlist, akeep%invp, & + num_rhs_bwd, x, ldx, control%solve_blas3, info%stat) +!$OMP END SINGLE NOWAIT +!$OMP END PARALLEL + if (info%stat .ne. 0) goto 100 + + if (allocated(fkeep%scaling)) then + do r = 1, num_rhs_bwd + do i = 1, n + x(akeep%invp(i),r) = x(akeep%invp(i),r) * fkeep%scaling(i) + end do + end do + end if + + return + + 100 continue + info%flag = MA97_ERROR_ALLOCATION + call ma97_print_flag(context,nout,info%flag,st=info%stat) + + return + +end subroutine ma97_solve_fredholm_double + +!************************************************************************* +! +! Provide for multiplying a vector by L or L^T. +! y = Lx or y = L^Tx +! +subroutine ma97_lmultiply_one_double(trans, x1, y1, akeep, fkeep, & + control, info) + logical, intent(in) :: trans + real(wp), dimension(:), intent(in) :: x1 + real(wp), dimension(:), intent(out) :: y1 + ! For details of keep, control, info : see derived type description + type(ma97_akeep), intent(in) :: akeep + type(ma97_fkeep), intent(in) :: fkeep + type(ma97_control), intent(in) :: control + type(ma97_info), intent(out) :: info + + integer :: ldx, ldy ! needed for g95 with -i8 to avoid compiler bug + + ldx = size(x1) + ldy = size(y1) + call ma97_lmultiply_mult_double(trans,1,x1,ldx,y1,ldy, & + akeep,fkeep,control,info) +end subroutine ma97_lmultiply_one_double + +!************************************************************************* +! +! Provide for multiplying a vector by L or L^T. +! y = Lx or y = L^Tx +! +subroutine ma97_lmultiply_mult_double(trans, k, x, ldx, y, ldy, & + akeep, fkeep, control, info) + logical, intent(in) :: trans + integer, intent(in) :: k + integer, intent(in) :: ldx + real(wp), dimension(ldx,k), intent(in) :: x + integer, intent(in) :: ldy + real(wp), dimension(ldy,k), intent(out) :: y + ! For details of keep, control, info : see derived type description + type(ma97_akeep), intent(in) :: akeep + type(ma97_fkeep), intent(in) :: fkeep + type(ma97_control), intent(in) :: control + type(ma97_info), intent(out) :: info + + integer :: nout + character(50) :: context ! Procedure name (used when printing). + integer :: blkm, blkn, nd, nelim, node, i, r + integer, dimension(:), allocatable :: map + real(wp), dimension(:), allocatable :: xlocal + real(wp), dimension(:,:), allocatable :: x2 + + info%flag = MA97_SUCCESS + info%stat = 0 + + ! Perform appropriate printing + if (control%print_level >= 1 .and. control%unit_diagnostics >= 0) then + write (control%unit_diagnostics,'(//a)') & + ' Entering ma97_lmultiply with:' + write (control%unit_diagnostics,'(a,5(/a,i12),(/a,l1))') & + ' control parameters (control%) :', & + ' print_level Level of diagnostic printing = ', & + control%print_level, & + ' unit_diagnostics Unit for diagnostics = ', & + control%unit_diagnostics, & + ' unit_error Unit for errors = ', & + control%unit_error, & + ' unit_warning Unit for warnings = ', & + control%unit_warning, & + ' k = ', & + k, & + ' trans = ', & + trans + if(k > 1) write (control%unit_diagnostics,'(2(/a,i12))') & + ' ldx = ', & + ldx, & + ' ldy = ', & + ldy + end if + + nout = control%unit_error + if (control%print_level < 0) nout = -1 + context = 'ma97_lmultiply' + + if (akeep%nnodes.eq.0) return + + if (.not. allocated(fkeep%nodes)) then + ! factorize phase has not been performed + info%flag = MA97_ERROR_CALL_SEQUENCE + call ma97_print_flag(context,nout,info%flag) + return + end if + + info%flag = max(MA97_SUCCESS, fkeep%flag) ! Preserve warnings + ! immediate return if already had an error + if (akeep%flag .lt. 0 .or. fkeep%flag .lt. 0) then + info%flag = MA97_ERROR_CALL_SEQUENCE + call ma97_print_flag(context,nout,info%flag) + return + end if + + if (ldx.lt.akeep%n .or. ldy.lt.akeep%n) then + info%flag = MA97_ERROR_X_SIZE + call ma97_print_flag(context,nout,info%flag) + return + end if + + if (k .lt. 1) then + info%flag = MA97_ERROR_X_SIZE + call ma97_print_flag(context,nout,info%flag) + if (nout .ge. 0) write (nout,'(a,i8,a,i8)') & + ' k must be at least 1. k = ', k + return + end if + + allocate(xlocal((akeep%sptr(akeep%nnodes+1)-1)*k), & + map(akeep%sptr(akeep%nnodes+1)-1), stat=info%stat) + if(info%stat.ne.0) goto 100 + + if(trans .and. allocated(fkeep%scaling)) then + allocate(x2(akeep%n,k), stat=info%stat) + if(info%stat.ne.0) goto 100 + do r = 1, k + do i = 1, akeep%n + x2(akeep%invp(i),r) = x(akeep%invp(i),r) / fkeep%scaling(i) + end do + end do + end if + + y(1:akeep%n,:) = 0 + do node = 1, akeep%nnodes + !print *, "node ", node + nelim = fkeep%nodes(node)%nelim + if (nelim.eq.0) cycle + nd = fkeep%nodes(node)%ndelay + blkn = akeep%sptr(node+1) - akeep%sptr(node) + nd + blkm = int(akeep%rptr(node+1) - akeep%rptr(node)) + nd + !print *, "nelim, nd = ", nelim, nd + !print *, "blkm, blkn = ", blkm, blkn + + if(allocated(x2)) then + call node_mult(fkeep%pos_def, trans, k, x2, akeep%n, & + y, ldy, akeep%rlist(akeep%rptr(node)), & + akeep%invp, blkm, blkn, nelim, nd, & + fkeep%nodes(node)%rsmptr%rmem(fkeep%nodes(node)%rsmsa), & ! lcol + fkeep%nodes(node)%ismptr%imem(fkeep%nodes(node)%ismsa), & ! perm + xlocal, map) + else + call node_mult(fkeep%pos_def, trans, k, x, ldx, y, ldy, & + akeep%rlist(akeep%rptr(node)), & + akeep%invp, blkm, blkn, nelim, nd, & + fkeep%nodes(node)%rsmptr%rmem(fkeep%nodes(node)%rsmsa), & ! lcol + fkeep%nodes(node)%ismptr%imem(fkeep%nodes(node)%ismsa), & ! perm + xlocal, map) + end if + end do + + if(.not.trans .and. allocated(fkeep%scaling)) then + do r = 1, k + do i = 1, akeep%n + y(akeep%invp(i),r) = y(akeep%invp(i),r) / fkeep%scaling(i) + end do + end do + end if + + return + + 100 continue + info%flag = MA97_ERROR_ALLOCATION + call ma97_print_flag(context,nout,info%flag,st=info%stat) + return + +end subroutine ma97_lmultiply_mult_double + +!************************************************************************* + +! Sparse forward solve (sparse rhs). +! Note: we pass in lflag and require x to be set to 0.0 on entry +! so we do not have loops of length n within the code (we need to +! avoid loops of length n here since they will dominate total cost) + +subroutine ma97_sparse_fwd_solve_double(nbi, bindex, b, order, lflag, & + nxi, xindex, x, akeep, fkeep, control, info) + integer, intent(in) :: nbi ! number of nonzero entries in right-hand side + integer, intent(in) :: bindex(:) ! On entry, first nbi entries must + ! hold indices of nonzero entries in the right-hand side. + ! Only first nbi entries are accessed. + real(wp), intent(in) :: b(:) ! If bindex(i)=k, b(k) must hold the k-th + ! nonzero component of right-hand side; other entries of b not accessed. + integer, intent(in) :: order(:) ! Must be passed unchanged form ma97_analyse. + logical, intent(inout), dimension(:) :: lflag ! + ! Must be set by user on entry to false. used to flag which entries of x + ! are non zero. + integer, intent(out) :: nxi ! number of nonzero entries in the solution. + integer, intent(out) :: xindex(:) ! First nxi entries holds indices of + ! nonzero entries in solution. + real(wp), intent(inout) :: x(:) ! User must set to zero on entry. + ! If xindex(i)=k, on exit x(k) holds the k-th + ! nonzero component of solution; all other entries of x are zero. + type(ma97_akeep), intent(in) :: akeep + type(ma97_fkeep), intent(in) :: fkeep + type(ma97_control), intent(in) :: control + type(ma97_info), intent(out) :: info + + character(50) :: context ! Procedure name (used when printing). + integer :: i, j + integer :: n + integer :: nout + + info%flag = MA97_SUCCESS + + ! Perform appropriate printing + if (control%print_level >= 1 .and. control%unit_diagnostics >= 0) then + write (control%unit_diagnostics,'(//a)') & + ' Entering ma97_solve with:' + write (control%unit_diagnostics,'(a,4(/a,i12),(/a,i12))') & + ' control parameters (control%) :', & + ' print_level Level of diagnostic printing = ', & + control%print_level, & + ' unit_diagnostics Unit for diagnostics = ', & + control%unit_diagnostics, & + ' unit_error Unit for errors = ', & + control%unit_error, & + ' unit_warning Unit for warnings = ', & + control%unit_warning, & + ' nbi = ', & + nbi + end if + + nout = control%unit_error + if (control%print_level < 0) nout = -1 + context = 'ma97_sparse_fwd_solve' + + if (akeep%nnodes.eq.0) return + + if (.not. allocated(fkeep%nodes)) then + ! factorize phase has not been performed + info%flag = MA97_ERROR_CALL_SEQUENCE + call ma97_print_flag(context,nout,info%flag) + return + end if + + info%flag = max(MA97_SUCCESS, fkeep%flag) ! Preserve warnings + ! immediate return if already had an error + if (akeep%flag .lt. 0 .or. fkeep%flag .lt. 0) then + info%flag = MA97_ERROR_CALL_SEQUENCE + call ma97_print_flag(context,nout,info%flag) + return + end if + + n = akeep%n + ! immediate return if nbi <= 0 .or. nbi > n + if (nbi <= 0 .or. nbi > n) then + info%flag = MA97_ERROR_NBI_OOR + call ma97_print_flag(context,nout,info%flag) + return + end if + + ! Copy previous phases' info data from akeep and fkeep + info%matrix_dup = akeep%matrix_dup + info%matrix_missing_diag = akeep%matrix_missing_diag + info%matrix_outrange = akeep%matrix_outrange + info%maxdepth = akeep%maxdepth + info%matrix_rank = fkeep%matrix_rank + info%maxfront = fkeep%maxfront + info%num_delay = fkeep%num_delay + info%num_factor = fkeep%num_factor + info%num_flops = fkeep%num_flops + info%num_neg = fkeep%num_neg + info%num_sup = akeep%num_sup + info%num_two = fkeep%num_two + info%ordering = akeep%ordering + + + if (allocated(fkeep%scaling)) then + do i = 1, nbi + j = bindex(i) + lflag(j) = .true. + x(j) = b(j) * fkeep%scaling(order(j)) + end do + else + do i = 1, nbi + j = bindex(i) + lflag(j) = .true. + x(j) = b(j) + end do + end if + + ! Perform supernodal forward solve (in serial) + nxi = nbi + xindex(1:nxi) = bindex(1:nbi) + call inner_solve_sparse(fkeep%pos_def, akeep%nnodes, & + fkeep%nodes, akeep%sptr, akeep%rptr, akeep%rlist, akeep%invp, & + x, n, nxi, xindex, control%solve_blas3, info%stat, lflag) + + if (info%stat .ne. 0) then + info%flag = MA97_ERROR_ALLOCATION + call ma97_print_flag(context,nout,info%flag,st=info%stat) + end if + +end subroutine ma97_sparse_fwd_solve_double + +!************************************************************************* +! +! This subroutine provides a simple parallel wrapper around subtree_bwd_slv +! to spawn parallel tasks for different chunks of the assembly tree in a +! dependency-safe order. +! +recursive subroutine bwd_slv_tasks(chunk, chunk_sa, chunk_en, fwd_ptr, fwd, & + job, pos_def, nnodes, nodes, sptr, rptr, rlist, invp, nrhs, x, & + ldx, blas3, st) + integer, intent(in) :: chunk + integer, dimension(*), intent(in) :: chunk_sa + integer, dimension(*), intent(in) :: chunk_en + integer, dimension(*), intent(in) :: fwd_ptr + integer, dimension(*), intent(in) :: fwd + integer, intent(in) :: job ! controls whether we are doing forward + ! eliminations, back substitutions etc. + logical, intent(in) :: pos_def + integer, intent(in) :: nnodes + type(node_type), dimension(*), intent(in) :: nodes + integer, dimension(*), intent(in) :: sptr + integer(long), dimension(*), intent(in) :: rptr + integer, dimension(*), intent(in) :: rlist + integer, dimension(*), intent(in) :: invp + integer, intent(in) :: nrhs + integer, intent(in) :: ldx + real(wp), dimension(ldx,*), intent(inout) :: x + logical, intent(in) :: blas3 + integer, intent(out) :: st ! stat parameter + + integer :: i + integer :: myst + + if(nrhs.eq.1) then + call subtree_bwd_slv_one(chunk_en(chunk), chunk_sa(chunk), job, & + pos_def, nnodes, nodes, sptr, rptr, rlist, invp, x, ldx, blas3, st) + else + call subtree_bwd_slv_mult(chunk_en(chunk), chunk_sa(chunk), job, & + pos_def, nnodes, nodes, sptr, rptr, rlist, invp, nrhs, x, ldx, st) + endif + if(st.ne.0) return + + do i = fwd_ptr(chunk), fwd_ptr(chunk+1)-1 +!$OMP TASK DEFAULT(NONE) & +!$OMP FIRSTPRIVATE(i) & +!$OMP PRIVATE(myst) & +!$OMP SHARED(chunk_sa, chunk_en, fwd_ptr, fwd, job, pos_def, & +!$OMP nnodes, nodes, sptr, rptr, rlist, invp, nrhs, x, ldx, blas3, st) + if(st.eq.0) then + call bwd_slv_tasks(fwd(i), chunk_sa, chunk_en, fwd_ptr, fwd, job, & + pos_def, nnodes, nodes, sptr, rptr, rlist, invp, nrhs, x, & + ldx, blas3, myst) + if(myst.ne.0) st = myst + end if +!$OMP END TASK + end do + +!$OMP TASKWAIT + if(st.ne.0) return + +end subroutine bwd_slv_tasks + + +!************************************************************************* +! +! This subroutine provides a simple parallel wrapper around subtree_fwd_slv +! to spawn parallel tasks for different chunks of the assembly tree in a +! dependency-safe order. +! +recursive subroutine fwd_slv_tasks(chunk, chunk_sa, chunk_en, fwd_ptr, fwd, & + pos_def, child_ptr, child_list, n, invp, nnodes, nodes, sptr, sparent, & + level, rptr, rlist, stack, map, nrhs, x, ldx, blas3, st) + integer, intent(in) :: chunk + integer, dimension(*), intent(in) :: chunk_sa + integer, dimension(*), intent(in) :: chunk_en + integer, dimension(*), intent(in) :: fwd_ptr + integer, dimension(*), intent(in) :: fwd + logical, intent(in) :: pos_def + integer, dimension(*), intent(in) :: child_ptr + integer, dimension(*), intent(in) :: child_list + integer, intent(in) :: n + integer, dimension(*), intent(in) :: invp + ! Note: gfortran-4.3 bug requires explicit size of nodes array + integer, intent(in) :: nnodes + type(node_type), dimension(*), intent(in) :: nodes + integer, dimension(*), intent(in) :: sptr + integer, dimension(*), intent(in) :: sparent + integer, dimension(*), intent(in) :: level + integer(long), dimension(*), intent(in) :: rptr + integer, dimension(*), intent(in) :: rlist + type(stack_type), dimension(*), target :: stack + integer, dimension(0:n,*), intent(out) :: map + integer, intent(in) :: nrhs + integer, intent(in) :: ldx + real(wp), dimension(ldx, *), intent(inout) :: x + logical, intent(in) :: blas3 + integer, intent(out) :: st + + integer :: i + integer :: this_thread + integer :: myst + + st = 0 + do i = fwd_ptr(chunk), fwd_ptr(chunk+1)-1 +!$OMP TASK DEFAULT(NONE) & +!$OMP FIRSTPRIVATE(i) & +!$OMP PRIVATE(myst) & +!$OMP SHARED(chunk_sa, chunk_en, fwd_ptr, fwd, pos_def, child_ptr, & +!$OMP child_list, n, invp, nnodes, nodes, sptr, sparent, level, rptr, & +!$OMP rlist, stack, map, nrhs, x, ldx, blas3, st) + if(st.eq.0) then + call fwd_slv_tasks(fwd(i), chunk_sa, chunk_en, fwd_ptr, fwd, & + pos_def, child_ptr, child_list, n, invp, nnodes, nodes, sptr, & + sparent, level, rptr, rlist, stack, map, nrhs, x, ldx, blas3, myst) + if(myst.ne.0) st = myst + end if +!$OMP END TASK + end do + +!$OMP TASKWAIT + if(st.ne.0) return + + this_thread = 1 +!$ this_thread = omp_get_thread_num() + 1 + + call subtree_fwd_solve(chunk_sa(chunk), chunk_en(chunk), pos_def, & + child_ptr, child_list, n, invp, nnodes, nodes, sptr, sparent, & + level, rptr, rlist, stack, map(:,this_thread), nrhs, x, ldx, blas3, st) + if(st.ne.0) return + +end subroutine fwd_slv_tasks + +!************************************************************************* +! +! This subroutine chops the assembly tree into chunks ready for parallel +! execution. The dependencies are encoded in fwd_ptr and fwd. +! +subroutine slv_calc_chunk(nnodes, nodes, sparent, rptr, ntask, nchunk, & + chunk_sa, chunk_en, fwd_ptr, fwd, st) + integer, intent(in) :: nnodes + type(node_type), dimension(*), intent(in) :: nodes + integer, dimension(*), intent(in) :: sparent + integer(long), dimension(*), intent(in) :: rptr + integer, intent(in) :: ntask ! Target number of chunks. + integer, intent(out) :: nchunk ! Total number of chunks identified. + integer, dimension(:), allocatable :: chunk_sa ! chunk_sa(i) is the first + ! node in chunk i. + integer, dimension(:), allocatable :: chunk_en ! chunk_en(i) is the last + ! node in chunk i. + integer, dimension(:), allocatable :: fwd_ptr ! children of chunk i are in + ! fwd(fwd_ptr(i):fwd_ptr(i+1)-1) + integer, dimension(:), allocatable :: fwd + integer, intent(out) :: st + + integer, parameter :: min_entry = 10000 ! minimum number of entries in a + ! chunk - if less than this merge into next consecutive chunk + + integer :: i, j + integer :: nelim, nd, blkm + integer :: parent + integer :: node, chunk + integer :: sa, en + integer(long) :: num_factor, targ + integer, dimension(:), allocatable :: first_child + integer(long), dimension(:), allocatable :: ne + integer, dimension(:), allocatable :: map + integer, dimension(:), allocatable :: slv_parent + + ! Build first_child array and calculate global num_factor + allocate(first_child(nnodes+1), ne(0:nnodes), map(nnodes+1), stat=st) + if(st.ne.0) return + first_child(:) = huge(first_child) + num_factor = 0 + do node = 1, nnodes + nelim = nodes(node)%nelim + nd = nodes(node)%ndelay + blkm = int(rptr(node+1) - rptr(node)) + nd + parent = sparent(node) + + num_factor = num_factor + nelim*blkm + if(first_child(node).gt.node) first_child(node) = node + first_child(parent) = min(first_child(node), first_child(parent)) + end do + !print *, "Overall num_factor = ", num_factor + + ! Calculate target number of entries per chunk + targ = num_factor / ntask + !print *, "target = ", targ + + ! Iterate over nodes until current cumulative total exceeds target + chunk = 1 + sa = 1 + num_factor = 0 + ne(0) = 0 + do node = 1, nnodes + nelim = nodes(node)%nelim + nd = nodes(node)%ndelay + blkm = int(rptr(node+1) - rptr(node)) + nd + parent = sparent(node) + + num_factor = num_factor + nelim*blkm + ne(node) = num_factor + if(num_factor.ge.targ) then + ! We have exceeded target number of entries. Split into disjoint + ! subtrees using first children. Obey minimum size requirements, + ! merging consecutive disjoint subtrees if necessary. + i = node + en = node + do while(i.ge.sa) + j = max(first_child(i), sa) + if(ne(en) - ne(j-1) .ge. min_entry) then + !print *, "Chunk ", j, en, "(dep ", sparent(en), ")", & + ! ne(en) - ne(j-1) + map(j:en) = chunk + chunk = chunk + 1 + en = j-1 + end if + i = j - 1 + end do + if(en.ge.sa) then + !print *, "Chunk ", sa, en, "(dep ", sparent(en), ")", & + ! ne(en) - ne(j-1) + map(sa:en) = chunk + chunk = chunk + 1 + end if + ne(node) = 0 + sa = node+1 + num_factor = 0 + end if + end do + if(sa.le.nnodes) then + !print *, "Chunk ", sa, nnodes, " = ", num_factor + map(sa:nnodes) = chunk + chunk = chunk + 1 + end if + map(nnodes+1) = chunk + + deallocate(ne, stat=st) + deallocate(first_child, stat=st) + + ! We now need to manipulate data into an easy to use form in fwd_ptr, fwd + nchunk = chunk-1 + allocate(chunk_sa(nchunk+1), chunk_en(chunk+1), fwd_ptr(nchunk+3), & + fwd(nchunk+1), slv_parent(nchunk), stat=st) + if(st.ne.0) return + chunk_sa(nchunk+1) = -1; chunk_en(nchunk+1) = -2 + + ! Set up chunk_sa, chunk_en and slv_parent (parent for chunk tree) + ! Also count number of children using fwd_ptr at offset +2 + fwd_ptr(1:nchunk+3) = 0 + chunk = map(1) + sa = 1 + do node = 1, nnodes+1 + if(map(node).eq.chunk) cycle + ! Otherwise new chunk, dispatch old one + !print *, "Chunk ", chunk, ":", sa, node-1, " depends on chunk ", & + ! map(sparent(node-1)) + chunk_sa(chunk) = sa + chunk_en(chunk) = node-1 + slv_parent(chunk) = map(sparent(node-1)) + fwd_ptr(slv_parent(chunk)+2) = fwd_ptr(slv_parent(chunk)+2) + 1 + sa = node + chunk = map(node) + end do + + fwd_ptr(1:2) = 1 + do chunk = 1, nchunk+1 + fwd_ptr(chunk+2) = fwd_ptr(chunk+2) + fwd_ptr(chunk+1) + end do + + do chunk = 1, nchunk + i = slv_parent(chunk) + fwd(fwd_ptr(i+1)) = chunk + fwd_ptr(i+1) = fwd_ptr(i+1) + 1 + end do + + !do chunk = 1, nchunk + ! print *, "chunk ", chunk, ":", chunk_sa(chunk), chunk_en(chunk), & + ! "slv_parent ", slv_parent(chunk) + ! print *, " fwd dep: ", fwd(fwd_ptr(chunk):fwd_ptr(chunk+1)-1) + !end do + !print *, "TOP LEVEL", fwd(fwd_ptr(nchunk+1):fwd_ptr(nchunk+2)-1) + +end subroutine slv_calc_chunk + +!************************************************************************* +! +! This subroutine performs a backwards solve on the chunk of nodes specified +! by sa:en. +! +! Note: this subtree_bwd_slv_one() and subtree_bwd_slv_mult() have been split +! as a workaround for a bug in ifort with the combination of -openmp -ip +! +subroutine subtree_bwd_slv_one(en, sa, job, pos_def, nnodes, nodes, sptr,& + rptr, rlist, invp, x, ldx, blas3, st) + integer, intent(in) :: en + integer, intent(in) :: sa + logical, intent(in) :: pos_def + integer, intent(in) :: job ! controls whether we are doing forward + ! eliminations, back substitutions etc. + integer, intent(in) :: nnodes + type(node_type), dimension(*), intent(in) :: nodes + integer, dimension(nnodes+1), intent(in) :: sptr + integer(long), dimension(nnodes+1), intent(in) :: rptr + integer, dimension(rptr(nnodes+1)-1), intent(in) :: rlist + integer, dimension(*), intent(in) :: invp + integer, intent(in) :: ldx + real(wp), dimension(ldx,*), intent(inout) :: x + logical, intent(in) :: blas3 + integer, intent(out) :: st ! stat parameter + + integer :: blkm + integer :: blkn + integer :: nd + integer :: nelim + integer :: node + real(wp), dimension(:), allocatable :: xlocal + integer, dimension(:), allocatable :: map + + st = 0 + allocate(xlocal(sptr(nnodes+1)-1), map(sptr(nnodes+1)-1), stat=st) + +! print *, "SUBTREE ", en, sa, " on ", omp_get_thread_num() + + ! Backwards solve DL^Tx = z or L^Tx = z + do node = en, sa, -1 + !print *, "node = ", node + nelim = nodes(node)%nelim + if (nelim.eq.0) cycle + nd = nodes(node)%ndelay + blkn = sptr(node+1) - sptr(node) + nd + blkm = int(rptr(node+1) - rptr(node)) + nd + + call slv_bwd_one(pos_def, job, rlist(rptr(node)), invp, x, & + blkm, blkn, nelim, nd, & + nodes(node)%rsmptr%rmem(nodes(node)%rsmsa), & ! node%lcol + nodes(node)%rsmptr%rmem(nodes(node)%rsmsa+blkm*blkn), & ! node%d + nodes(node)%ismptr%imem(nodes(node)%ismsa), & ! node%perm + xlocal, map, blas3) + end do + +end subroutine subtree_bwd_slv_one +subroutine subtree_bwd_slv_mult(en, sa, job, pos_def, nnodes, nodes, sptr, & + rptr, rlist, invp, nrhs, x, ldx, st) + integer, intent(in) :: en + integer, intent(in) :: sa + logical, intent(in) :: pos_def + integer, intent(in) :: job ! controls whether we are doing forward + ! eliminations, back substitutions etc. + integer, intent(in) :: nnodes + type(node_type), dimension(*), intent(in) :: nodes + integer, dimension(nnodes+1), intent(in) :: sptr + integer(long), dimension(nnodes+1), intent(in) :: rptr + integer, dimension(rptr(nnodes+1)-1), intent(in) :: rlist + integer, dimension(*), intent(in) :: invp + integer, intent(in) :: nrhs + integer, intent(in) :: ldx + real(wp), dimension(ldx,nrhs), intent(inout) :: x + integer, intent(out) :: st ! stat parameter + + integer :: blkm + integer :: blkn + integer :: nd + integer :: nelim + integer :: node + real(wp), dimension(:), allocatable :: xlocal + integer, dimension(:), allocatable :: map + + st = 0 + allocate(xlocal(nrhs*(sptr(nnodes+1)-1)), map(sptr(nnodes+1)-1), stat=st) + +! print *, "SUBTREE ", en, sa, " on ", omp_get_thread_num() + + ! Backwards solve DL^Tx = z or L^Tx = z + do node = en, sa, -1 + !print *, "node = ", node + nelim = nodes(node)%nelim + if (nelim.eq.0) cycle + nd = nodes(node)%ndelay + blkn = sptr(node+1) - sptr(node) + nd + blkm = int(rptr(node+1) - rptr(node)) + nd + + call slv_bwd_mult(pos_def, job, rlist(rptr(node)), invp, & + nrhs, x, ldx, blkm, blkn, nelim, nd, & + nodes(node)%rsmptr%rmem(nodes(node)%rsmsa), & ! node%lcol + nodes(node)%rsmptr%rmem(nodes(node)%rsmsa+blkm*blkn), & ! node%d + nodes(node)%ismptr%imem(nodes(node)%ismsa), & ! node%perm + xlocal, map) + end do + +end subroutine subtree_bwd_slv_mult + +!************************************************************************* +! +! Provides serial versions of Forward (s/n) and diagonal solves. +! +subroutine inner_solve(pos_def, job, nnodes, nodes, sptr, rptr, rlist, & + invp, nrhs, x, ldx, blas3, st) + logical, intent(in) :: pos_def + integer, intent(in) :: job ! controls whether we are doing forward + ! eliminations, back substitutions etc. + integer, intent(in) :: nnodes + type(node_type), dimension(*), intent(in) :: nodes + integer, dimension(nnodes+1), intent(in) :: sptr + integer(long), dimension(nnodes+1), intent(in) :: rptr + integer, dimension(rptr(nnodes+1)-1), intent(in) :: rlist + integer, dimension(*), intent(in) :: invp + integer, intent(in) :: nrhs + integer, intent(in) :: ldx + real(wp), dimension(ldx,nrhs), intent(inout) :: x + logical, intent(in) :: blas3 + integer, intent(out) :: st ! stat parameter + + integer :: blkm + integer :: blkn + integer :: nd + integer :: nelim + integer :: node + real(wp), dimension(:), allocatable :: xlocal + integer, dimension(:), allocatable :: map + + st = 0 + allocate(xlocal(nrhs*(sptr(nnodes+1)-1)), map(sptr(nnodes+1)-1), stat=st) + if(st.ne.0) return + + if (job == MA97_SOLVE_JOB_ALL .or. job == MA97_SOLVE_JOB_FWD) then + ! Forwards solve Ly = b + !print *, "pre = ", x + do node = 1, nnodes + nelim = nodes(node)%nelim + if (nelim.eq.0) cycle + nd = nodes(node)%ndelay + blkn = sptr(node+1) - sptr(node) + nd + blkm = int(rptr(node+1) - rptr(node)) + nd + + if(nrhs.eq.1) then + call slv_fwd_one(pos_def, rlist(rptr(node)), invp, x, & + blkm, blkn, nelim, nd, & + nodes(node)%rsmptr%rmem(nodes(node)%rsmsa), & ! nodes(node)%lcol + nodes(node)%ismptr%imem(nodes(node)%ismsa), & ! nodes(node)%perm + xlocal, map, blas3) + else + call slv_fwd_mult(pos_def, rlist(rptr(node)), invp, nrhs, x, ldx, & + blkm, blkn, nelim, nd, & + nodes(node)%rsmptr%rmem(nodes(node)%rsmsa), & ! nodes(node)%lcol + nodes(node)%ismptr%imem(nodes(node)%ismsa), & ! nodes(node)%perm + xlocal, map) + end if + end do + !print *, "post fwd = ", x(1:3,1) + end if + +! if (job.eq.MA97_SOLVE_JOB_ALL .or. & +! job.eq.MA97_SOLVE_JOB_BWD .or. & +! job.eq.MA97_SOLVE_JOB_DIAG_BWD) then +! +! ! Backwards solve DL^Tx = z or L^Tx = z +! do node = nnodes, 1, -1 +! !print *, "node = ", node +! nelim = nodes(node)%nelim +! if (nelim.eq.0) cycle +! nd = nodes(node)%ndelay +! blkn = sptr(node+1) - sptr(node) + nd +! blkm = int(rptr(node+1) - rptr(node)) + nd +! +! if(nrhs.eq.1) then +! call slv_bwd_one(pos_def, job, rlist(rptr(node)), invp, x, & +! blkm, blkn, nelim, nd, & +! nodes(node)%rsmptr%rmem(nodes(node)%rsmsa), & ! node%lcol +! nodes(node)%rsmptr%rmem(nodes(node)%rsmsa+blkm*blkn), & ! node%d +! nodes(node)%ismptr%imem(nodes(node)%ismsa), & ! node%perm +! xlocal, map, blas3) +! else +! call slv_bwd_mult(pos_def, job, rlist(rptr(node)), invp, & +! nrhs, x, ldx, blkm, blkn, nelim, nd, & +! nodes(node)%rsmptr%rmem(nodes(node)%rsmsa), & ! node%lcol +! nodes(node)%rsmptr%rmem(nodes(node)%rsmsa+blkm*blkn), & ! node%d +! nodes(node)%ismptr%imem(nodes(node)%ismsa), & ! node%perm +! xlocal, map) +! end if +! end do +! end if + + if (job.eq.MA97_SOLVE_JOB_DIAG) then + ! Diagonal solve Dx = z + do node = nnodes, 1, -1 + nelim = nodes(node)%nelim + if (nelim.eq.0) cycle + nd = nodes(node)%ndelay + blkn = sptr(node+1) - sptr(node) + nd + blkm = int(rptr(node+1) - rptr(node)) + nd + + if(nrhs.eq.1) then + call slv_diag_one(invp, x, nelim, & + nodes(node)%rsmptr%rmem(nodes(node)%rsmsa+blkm*blkn), & ! node%d + nodes(node)%ismptr%imem(nodes(node)%ismsa)) ! node%perm + else + call slv_diag_mult(invp, nrhs, x, ldx, nelim, & + nodes(node)%rsmptr%rmem(nodes(node)%rsmsa+blkm*blkn), & ! node%d + nodes(node)%ismptr%imem(nodes(node)%ismsa)) ! node%perm + end if + end do + !print *, "post diag = ", x(1:3,1) + end if + + !print *, "soln = ", x + +end subroutine inner_solve + +!************************************************************************* +! +! Provides serial version of Forward (supernodal). +! +subroutine inner_solve1(pos_def, nnodes, nodes, sptr, rptr, rlist, & + invp, nrhs, x, ldx, blas3, st) + logical, intent(in) :: pos_def + integer, intent(in) :: nnodes + type(node_type), dimension(*), intent(in) :: nodes + integer, dimension(nnodes+1), intent(in) :: sptr + integer(long), dimension(nnodes+1), intent(in) :: rptr + integer, dimension(rptr(nnodes+1)-1), intent(in) :: rlist + integer, dimension(*), intent(in) :: invp + integer, intent(in) :: nrhs + integer, intent(in) :: ldx + real(wp), dimension(ldx,nrhs), intent(inout) :: x + logical, intent(in) :: blas3 + integer, intent(out) :: st ! stat parameter + + integer :: blkm + integer :: blkn + integer :: nd + integer :: nelim + integer :: node + real(wp), dimension(:), allocatable :: xlocal + integer, dimension(:), allocatable :: map + + st = 0 + allocate(xlocal(nrhs*(sptr(nnodes+1)-1)), map(sptr(nnodes+1)-1), stat=st) + if(st.ne.0) return + + ! Forwards solve Ly = b + do node = 1, nnodes + nelim = nodes(node)%nelim + if (nelim.eq.0) cycle + nd = nodes(node)%ndelay + blkn = sptr(node+1) - sptr(node) + nd + blkm = int(rptr(node+1) - rptr(node)) + nd + + if(nrhs.eq.1) then + call slv_fwd_one(pos_def, rlist(rptr(node)), invp, x, & + blkm, blkn, nelim, nd, & + nodes(node)%rsmptr%rmem(nodes(node)%rsmsa), & ! nodes(node)%lcol + nodes(node)%ismptr%imem(nodes(node)%ismsa), & ! nodes(node)%perm + xlocal, map, blas3) + else + call slv_fwd_mult(pos_def, rlist(rptr(node)), invp, nrhs, x, ldx, & + blkm, blkn, nelim, nd, & + nodes(node)%rsmptr%rmem(nodes(node)%rsmsa), & ! nodes(node)%lcol + nodes(node)%ismptr%imem(nodes(node)%ismsa), & ! nodes(node)%perm + xlocal, map) + end if + end do +end subroutine inner_solve1 + +!************************************************************************* +! +! Sparse forward (s/n) solve. +! +subroutine inner_solve_sparse(pos_def, nnodes, nodes, sptr, rptr, rlist, & + invp, x, n, nxi, xindex, blas3, st, lflag) + logical, intent(in) :: pos_def + integer, intent(in) :: nnodes + type(node_type), dimension(*), intent(in) :: nodes + integer, dimension(nnodes+1), intent(in) :: sptr + integer(long), dimension(nnodes+1), intent(in) :: rptr + integer, dimension(rptr(nnodes+1)-1), intent(in) :: rlist + integer, dimension(*), intent(in) :: invp + integer, intent(in) :: n + real(wp), dimension(n), intent(inout) :: x + integer, intent(inout) :: nxi + integer, dimension(n), intent(out) :: xindex + logical, intent(in) :: blas3 + integer, intent(out) :: st ! stat parameter + logical, dimension(n), intent(inout) :: lflag ! flags non zeros entries of x + + integer :: blkm + integer :: blkn + integer :: nd + integer :: nelim + integer :: node + real(wp), dimension(:), allocatable :: xlocal + integer, dimension(:), allocatable :: map + + st = 0 + allocate(xlocal(sptr(nnodes+1)-1), map(sptr(nnodes+1)-1), stat=st) + if(st.ne.0) return + + ! loop over nodos of tree. + do node = 1, nnodes + nelim = nodes(node)%nelim + if (nelim.eq.0) cycle + nd = nodes(node)%ndelay + blkn = sptr(node+1) - sptr(node) + nd + blkm = int(rptr(node+1) - rptr(node)) + nd + call slv_fwd_sparse(pos_def, rlist(rptr(node)), invp, x, & + blkm, blkn, nelim, nd, & + nodes(node)%rsmptr%rmem(nodes(node)%rsmsa), & ! nodes(node)%lcol + nodes(node)%ismptr%imem(nodes(node)%ismsa), & ! nodes(node)%perm + xlocal, map, blas3, lflag, nxi, xindex) + end do +end subroutine inner_solve_sparse + +!************************************************************************* +! +! Provides serial version of diagonal solve. +! +subroutine diag_solve(n, nnodes, nodes, sptr, rptr, invp, nrhs, x, ldx, & + tol, flag_out, num_false) + integer, intent(in) :: nnodes + integer, intent(in) :: n + type(node_type), dimension(*), intent(in) :: nodes + integer, dimension(nnodes+1), intent(in) :: sptr + integer(long), dimension(nnodes+1), intent(in) :: rptr + integer, dimension(*), intent(in) :: invp + integer, intent(in) :: nrhs + integer, intent(in) :: ldx + real(wp), dimension(ldx,2*nrhs), intent(inout) :: x + real(wp), intent (in) :: tol(nrhs) ! tolerance used to determine whether + ! or not system is consistent + logical, intent (inout) :: flag_out(nrhs) + integer, intent (out) :: num_false ! number of inconsistent rhs + + integer :: blkm + integer :: blkn + integer :: i,j,r + integer :: nd + integer :: nelim + integer :: node + real(wp) :: temp + + num_false = 0 + do node = 1,nnodes + nelim = nodes(node)%nelim + if (nelim.eq.0) cycle + nd = nodes(node)%ndelay + blkn = sptr(node+1) - sptr(node) + nd + blkm = int(rptr(node+1) - rptr(node)) + nd + + call check_diag(n, invp, nrhs, x, ldx, nelim, & + nodes(node)%rsmptr%rmem(nodes(node)%rsmsa+blkm*blkn), & ! node%d + nodes(node)%ismptr%imem(nodes(node)%ismsa), & ! node%perm + flag_out,num_false,tol) + + end do + + if (num_false.lt.nrhs) then + ! deal with any null rows and columns + do i = sptr(nnodes+1),n + j = invp(i) ! original row/col index + do r = 1,nrhs + if (.not. flag_out(r)) cycle + temp = x(j,r) + if (abs(temp) .gt. tol(r)) then + flag_out(r) = .false. + num_false = num_false + 1 + x(1:n,r+nrhs) = zero + x(j,r+nrhs) = one + end if + if (num_false.eq.nrhs) exit + end do + end do + end if + + if (num_false.gt.0 .and. num_false.lt.nrhs) then + ! make sure that cols nrhs+1:2*nrhs are defined + ! (as will perform back sub on these cols even if means + ! we are solving for some consistent cols twice). + do r = 1,nrhs + if (.not. flag_out(r)) cycle + x(1:n,r+nrhs) = 0 + end do + end if + +end subroutine diag_solve + +!************************************************************************* +! +! Multiply single rhs by L +! +subroutine node_mult(pos_def, trans, nvec, x, ldx, y, ldy, rlist, invp, & + blkm, blkn, nelim, nd, lcol, lperm, xlocal, map) + logical, intent(in) :: pos_def + logical, intent(in) :: trans + integer, intent(in) :: nvec + real(wp), dimension(*), intent(in) :: x + integer, intent(in) :: ldx + real(wp), dimension(*), intent(inout) :: y + integer, intent(in) :: ldy + integer, dimension(*), intent(in) :: rlist + integer, dimension(*), intent(in) :: invp + integer, intent(in) :: blkm + integer, intent(in) :: blkn + integer, intent(in) :: nelim + integer, intent(in) :: nd + real(wp), dimension(*), intent(in) :: lcol + integer, dimension(*), intent(in) :: lperm + real(wp), dimension(*), intent(out) :: xlocal + integer, dimension(*), intent(out) :: map + + integer :: i, k + integer :: rp1 + character(len=1) :: diag + + do i = 1, blkn + map(i) = invp( lperm(i) ) + end do + k = 1+blkn-nd + do i = blkn+1, blkm + map(i) = invp( rlist(k) ) + k = k + 1 + end do + + ! Gather relevant part of x into xlocal + if(.not.trans) then + do k = 1, nvec + do i = 1, nelim + rp1 = map(i) + xlocal(i+(k-1)*blkm) = x(rp1+(k-1)*ldx) + end do + end do + else + do k = 1, nvec + do i = 1, blkm + rp1 = map(i) + xlocal(i+(k-1)*blkm) = x(rp1+(k-1)*ldx) + end do + end do + end if + + diag = 'U' + if(pos_def) diag = 'N' + + !print *, "lcol = ", lcol(1:blkm*blkn) + !print *, "xlocal pre = ", xlocal(1:blkm) + + if(nvec.eq.1) then ! matrix-vector version + if(.not.trans) then + if (blkm-nelim.gt.0) & + call dgemv('N', blkm-nelim, nelim, one, lcol(nelim+1), blkm, & + xlocal, 1, zero, xlocal(nelim+1), 1) + ! dtrmv comes last as it is destructive of xlocal + call dtrmv('L', 'N', diag, nelim, lcol, blkm, xlocal, 1) + else + ! dtrmv comes first as dgemv is destructive of xlocal + call dtrmv('L', 'T', diag, nelim, lcol, blkm, xlocal, 1) + if (blkm-nelim.gt.0) & + call dgemv('T', blkm-nelim, nelim, one, lcol(nelim+1), blkm, & + xlocal(nelim+1), 1, one, xlocal, 1) + end if + else ! matrix-matrix version + if(.not.trans) then + if (blkm-nelim.gt.0) & + call dgemm('N', 'N', blkm-nelim, nvec, nelim, one, lcol(nelim+1), & + blkm, xlocal, blkm, zero, xlocal(nelim+1), blkm) + ! dtrmv comes last as it is destructive of xlocal + call dtrmm('Left', 'Lower', 'Non-T', diag, nelim, nvec, one, & + lcol, blkm, xlocal, blkm) + else + ! dtrmv comes first as dgemv is destructive of xlocal + call dtrmm('Left', 'Lower', 'Trans', diag, nelim, nvec, one, & + lcol, blkm, xlocal, blkm) + if (blkm-nelim.gt.0) & + call dgemm('T', 'N', nelim, nvec, blkm-nelim, one, lcol(nelim+1), & + blkm, xlocal(nelim+1), blkm, one, xlocal, blkm) + end if + end if + + !print *, "xlocal post = ", xlocal(1:blkm) + + ! Scatter solution back from xlocal + if(.not.trans) then + do k = 1, nvec + do i = 1, blkm + rp1 = map(i) + y(rp1+(k-1)*ldy) = y(rp1+(k-1)*ldy) + xlocal(i+(k-1)*blkm) + end do + end do + else + do k = 1, nvec + do i = 1, nelim + rp1 = map(i) + y(rp1+(k-1)*ldy) = xlocal(i+(k-1)*blkm) + end do + end do + end if +end subroutine node_mult + +!************************************************************************* +! +! Forward substitution single rhs +! +subroutine slv_fwd_one(pos_def, rlist, invp, x, blkm, blkn, nelim, nd, lcol, & + lperm, xlocal, map, blas3) + logical, intent(in) :: pos_def + integer, dimension(*), intent(in) :: rlist + integer, dimension(*), intent(in) :: invp + real(wp), dimension(*), intent(inout) :: x + integer, intent(in) :: blkm + integer, intent(in) :: blkn + integer, intent(in) :: nelim + integer, intent(in) :: nd + real(wp), dimension(*), intent(in) :: lcol + integer, dimension(*), intent(in) :: lperm + real(wp), dimension(*), intent(out) :: xlocal + integer, dimension(*), intent(out) :: map + logical, intent(in) :: blas3 + + integer(long) :: ip, ip2 + integer :: i, j, k + integer :: rp1 + real(wp) :: ri, ri2 + + do i = 1, blkn + map(i) = invp( lperm(i) ) + end do + k = 1+blkn-nd + do i = blkn+1, blkm + map(i) = invp( rlist(k) ) + k = k + 1 + end do + + ! Copy eliminated variables into xlocal + do i = 1, nelim + rp1 = map(i) + xlocal(i) = x(rp1) + end do + + ! Perform the solve + if (blkm.gt.10 .and. nelim.gt.4) then + ! Work with xlocal + + if(blas3) then + if(pos_def) then + call dtrsm('Left', 'Lower', 'Non-Trans', 'Non-Unit', nelim, 1, & + one, lcol, blkm, xlocal, blkm) + else + call dtrsm('Left', 'Lower', 'Non-Trans', 'Unit', nelim, 1, & + one, lcol, blkm, xlocal, blkm) + end if + else + if(pos_def) then + call dtrsv('L','N','N', nelim, lcol, blkm, xlocal, 1) + else + call dtrsv('L','N','U', nelim, lcol, blkm, xlocal, 1) + end if + end if + + if (blkm-nelim.gt.0) then + if(blas3) then + call dgemm('N', 'N', blkm-nelim, 1, nelim, -one, & + lcol(nelim+1), blkm, xlocal, blkm, zero, & + xlocal(nelim+1), blkm) + else + call dgemv('N', blkm-nelim, nelim, -one, lcol(nelim+1), blkm, & + xlocal, 1, zero, xlocal(nelim+1), 1) + end if + ! Add contribution into x + ! Delays first + do i = nelim+1, blkm + rp1 = map(i) + x(rp1) = x(rp1) + xlocal(i) + end do + end if + else + do i = 1, nelim-1, 2 + ip = (i-1)*blkm + ip2 = i*blkm + if(pos_def) xlocal(i) = xlocal(i) / lcol(ip+i) + ri = xlocal(i) + xlocal(i+1) = xlocal(i+1) - ri * lcol(ip+i+1) + if(pos_def) xlocal(i+1) = xlocal(i+1) / lcol(ip2+i+1) + ri2 = xlocal(i+1) + do j = i+2, nelim + xlocal(j) = xlocal(j) - ri * lcol(ip+j) - ri2 * lcol(ip2+j) + end do + do j = nelim+1, blkm + rp1 = map(j) + x(rp1) = x(rp1) - ri * lcol(ip+j) - ri2 * lcol(ip2+j) + end do + end do + if(mod(nelim,2).eq.1) then + ip = (i-1)*blkm + ip2 = i*blkm + if(pos_def) xlocal(i) = xlocal(i) / lcol(ip+i) + ri = xlocal(i) + ! Commented loop redundant as i=nelim+1 + !do j = i+1, nelim + ! xlocal(j) = xlocal(j) - ri * lcol(ip+j) + !end do + do j = nelim+1, blkm + rp1 = map(j) + x(rp1) = x(rp1) - ri * lcol(ip+j) + end do + end if + end if + + ! Copy solution back from xlocal + do i = 1, nelim + rp1 = map(i) + x(rp1) = xlocal(i) + end do +end subroutine slv_fwd_one + +!************************************************************************* +! +! Forward substitution multiple rhs +! +subroutine slv_fwd_mult(pos_def, rlist, invp, nrhs, x, ldx, blkm, blkn, nelim, & + nd, lcol, lperm, xlocal, map) + logical, intent(in) :: pos_def + integer, dimension(*), intent(in) :: rlist + integer, dimension(*), intent(in) :: invp + integer, intent(in) :: nrhs + integer, intent(in) :: ldx + real(wp), dimension(ldx,*), intent(inout) :: x + integer, intent(in) :: blkm + integer, intent(in) :: blkn + integer, intent(in) :: nelim + integer, intent(in) :: nd + real(wp), dimension(*), intent(in) :: lcol + integer, dimension(*), intent(in) :: lperm + real(wp), dimension(blkm,*), intent(out) :: xlocal + integer, dimension(*), intent(out) :: map + + integer(long) :: ip + integer :: i, j, k, r + integer :: rp1 + real(wp) :: ri + + do i = 1, blkn + map(i) = invp( lperm(i) ) + end do + k = 1+blkn-nd + do i = blkn+1, blkm + map(i) = invp( rlist(k) ) + k = k + 1 + end do + + ! Copy eliminated variables into xlocal + do r = 1, nrhs + do i = 1, nelim + rp1 = map(i) + xlocal(i,r) = x(rp1, r) + end do + end do + + ! Perform the solve + if (blkm.gt.10 .and. nelim.gt.4) then + ! Work with xlocal + + if(pos_def) then + call dtrsm('Left', 'Lower', 'Non-Trans', 'Non-Unit', nelim, nrhs, & + one, lcol, blkm, xlocal, blkm) + else + call dtrsm('Left', 'Lower', 'Non-Trans', 'Unit', nelim, nrhs, & + one, lcol, blkm, xlocal, blkm) + end if + + if (blkm-nelim.gt.0) then + call dgemm('N', 'N', blkm-nelim, nrhs, nelim, -one, & + lcol(nelim+1), blkm, xlocal, blkm, zero, & + xlocal(nelim+1,1), blkm) + ! Add contribution into x + do r = 1, nrhs + ! Delays first + do i = nelim+1, blkn + rp1 = map(i) + x(rp1,r) = x(rp1,r) + xlocal(i,r) + end do + ! Expected rows + do j = blkn+1, blkm + rp1 = map(j) + x(rp1,r) = x(rp1,r) + xlocal(j,r) + end do + end do + end if + else + do r = 1, nrhs + do i = 1, nelim + ip = (i-1)*blkm + if(pos_def) xlocal(i,r) = xlocal(i,r) / lcol(ip+i) + ri = xlocal(i,r) + do j = i+1, nelim + xlocal(j,r) = xlocal(j,r) - ri * lcol(ip+j) + end do + do j = nelim+1, blkm + rp1 = map(j) + x(rp1,r) = x(rp1,r) - ri * lcol(ip+j) + end do + end do + end do + end if + + ! Copy solution back from xlocal + do r = 1, nrhs + do i = 1, nelim + rp1 = map(i) + x(rp1,r) = xlocal(i,r) + end do + end do +end subroutine slv_fwd_mult + +!************************************************************************* +! +! Forward substitution single SPARSE rhs +! +subroutine slv_fwd_sparse(pos_def, rlist, invp, x, blkm, blkn, nelim, nd, lcol,& + lperm, xlocal, map, blas3, lflag, nxi, xindex) + logical, intent(in) :: pos_def + integer, dimension(*), intent(in) :: rlist + integer, dimension(*), intent(in) :: invp + real(wp), dimension(*), intent(inout) :: x + integer, intent(in) :: blkm + integer, intent(in) :: blkn + integer, intent(in) :: nelim + integer, intent(in) :: nd + real(wp), dimension(*), intent(in) :: lcol + integer, dimension(*), intent(in) :: lperm + real(wp), dimension(*), intent(out) :: xlocal + integer, dimension(*), intent(out) :: map + logical, dimension(*), intent(inout) :: lflag ! lflag(j) = true if + !x(j) is non-zero + logical, intent(in) :: blas3 + integer, intent(inout) :: nxi + integer, dimension(*), intent(inout) :: xindex + + integer(long) :: ip, ip2 + integer :: i, j, k + integer :: rp1 + real(wp) :: ri, ri2 + logical :: solve + + do i = 1, blkn + map(i) = invp( lperm(i) ) + end do + k = 1 + blkn - nd + do i = blkn+1, blkm + map(i) = invp( rlist(k) ) + k = k + 1 + end do + + ! Copy eliminated variables into xlocal. If corresponding entries of x + ! are all zero, then nothing to do and return immediately. + solve = .false. + do i = 1,nelim + rp1 = map(i) + if (lflag(rp1)) solve = .true. + xlocal(i) = x(rp1) + end do + if (.not. solve) return + + ! Perform the solve + if (blkm.gt.10 .and. nelim.gt.4) then + ! Work with xlocal + + if(blas3) then + if(pos_def) then + call dtrsm('Left', 'Lower', 'Non-Trans', 'Non-Unit', nelim, 1, & + one, lcol, blkm, xlocal, blkm) + else + call dtrsm('Left', 'Lower', 'Non-Trans', 'Unit', nelim, 1, & + one, lcol, blkm, xlocal, blkm) + end if + else + if(pos_def) then + call dtrsv('L','N','N', nelim, lcol, blkm, xlocal, 1) + else + call dtrsv('L','N','U', nelim, lcol, blkm, xlocal, 1) + end if + end if + + if (blkm-nelim.gt.0) then + if(blas3) then + call dgemm('N', 'N', blkm-nelim, 1, nelim, -one, & + lcol(nelim+1), blkm, xlocal, blkm, zero, & + xlocal(nelim+1), blkm) + else + call dgemv('N', blkm-nelim, nelim, -one, lcol(nelim+1), blkm, & + xlocal, 1, zero, xlocal(nelim+1), 1) + end if + ! Add contribution into x + ! Delays first + do i = nelim+1, blkm + rp1 = map(i) + if (.not. lflag(rp1)) then + lflag(rp1) = .true. + nxi = nxi + 1 + xindex(nxi) = rp1 + end if + x(rp1) = x(rp1) + xlocal(i) + end do + end if + else + do i = 1, nelim-1, 2 + ip = (i-1)*blkm + ip2 = i*blkm + if(pos_def) xlocal(i) = xlocal(i) / lcol(ip+i) + ri = xlocal(i) + xlocal(i+1) = xlocal(i+1) - ri * lcol(ip+i+1) + if(pos_def) xlocal(i+1) = xlocal(i+1) / lcol(ip2+i+1) + ri2 = xlocal(i+1) + do j = i+2, nelim + xlocal(j) = xlocal(j) - ri * lcol(ip+j) - ri2 * lcol(ip2+j) + end do + do j = nelim+1, blkm + rp1 = map(j) + if (.not. lflag(rp1)) then + lflag(rp1) = .true. + nxi = nxi + 1 + xindex(nxi) = rp1 + end if + x(rp1) = x(rp1) - ri * lcol(ip+j) - ri2 * lcol(ip2+j) + end do + end do + if(mod(nelim,2).eq.1) then + ip = (i-1)*blkm + ip2 = i*blkm + if(pos_def) xlocal(i) = xlocal(i) / lcol(ip+i) + ri = xlocal(i) + ! Commented loop redundant as i=nelim+1 + !do j = i+1, nelim + ! xlocal(j) = xlocal(j) - ri * lcol(ip+j) + !end do + do j = nelim+1, blkm + rp1 = map(j) + if (.not. lflag(rp1)) then + lflag(rp1) = .true. + nxi = nxi + 1 + xindex(nxi) = rp1 + end if + x(rp1) = x(rp1) - ri * lcol(ip+j) + end do + end if + end if + + ! Copy solution back from xlocal + do i = 1, nelim + rp1 = map(i) + if (.not. lflag(rp1)) then + lflag(rp1) = .true. + nxi = nxi + 1 + xindex(nxi) = rp1 + end if + x(rp1) = xlocal(i) + end do + +end subroutine slv_fwd_sparse + +!************************************************************************* +! +! Back substitution (with diagonal solve) single rhs +! +subroutine slv_bwd_one(pos_def, job, rlist, invp, x, blkm, blkn, nelim, & + nd, lcol, d, lperm, xlocal, map, blas3) + logical, intent(in) :: pos_def + integer, intent(in) :: job ! used to indicate whether diag. sol. required + ! job = 3 : backsubs only ((PL)^Tx = b) + ! job = 0 or 4 : diag and backsubs (D(PL)^Tx = b) + integer, dimension(*), intent(in) :: rlist + integer, dimension(*), intent(in) :: invp + real(wp), dimension(*), intent(inout) :: x + integer, intent(in) :: blkm + integer, intent(in) :: blkn + integer, intent(in) :: nelim + integer, intent(in) :: nd + real(wp), dimension(*), intent(in) :: lcol + real(wp), dimension(2*nelim) :: d + integer, dimension(*), intent(in) :: lperm + real(wp), dimension(*), intent(out) :: xlocal + integer, dimension(*), intent(out) :: map + logical, intent(in) :: blas3 + + integer(long) :: ip + integer :: i, j, k + integer :: rp1, rp2 + + do i = 1, blkn + map(i) = invp( lperm(i) ) + end do + k = 1+blkn-nd + do i = blkn+1, blkm + map(i) = invp( rlist(k) ) + k = k + 1 + end do + + if (job.eq.MA97_SOLVE_JOB_BWD .or. pos_def) then + ! No diagonal solve. Copy eliminated variables into xlocal. + do i = 1, nelim + rp1 = map(i) + xlocal(i) = x(rp1) + end do + else + ! Copy eliminated vars into xlocal while performing diagonal solve + j = 1 + do while(j .le. nelim) + if (d(2*j).ne.0) then + ! 2x2 pivot + rp1 = map(j) + rp2 = map(j+1) + xlocal(j) = d(2*j-1) * x(rp1) + & + d(2*j) * x(rp2) + xlocal(j+1) = d(2*j) * x(rp1) + & + d(2*j+1) * x(rp2) + j = j + 2 + else + ! 1x1 pivot + if (d(2*j-1).eq.0.0_wp) then + ! Zero pivot column + xlocal(j) = 0.0_wp + else + ! Proper pivot + rp1 = map(j) + xlocal(j) = x(rp1) * d(2*j-1) + end if + j = j + 1 + end if + end do + end if + !print *, "xlocal pre = ", xlocal(1:nelim) + + ! Perform the solve + if (blkm.gt.10 .and. nelim.gt.4) then + ! Delays + do i = nelim+1, blkn + rp1 = map(i) + xlocal(i) = x(rp1) + end do + ! Expected rows + do j = blkn+1, blkm + rp1 = map(j) + xlocal(j) = x(rp1) + end do + if (blkm-nelim.gt.0) then + if(blas3) then + call dgemm('Trans', 'Non-trans', nelim, 1, blkm-nelim, -one, & + lcol(nelim+1), blkm, xlocal(nelim+1), blkm, one, xlocal, & + blkm) + else + call dgemv('T', blkm-nelim, nelim, -one, lcol(nelim+1), blkm, & + xlocal(nelim+1), 1, one, xlocal, 1) + end if + end if + + !print *, "xlocal2 pre = ", xlocal(1:nelim) + + if(blas3) then + if(pos_def) then + call dtrsm('Left','Lower','Trans','Non-Unit', nelim, 1, one, & + lcol, blkm, xlocal, blkm) + else + call dtrsm('Left','Lower','Trans','Unit', nelim, 1, one, lcol, & + blkm, xlocal, blkm) + end if + else + if(pos_def) then + call dtrsv('L','T','N', nelim, lcol, blkm, xlocal, 1) + else + call dtrsv('L','T','U', nelim, lcol, blkm, xlocal, 1) + end if + end if + + !print *, "xlocal1 = ", xlocal(1:nelim) + + ! Copy solution back from xlocal + do i = 1, nelim + rp1 = map(i) + x(rp1) = xlocal(i) + end do + else + ! Do update with indirect addressing + do i = 1, nelim + ip = (i-1)*blkm + do j = nelim+1, blkm + rp1 = map(j) + xlocal(i) = xlocal(i) - x(rp1) * lcol(ip+j) + end do + end do + + ! Solve with direct addressing + if(pos_def) then + do i = nelim, 1, -1 + ip = (i-1)*blkm + rp1 = map(i) + xlocal(i) = xlocal(i) - & + sum(xlocal(i+1:nelim) * lcol(ip+i+1:ip+nelim)) + xlocal(i) = xlocal(i) / lcol(ip+i) + x(rp1) = xlocal(i) + end do + else + do i = nelim, 1, -1 + ip = (i-1)*blkm + rp1 = map(i) + xlocal(i) = xlocal(i) - & + sum(xlocal(i+1:nelim) * lcol(ip+i+1:ip+nelim)) + x(rp1) = xlocal(i) + end do + end if + end if +end subroutine slv_bwd_one + +!************************************************************************* +! +! Back substitution (with diagonal solve) multiple rhs +! +subroutine slv_bwd_mult(pos_def, job, rlist, invp, nrhs, x, ldx, blkm, & + blkn, nelim, nd, lcol, d, lperm, xlocal, map) + logical, intent(in) :: pos_def + integer, intent(in) :: job ! used to indicate whether diag. sol. required + ! job = 3 : backsubs only ((PL)^Tx = b) + ! job = 0 or 4 : diag and backsubs (D(PL)^Tx = b) + integer, dimension(*), intent(in) :: rlist + integer, dimension(*), intent(in) :: invp + integer, intent(in) :: nrhs + integer, intent(in) :: ldx + real(wp), dimension(ldx,*), intent(inout) :: x + integer, intent(in) :: blkm + integer, intent(in) :: blkn + integer, intent(in) :: nelim + integer, intent(in) :: nd + real(wp), dimension(*), intent(in) :: lcol + real(wp), dimension(2*nelim) :: d + integer, dimension(*), intent(in) :: lperm + real(wp), dimension(blkm,*), intent(out) :: xlocal + integer, dimension(*), intent(out) :: map + + integer(long) :: ip + integer :: i, j, k, r + integer :: rp1, rp2 + + do i = 1, blkn + map(i) = invp( lperm(i) ) + end do + k = 1+blkn-nd + do i = blkn+1, blkm + map(i) = invp( rlist(k) ) + k = k + 1 + end do + + if (job == MA97_SOLVE_JOB_BWD .or. pos_def) then + ! no diagonal solve. Copy eliminated variables into xlocal + do r = 1, nrhs + do i = 1, nelim + rp1 = map(i) + xlocal(i,r) = x(rp1, r) + end do + end do + else + ! Copy eliminated vars into xlocal while performing diagonal solve + do r = 1, nrhs + j = 1 + do while(j .le. nelim) + if (d(2*j).ne.0) then + ! 2x2 pivot + rp1 = map(j) + rp2 = map(j+1) + xlocal(j,r) = d(2*j-1) * x(rp1,r) + & + d(2*j) * x(rp2,r) + xlocal(j+1,r) = d(2*j) * x(rp1,r) + & + d(2*j+1) * x(rp2,r) + j = j + 2 + else + ! 1x1 pivot + if (d(2*j-1).eq.0.0_wp) then + ! Zero pivot column + xlocal(j,r) = 0.0_wp + else + ! Proper pivot + rp1 = map(j) + xlocal(j,r) = x(rp1,r) * d(2*j-1) + end if + j = j + 1 + end if + end do + end do + end if + + ! Perform the solve + if (blkm.gt.10 .and. nelim.gt.4) then + do r = 1, nrhs + ! Delays + do i = nelim+1, blkn + rp1 = map(i) + xlocal(i,r) = x(rp1,r) + end do + ! Expected rows + do j = blkn+1, blkm + rp1 = map(j) + xlocal(j,r) = x(rp1,r) + end do + end do + if (blkm-nelim.gt.0) then + call dgemm('Trans', 'Non-trans', nelim, nrhs, blkm-nelim, -one, & + lcol(nelim+1), blkm, xlocal(nelim+1,1), blkm, one, xlocal, & + blkm) + end if + + if(pos_def) then + call dtrsm('Left','Lower','Trans','Non-Unit', nelim, nrhs, one, lcol, & + blkm, xlocal, blkm) + else + call dtrsm('Left','Lower','Trans','Unit', nelim, nrhs, one, lcol, & + blkm, xlocal, blkm) + end if + do r = 1, nrhs + do i = 1, nelim + rp1 = map(i) + x(rp1,r) = xlocal(i,r) + end do + end do + else + ! Do update with indirect addressing + do r = 1, nrhs + do i = 1, nelim + ip = (i-1)*blkm + do j = nelim+1, blkm + rp1 = map(j) + xlocal(i,r) = xlocal(i,r) - x(rp1,r) * lcol(ip+j) + end do + end do + + ! Solve with direct addressing + if(pos_def) then + do i = nelim, 1, -1 + ip = (i-1)*blkm + rp1 = map(i) + xlocal(i,r) = xlocal(i,r) - & + sum(xlocal(i+1:nelim,r) * lcol(ip+i+1:ip+nelim)) + xlocal(i,r) = xlocal(i,r) / lcol(ip+i) + x(rp1,r) = xlocal(i,r) + end do + else + do i = nelim, 1, -1 + ip = (i-1)*blkm + rp1 = map(i) + xlocal(i,r) = xlocal(i,r) - & + sum(xlocal(i+1:nelim,r) * lcol(ip+i+1:ip+nelim)) + x(rp1,r) = xlocal(i,r) + end do + end if + end do + end if +end subroutine slv_bwd_mult + +!************************************************************************* +! +! Diagonal solve one rhs +! +subroutine slv_diag_one(invp, x, nelim, d, lperm) + integer, dimension(*), intent(in) :: invp + real(wp), dimension(*), intent(inout) :: x + integer, intent(in) :: nelim + real(wp), dimension(2*nelim) :: d + integer, dimension(*), intent(in) :: lperm + + integer :: j + integer :: rp1, rp2 + real(wp) :: temp + + j = 1 + do while(j .le. nelim) + if (d(2*j).ne.0) then + ! 2x2 pivot + rp1 = invp( lperm(j) ) + rp2 = invp( lperm(j+1) ) + temp = d(2*j-1) * x(rp1) + & + d(2*j) * x(rp2) + x(rp2) = d(2*j) * x(rp1) + & + d(2*j+1) * x(rp2) + x(rp1) = temp + j = j + 2 + else + ! 1x1 pivot + rp1 = invp( lperm(j) ) + x(rp1) = x(rp1) * d(2*j-1) + j = j + 1 + end if + end do +end subroutine slv_diag_one + +!************************************************************************* +! +! Diagonal solve multiple rhs +! +subroutine slv_diag_mult(invp, nrhs, x, ldx, nelim, d, lperm) + integer, dimension(*), intent(in) :: invp + integer, intent(in) :: nrhs + integer, intent(in) :: ldx + real(wp), dimension(ldx,*), intent(inout) :: x + integer, intent(in) :: nelim + real(wp), dimension(2*nelim) :: d + integer, dimension(*), intent(in) :: lperm + + integer :: j, r + integer :: rp1, rp2 + real(wp) :: temp + + do r = 1, nrhs + j = 1 + do while(j .le. nelim) + if (d(2*j).ne.0) then + ! 2x2 pivot + rp1 = invp( lperm(j) ) + rp2 = invp( lperm(j+1) ) + temp = d(2*j-1) * x(rp1,r) + & + d(2*j) * x(rp2,r) + x(rp2,r) = d(2*j) * x(rp1,r) + & + d(2*j+1) * x(rp2,r) + x(rp1,r) = temp + j = j + 2 + else + ! 1x1 pivot + rp1 = invp( lperm(j) ) + x(rp1,r) = x(rp1,r) * d(2*j-1) + j = j + 1 + end if + end do + end do +end subroutine slv_diag_mult + +!************************************************************************* +! +! indefinite singular case. check consistency after forward solve +! and perform diag solve if consistent. +! +subroutine check_diag(n, invp, nrhs, x, ldx, nelim, d, lperm, & + flag_out, num_false, tol) + integer, intent(in) :: n + integer, dimension(*), intent(in) :: invp + integer, intent(in) :: nrhs + integer, intent(in) :: ldx + real(wp), dimension(ldx,2*nrhs), intent(inout) :: x + integer, intent(in) :: nelim + real(wp), dimension(2*nelim) :: d + integer, dimension(*), intent(in) :: lperm + logical, intent (inout) :: flag_out(nrhs) + integer, intent (inout) :: num_false ! number of inconsistent rhs + real(wp), intent (in) :: tol(nrhs) ! tolerance used to determine whether + ! or not system is consistent + + integer :: j, r + integer :: rp1, rp2 + real(wp) :: temp + + ! write (6,*) 'nelim',nelim + + do r = 1, nrhs + j = 1 + do while(j .le. nelim) + + if (d(2*j).ne.0) then + ! 2x2 pivot + rp1 = invp( lperm(j) ) + rp2 = invp( lperm(j+1) ) + temp = d(2*j-1) * x(rp1,r) + & + d(2*j) * x(rp2,r) + x(rp2,r) = d(2*j) * x(rp1,r) + & + d(2*j+1) * x(rp2,r) + x(rp1,r) = temp + j = j + 2 + else + ! 1x1 pivot + rp1 = invp( lperm(j) ) + temp = x(rp1,r) + if (flag_out(r) .and. d(2*j-1).eq.zero) then + ! check if rhs is inconsistent (but only if consistent so far) + if (abs(temp) .gt. tol(r)) then + flag_out(r) = .false. + num_false = num_false + 1 + ! set partial Fredholm solution to be zero, + ! except for entry corresponding to inconsistency + x(1:n,r+nrhs) = zero + x(rp1,r+nrhs) = one + end if + end if + x(rp1,r) = temp * d(2*j-1) + j = j + 1 + end if + end do + end do +end subroutine check_diag + +!************************************************************************* +! +! Return diagonal entries to user +! +subroutine ma97_enquire_posdef_double(akeep, fkeep, control, info, d) + type(ma97_akeep), intent(in) :: akeep + type(ma97_fkeep), target, intent(in) :: fkeep + type(ma97_control), intent(in) :: control + type(ma97_info), intent(out) :: info + real(wp), dimension(*), intent(out) :: d + + integer :: blkn, blkm + character(50) :: context ! Procedure name (used when printing). + integer(long) :: i + integer :: j + integer :: n + integer :: node + integer :: nout + integer :: piv + + type(node_type), pointer :: nptr + + context = 'ma97_enquire_posdef' + info%flag = MA97_SUCCESS + + nout = control%unit_error + if (control%print_level < 0) nout = -1 + + if (.not. allocated(fkeep%nodes)) then + ! factorize phase has not been performed + info%flag = MA97_ERROR_CALL_SEQUENCE + call ma97_print_flag(context,nout,info%flag) + return + end if + + if (akeep%flag .lt. 0 .or. fkeep%flag .lt. 0) then + ! immediate return if had an error + info%flag = MA97_ERROR_CALL_SEQUENCE + call ma97_print_flag(context,nout,info%flag) + return + end if + + if (.not.fkeep%pos_def) then + info%flag = MA97_ERROR_NOT_LLT + call MA97_print_flag(context,nout,info%flag) + return + end if + + n = akeep%n + ! ensure d is not returned undefined + d(1:n) = zero ! ensure do not returned with this undefined + + piv = 1 + do node = 1, akeep%nnodes + nptr => fkeep%nodes(node) + blkn = akeep%sptr(node+1) - akeep%sptr(node) + blkm = int(akeep%rptr(node+1) - akeep%rptr(node)) + i = 1 + do j = 1, blkn + d(piv) = nptr%lcol(i) + i = i + blkm + 1 + piv = piv + 1 + end do + end do +end subroutine ma97_enquire_posdef_double + +!************************************************************************* +! In indefinite case, the pivot sequence used will not necessarily be +! +! the same as that passed to ma97_factor (because of delayed pivots). This +! subroutine allows the user to obtain the pivot sequence that was +! actually used. +! also the entries of D^{-1} are returned using array d. +! +subroutine ma97_enquire_indef_double(akeep, fkeep, control, info, & + piv_order, d) + type(ma97_akeep), intent(in) :: akeep + type(ma97_fkeep), target, intent(in) :: fkeep + type(ma97_control), intent(in) :: control + type(ma97_info), intent(out) :: info + integer, dimension(*), optional, intent(out) :: piv_order + ! If i is used to index a variable, its position in the pivot sequence + ! will be placed in piv_order(i), with its sign negative if it is + ! part of a 2 x 2 pivot; otherwise, piv_order(i) will be set to zero. + real(wp), dimension(2,*), optional, intent(out) :: d ! The diagonal + ! entries of D^{-1} will be placed in d(1,:i) and the off-diagonal + ! entries will be placed in d(2,:). The entries are held in pivot order. + + integer :: blkn, blkm + character(50) :: context ! Procedure name (used when printing). + integer :: j, k + integer :: n + integer :: nd + integer :: node + integer :: nout + integer(long) :: offset + integer :: piv + + type(node_type), pointer :: nptr + + context = 'ma97_enquire_indef' + info%flag = MA97_SUCCESS + + nout = control%unit_error + if (control%print_level < 0) nout = -1 + + if (.not. allocated(fkeep%nodes)) then + ! factorize phase has not been performed + info%flag = MA97_ERROR_CALL_SEQUENCE + call ma97_print_flag(context,nout,info%flag) + return + end if + + if (akeep%flag .lt. 0 .or. fkeep%flag .lt. 0) then + ! immediate return if had an error + info%flag = MA97_ERROR_CALL_SEQUENCE + call ma97_print_flag(context,nout,info%flag) + return + end if + + if (fkeep%pos_def) then + info%flag = MA97_ERROR_NOT_LDLT + call MA97_print_flag(context,nout,info%flag) + return + end if + + n = akeep%n + if(present(d)) then + ! ensure d is not returned undefined + d(1:2,1:n) = zero + end if + + piv = 1 + do node = 1, akeep%nnodes + nptr => fkeep%nodes(node) + j = 1 + nd = nptr%ndelay + blkn = akeep%sptr(node+1) - akeep%sptr(node) + nd + blkm = int(akeep%rptr(node+1) - akeep%rptr(node)) + nd + offset = blkm*(blkn+0_long) + do while(j .le. nptr%nelim) + if (nptr%lcol(offset+2*j).ne.0) then + ! 2x2 pivot + if(present(piv_order)) then + k = akeep%invp( nptr%perm(j) ) + piv_order(k) = -piv + k = akeep%invp( nptr%perm(j+1) ) + piv_order(k) = -(piv+1) + end if + if(present(d)) then + d(1,piv) = nptr%lcol(offset+2*j-1) + d(2,piv) = nptr%lcol(offset+2*j) + d(1,piv+1) = nptr%lcol(offset+2*j+1) + d(2,piv+1) = 0 + end if + piv = piv + 2 + j = j + 2 + else + if(present(piv_order)) then + k = akeep%invp( nptr%perm(j) ) + piv_order(k) = piv + end if + if(present(d)) then + d(1,piv) = nptr%lcol(offset+2*j-1) + d(2,piv) = 0 + end if + piv = piv + 1 + j = j + 1 + end if + end do + end do +end subroutine ma97_enquire_indef_double + +!************************************************************************* +! +! In indefinite case, the entries of D^{-1} may be changed using this routine. +! +subroutine ma97_alter_double(d, akeep, fkeep, control, info) + real(wp), dimension(2,*), intent(in) :: d ! The required diagonal entries + ! of D^{-1} must be placed in d(1,i) (i = 1,...n) + ! and the off-diagonal entries must be placed in d(2,i) (i = 1,...n-1). + type(ma97_akeep), intent(in) :: akeep + type(ma97_fkeep), target, intent(inout) :: fkeep + type(ma97_control), intent(in) :: control + type(ma97_info), intent(out) :: info + + integer :: blkm, blkn + character(50) :: context ! Procedure name (used when printing). + integer(long) :: ip + integer :: j + integer :: nd + integer :: node + integer :: nout + integer :: piv + + type(node_type), pointer :: nptr + + info%flag = MA97_SUCCESS + + context = 'ma97_alter' + + nout = control%unit_error + if (control%print_level < 0) nout = -1 + + if (.not. allocated(fkeep%nodes)) then + ! factorize phase has not been performed + info%flag = MA97_ERROR_CALL_SEQUENCE + call ma97_print_flag(context,nout,info%flag) + return + end if + + ! immediate return if already had an error + if (akeep%flag .lt. 0 .or. fkeep%flag .lt. 0) then + info%flag = MA97_ERROR_CALL_SEQUENCE + call ma97_print_flag(context,nout,info%flag) + return + end if + + if (fkeep%pos_def) then + info%flag = MA97_ERROR_NOT_LDLT + call MA97_print_flag(context,nout,info%flag) + return + end if + + piv = 1 + do node = 1, akeep%nnodes + nptr => fkeep%nodes(node) + nd = nptr%ndelay + blkn = akeep%sptr(node+1) - akeep%sptr(node) + nd + blkm = int(akeep%rptr(node+1) - akeep%rptr(node)) + nd + ip = blkm*(blkn+0_long) + 1 + do j = 1, nptr%nelim + nptr%lcol(ip) = d(1,piv) + nptr%lcol(ip+1) = d(2,piv) + ip = ip + 2 + piv = piv + 1 + end do + end do +end subroutine ma97_alter_double + +!************************************************************************* + +subroutine free_akeep_double(akeep) + type(ma97_akeep), intent(inout) :: akeep + + integer :: st + + deallocate(akeep%child_ptr, stat=st) + deallocate(akeep%child_list, stat=st) + deallocate(akeep%invp, stat=st) + deallocate(akeep%level, stat=st) + deallocate(akeep%nlist, stat=st) + deallocate(akeep%nptr, stat=st) + deallocate(akeep%rlist, stat=st) + deallocate(akeep%rptr, stat=st) + deallocate(akeep%sparent, stat=st) + deallocate(akeep%sptr, stat=st) + deallocate(akeep%subtree_work, stat=st) + deallocate(akeep%ptr, stat=st) + deallocate(akeep%row, stat=st) + deallocate(akeep%map, stat=st) +end subroutine free_akeep_double + +!******************************* + +subroutine free_fkeep_double(fkeep) + type(ma97_fkeep), intent(inout) :: fkeep + + integer :: st + + if (.not.allocated(fkeep%nodes)) return + + call smfreeall(fkeep%alloc) + deallocate(fkeep%alloc) + nullify(fkeep%alloc) + + deallocate(fkeep%nodes, stat=st) + deallocate(fkeep%scaling, stat=st) +end subroutine free_fkeep_double + +!******************************* + +subroutine finalise_both_double(akeep, fkeep) + type(ma97_akeep), intent(inout) :: akeep + type(ma97_fkeep), intent(inout) :: fkeep + + call free_akeep_double(akeep) + call free_fkeep_double(fkeep) +end subroutine finalise_both_double + +!*************************************************************** +! +! This subroutine recursivly subdivides factorization at a node +! ( L_11 ) +! ( L_21 L_22 ) +! 1. Any delays are swapped to the end +! 2. Column L_:1 is factorized (recusive call) +! 3. Update L_22 using L_21 +! 4. Swap any delays from L_:1 to end +! 5. Factorize L_22 (recursive call) +! 6. Update any delays from L_:1 by L_22. +! 7. Try an eliminate any delays again. +! +! If the width of the column is smaller than minsz then the factorization +! kernel factor_solve_block is called. +recursive subroutine rfact_block(pos_def, n, p, nb, s, a, lda, d, buf, & + perm, q, control, stats, aleft, aln, ntask, sublevel) + logical, intent(in) :: pos_def + integer, intent(in) :: n ! number of rows in trapeziodal matrix + integer, intent(in) :: p ! number of cols in trapeziodal matrix + integer, intent(in) :: nb ! Block size + integer, intent(in) :: s ! number of cols in trapeziodal matrix that + ! are from delayed pivots. These cols are searched last for pivots. + integer :: lda ! leading dimension of a + real(wp), intent(inout) :: a(*) ! holds trapezoidal matrix + ! to be factorized. Holds the factorization on exit. + ! Delayed columns are permuted to the final columns. Held rowwise + ! at all times. + real(wp), intent(inout) :: d(*) ! holds diagonal pivots + type(real_ptr_type), dimension(*), intent(inout) :: buf ! Work array + integer, intent(inout) :: perm(*) ! perm array. Any swaps performed + ! on columns of matrix are also performed on this array. + integer, intent(out) :: q ! number of pivots chosen + type(ma97_control), intent(in) :: control + type(thread_stats), dimension(*), intent(inout) :: stats + real(wp), intent(inout) :: aleft(*) + integer, intent(in) :: aln + integer, intent(in) :: ntask + integer, optional, intent(in) :: sublevel + + integer :: ndelay + integer :: i, j + integer :: mu, nu + integer :: en2 + integer :: q1 + integer(long) :: ip, ip2 + integer :: lapack_info + integer :: this_thread + integer :: maxdepth + + integer, parameter :: minsz = 256 ! minimum size to engage recursion + !%%type(log_type) :: ltask + + if(present(sublevel)) then + maxdepth = sublevel-1 + elseif(p.le.minsz) then + maxdepth = 1 ! Avoid expensive log operations + else + maxdepth = max(1, int(log(real(n/minsz)) / log(2.0))) + end if + + this_thread = 1 +!$ this_thread = omp_get_thread_num() + 1 + + if (p .le. minsz .or. maxdepth.eq.1) then + if(pos_def) then + call dpotrf('L', p, a, lda, lapack_info) + if(lapack_info.ne.0) then + stats(this_thread)%flag = MA97_ERROR_NOT_POS_DEF + return + end if + call dtrsm('Right', 'Lower', 'Trans', 'Non-unit', n-p, p, & + one, a, lda, a(p+1), lda) + q = p + else + nullify(buf(this_thread)%chkptr) + if(size(buf(this_thread)%val) .lt. p**2) then + deallocate(buf(this_thread)%val, stat=stats(this_thread)%st) + allocate(buf(this_thread)%val(p**2), stat=stats(this_thread)%st) + if(stats(this_thread)%st.ne.0) then + stats(this_thread)%flag = MA97_ERROR_ALLOCATION + return + end if + end if + call factor_solve_block(n, p, nb, s, a, lda, d, & + buf(this_thread)%val, perm, q, control, stats(this_thread), & + aleft, aln, recheck=.not.present(sublevel)) + end if + else + ! Swap any delays we have been passed to end + if (s>0 .and. s0 .and. sp) then + if(noreset) exit sweep + ! Go back to column q+1 + m = q+1 + kkm = kkq1 + rm = q + noreset = .not.recheck + else if (m<1+nb) then + ! Within the current block column + kkm = kkm + lda + 1 + end if + + ! Update column m by pivots so far selected within inner block + kkr1 = kkq1 + (rm-q)*(lda+1_long) + k = kkr1+m-rm-1 + if (q>rm) then + !call dgemv('NoTrans',n-m+1,q-rm,-one,a(k),lda, & + ! buf(lda*(rm+0_long)+m),lda,one,a(kkm),1) + call mydgemv(n-m+1,q-rm,a(k),lda, & + buf(ldbuf*(rm+0_long)+m),ldbuf,a(kkm)) + end if + + !print *, "scan ", m + ! Find largest entry (abs_amax) and second largest entry (amax2) + ! to left of diagonal in row m (cols q+1:m-1). + ! Let t be row index for abs_amax + j = q + 1 + k = kkq1 + m - j + amax = zero + abs_amax = zero + amax2 = zero + t = 0 + if (jabs_amax) then + t = j + amax2 = abs(amax) + amax = a(k) + abs_amax = abs(a(k)) + kkt = k - (m-j) + else + !amax2 = max(abs(a(k)),amax2) + if (abs(a(k)).gt.amax2) amax2 = abs(a(k)) + end if + k = k + lda + end do + + ! Now calculate largest entry below the diagonal of column m. + amaxm1 = zero + amaxb = zero + !do i = m+1,n + ! amaxb = max(abs(a(kkm+i-m)),amaxb) + !end do + if (n-m.ge.1) amaxb = abs(a(kkm+1)) + do k = kkm+2,kkm+n-m + if (abs(a(k)).gt.amaxm1) amaxm1 = abs(a(k)) + end do + if (amaxm1.gt.amaxb) amaxb = amaxm1 + + ! Now calculate largest entry in the whole of column m and make sure + ! that it is neither small nor infinity. + !rmax = max(abs_amax,abs(a(kkm)),amaxb) + rmax = abs_amax + if (abs(a(kkm)).gt.rmax) rmax = abs(a(kkm)) + if (amaxb.gt.rmax) rmax = amaxb + if (rmax<=control%small) then + ! All entries of the column are small + a(kkm) = zero + pivsiz = -1 + perm(m) = perm(m) + exit sweep + else if (rmax > huge(zero)) then + ! There is an infinity in the column + stats%flag = MA97_ERROR_INFINITY + return + end if + + ! Calculate the relative pivot value and see if it is the best so far + if (abs(a(kkm))>control%small) then + urel = abs(a(kkm))/rmax + else + urel = zero + end if + if (urel >= ubest1) then + ubest1 = urel + mbest = m + end if + + ! If there is a candidate 2x2 pivot, try it. + ! Look for a 1x1 pivot only if the 2x2 pivot is unacceptable. + tgt0: if (t>0) then + if ( min(abs(a(kkm)),abs(a(kkt))).gt.control%small .or. & + abs_amax.ge.control%small) then + + ! Store value of the largest entry in whole of column m outwith + ! rows m and t + rmax2 = max(amax2,amaxb) + + detscale = one/max( abs(a(kkm)), abs(a(kkt)), abs_amax ) + detpiv1 = (amax*detscale)*amax + detpiv0 = a(kkm)*detscale*a(kkt) + detpiv = detpiv0 - detpiv1 + ! Make sure that the 2x2 pivot is not singular and that there is + ! little cancellation in calculating detpiv. Bearing in mind the + ! way detscale is calculated, if the largest entry of the matrix + ! is chosen as pivot, the one entry of the reduced matrix has + ! absolute value abs(detpiv). + !print *, "test 2x2 = ", detpiv, detpiv0, detpiv1 + left2x2:if (abs(detpiv)> & + max(control%small,abs(detpiv0)/2,abs(detpiv1)/2)) then + + ! Find largest entry in column t outwith rows m and t + if (t.eq.m-1 .and. amaxt_cache.ne.-1) then + ! Use cached answer from scan of previous column + amaxt = amaxt_cache + else + amaxt = zero + j = q + 1 + k = kkq1 + t - j - lda + do j = q+1, t-1 + k = k + lda + amaxt = max(abs(a(k)),amaxt) + end do + k = k + lda + do i = t+1,m-1 + amaxt = max(abs(a(k+i-t)),amaxt) + end do + do i = m+1,n + amaxt = max(abs(a(k+i-t)),amaxt) + end do + end if + + ! OK as 2x2 pivot if all entries in the rest of the columns + ! are small + if (max(rmax2,amaxt)<=control%small) then + pivsiz = 2 + exit sweep + end if + + ! Calculate the relative pivot value (as 2x2 pivot) + urel = abs(detpiv)/max( & + abs(a(kkm)*detscale)*amaxt+(abs_amax*detscale)*rmax2, & + abs(a(kkt)*detscale)*rmax2+(abs_amax*detscale)*amaxt ) + !print *, "urel2x2 = ", urel + + ! OK as 2x2 pivot if relative pivot value is big enough + if (urel>u) then + pivsiz = 2 + exit sweep + end if + end if left2x2 + end if + end if tgt0 + amaxt_cache = max(abs_amax, amaxm1) + + ! If 2x2 pivot rejected or only one column left, take best 1x1 pivot + ! if it is OK. + if (t>0 .or. m.eq.p) then + !print *, " test 1x1 ubest1 = ", ubest1 + if (ubest1>u) then + !if (t>0) print *, "accept 1x1 rather than 2x2" + pivsiz = 1 + if (mbest.ne.m) & + call ma64_swap(n,nb,q,1,rm,a,lda,aleft,aln,buf,ldbuf, & + perm,mbest,m) + exit sweep + end if + end if + end do sweep + + ! + ! At this stage following variables should have good values: + ! m - pivot column (wil be swapped to posn q+1 for 1x1 or q+2 for 2x2) + ! q - number of pivots already performed + ! kkq1 - posn in a of diagonal of col q+1 + ! t - other pivot column for 2x2 (t=j) then + call dgemm('n','t',n-j+1,m-j+1,2,-one,a(kkq1+j-q-1), & + lda-((q+1)/nb)*nb,buf(kb1+j-q-1),ldbuf,one,a(kkj),lda) + end if + ! Update q and kkq1 + kkq1 = k + lda + 1 + q = q + 2 + + else if (pivsiz.eq.-1) then pivsizes + !print *, "ZERO pivot" + nzero = nzero + 1 ! count zero pivot + ! Handle a row that is zero + if (q+1.ne.m) & + call ma64_swap(n,nb,q,1,rm,a,lda,aleft,aln,buf,ldbuf,perm, & + q+1,m) + !print *, "fail piv" + d(2*q+1) = zero + d(2*q+2) = zero + if(.not.control%action) then + ! Error on singular matrix + stats%flag = MA97_ERROR_SINGULAR + return + end if + stats%num_zero = stats%num_zero + 1 + ! Store L in A and -LD in buf + kq1 = q+1+(q+0_long)*lda + kb1 = q+1+(q+0_long)*ldbuf + buf(kb1) = zero + a(kkq1) = zero + do i = 1, p-q-1 + buf(kb1+i) = zero + a(kkq1+i) = zero + end do + do i = p-q, n-q-1 + a(kkq1+i) = zero + end do + kkq1 = kkq1 + lda + 1 + q = q+1 + end if pivsizes + + if (q>=qlast) then + ! Inner block is complete + ! Update columns (m+1:min(p,m1+nb-1)) for pivots rm+1:qlast (BLAS3) + mlast = min(p,nb) + if (m0 .and. sp) then + if(noreset) exit sweep + ! Go back to column q+1 + m = q+1 + kkm = kkq1 + rm = q + noreset = .not.recheck + else if (m<1+nb) then + ! Within the current block column + kkm = kkm + lda + 1 + end if + + !print *, "scan ", m + ! Find largest and second largest entry to left of diagonal in row m. + j = q + 1 + k = kkq1 + m - j - lda + amax = zero + abs_amax = zero + amax2 = zero + t = 0 + if (jabs_amax) then + t = j + amax2 = abs(amax) + amax = a(k) + abs_amax = abs(a(k)) + kkt = k - (m-j) + else + !amax2 = max(abs(a(k)),amax2) + if (abs(a(k)).gt.amax2) amax2 = abs(a(k)) + end if + end do + rmax = abs_amax + if (abs(a(kkm)).gt.rmax) rmax = abs(a(kkm)) + + ! Now calculate largest entry below the diagonal of column m. + amaxm1 = zero + amaxb = zero + !do i = m+1,n + ! amaxb = max(abs(a(kkm+i-m)),amaxb) + !end do + if (n-m.ge.1) amaxb = abs(a(kkm+1)) + do k = kkm+2,kkm+n-m + if (abs(a(k)).gt.amaxm1) amaxm1 = abs(a(k)) + end do + if (amaxm1.gt.amaxb) amaxb = amaxm1 + + ! Now calculate largest entry in the whole of column m and make sure + ! that it is neither small nor infinity. + !rmax = max(abs_amax,abs(a(kkm)),amaxb) + if (amaxb.gt.rmax) rmax = amaxb + if (rmax<=control%small) then + ! All entries of the column are small + a(kkm) = zero + pivsiz = -1 + perm(m) = perm(m) + exit sweep + else if (rmax > huge(zero)) then + ! There is an infinity in the column + stats%flag = MA97_ERROR_INFINITY + return + end if + + d11 = a(kkm) + + ! Calculate relative pivot value and see if it is the best so far + if (abs(d11)>control%small) then + urel = abs(d11)/rmax + if(urel.gt.u) then + pivsiz = 1 + exit sweep + end if + !if (urel >= ubest1) then + ! ubest1 = urel + ! mbest = m + !end if + end if + + ! If there is a candidate 2x2 pivot, try it. + ! Look for a 1x1 pivot only if the 2x2 pivot is unacceptable. + tgt0: if (t>0) then + d22 = a(kkt) + if ( min(abs(d11),abs(d22)).gt.control%small .or. & + abs_amax.ge.control%small) then + + ! Store value of the largest entry in whole of column m outwith + ! rows m and t + rmax2 = max(amax2,amaxb) + + detscale = one/max( abs(d11), abs(d22), abs_amax ) + detpiv1 = (amax*detscale)*amax + detpiv0 = d11*detscale*d22 + detpiv = detpiv0 - detpiv1 + ! Make sure that the 2x2 pivot is not singular and that there is + ! little cancellation in calculating detpiv. Bearing in mind the + ! way detscale is calculated, if the largest entry of the matrix + ! is chosen as pivot, the one entry of the reduced matrix has + ! absolute value abs(detpiv). + !print *, "test 2x2 = ", detpiv, detpiv0, detpiv1 + left2x2:if (abs(detpiv)> & + max(control%small,abs(detpiv0)/2,abs(detpiv1)/2)) then + + ! Find largest entry in column t outwith rows m and t + if (t.eq.m-1 .and. amaxt_cache.ne.-1) then + ! Use cached answer from scan of previous column + amaxt = amaxt_cache + else + amaxt = zero + j = q + 1 + k = kkq1 + t - j - lda + do j = q+1, t-1 + k = k + lda + amaxt = max(abs(a(k)),amaxt) + end do + k = k + lda + do i = t+1,m-1 + amaxt = max(abs(a(k+i-t)),amaxt) + end do + do i = m+1,n + amaxt = max(abs(a(k+i-t)),amaxt) + end do + end if + + ! OK as 2x2 pivot if all entries in the rest of the columns + ! are small + if (max(rmax2,amaxt)<=control%small) then + pivsiz = 2 + exit sweep + end if + + ! Calculate the relative pivot value (as 2x2 pivot) + urel = abs(detpiv)/max( & + abs(d11*detscale)*amaxt+(abs_amax*detscale)*rmax2, & + abs(d22*detscale)*rmax2+(abs_amax*detscale)*amaxt ) + !print *, "urel2x2 = ", urel + + ! OK as 2x2 pivot if relative pivot value is big enough + if (urel>u) then + pivsiz = 2 + exit sweep + end if + end if left2x2 + end if + end if tgt0 + amaxt_cache = max(abs_amax, amaxm1) + + ! If 2x2 pivot rejected or only one column left, take best 1x1 pivot + ! if it is OK. + if (t>0 .or. m.eq.p) then + !print *, " test 1x1 ubest1 = ", ubest1 + if (ubest1>u) then + !if (t>0) print *, "accept 1x1 rather than 2x2" + pivsiz = 1 + if (mbest.ne.m) & + call ma64_swap(n,nb,q,1,rm,a,lda,aleft,aln,buf,ldbuf,perm, & + mbest,m) + exit sweep + end if + end if + end do sweep + + ! + ! At this stage following variables should have good values: + ! m - pivot column (wil be swapped to posn q+1 for 1x1 or q+2 for 2x2) + ! q - number of pivots already performed + ! kkq1 - posn in a of diagonal of col q+1 + ! t - other pivot column for 2x2 (t=j) then + call dgemm('n','t',n-j+1,p-j+1,2,-one,a(kkq1+j-q-1), & + lda-((q+1)/nb)*nb,buf(kb1+j-q-1),ldbuf,one,a(kkj),lda) + end if + ! Update q and kkq1 + kkq1 = k + lda + 1 + q = q + 2 + + else if (pivsiz.eq.-1) then pivsizes + !print *, "ZERO pivot" + nzero = nzero + 1 ! count zero pivot + ! Handle a row that is zero + if (q+1.ne.m) & + call ma64_swap(n,nb,q,1,rm,a,lda,aleft,aln,buf,ldbuf,perm,q+1,m) + !print *, "fail piv" + d(2*q+1) = zero + d(2*q+2) = zero + if(.not.control%action) then + ! Error on singular matrix + stats%flag = MA97_ERROR_SINGULAR + return + end if + stats%num_zero = stats%num_zero + 1 + ! Store L in A and -LD in buf + kq1 = q+1+(q+0_long)*lda + kb1 = q+1+(q+0_long)*ldbuf + buf(kb1) = zero + a(kkq1) = zero + do i = 1, p-q-1 + buf(kb1+i) = zero + a(kkq1+i) = zero + end do + do i = p-q, n-q-1 + a(kkq1+i) = zero + end do + kkq1 = kkq1 + lda + 1 + q = q+1 + end if pivsizes + + if (q .eq. p .or. pivsiz.eq.0) exit pivot + end do pivot + + !print *, "exit d = ", d(1:2*q) + !print *, "exit a = " + !print "(5es12.4)", a + !print *, "delayed ", p-q, "pivots" + +end subroutine factor_solve_block_small + +!******************************* +! +! performs factorization of trapezoidal matrix. +! based on hsl_ma64 version 6.0.0 (ported 18th January 2011) +! +subroutine factor_solve_block1(n, a, d, q, control, stats) + integer, intent(in) :: n ! number of rows in trapeziodal matrix + real(wp), intent(inout) :: a(*) ! holds trapezoidal matrix + ! to be factorized. Holds the factorization on exit. + ! Delayed columns are permuted to the final columns. + real(wp), intent(inout) :: d(2) + integer, intent(out) :: q ! number of pivots chosen + type(ma97_control), intent(in) :: control + type(thread_stats), intent(inout) :: stats + + ! .. Local Scalars .. + integer i ! Row index + integer(long) k ! Position in a + real(wp) pivval ! temporary variable for storing pivotal value + real(wp) u ! Relative pivot threshold + real(wp) urel ! Relative pivot value + + u = min(max(control%u,zero),0.5_wp) + q = 0 + + ! Check if diagonal is zero + if (abs(a(1)).le.control%small) then + ! Diagonal entry is effectively zero + ! Check to see if entire column is zero + + ! Check entries in column. Stop as soon as we encounter a non-zero value + do k = 2, n + if (abs(a(k)).gt.control%small) then + if (abs(a(k)) > huge(zero)) stats%flag = MA97_ERROR_INFINITY + return ! Delay column + end if + end do + + ! Zero column + ! All entries of the column are small + if(.not.control%action) then + ! Error on singular matrix + stats%flag = MA97_ERROR_SINGULAR + return + end if + stats%num_zero = stats%num_zero + 1 + ! Store L in A + d(1:2) = zero + do i = 1, n + a(i) = zero + end do + q = q+1 + return + end if + + ! Diagonal is non-zero + ! Check entries in column. Stop as soon as any indicates bad pivot + urel = abs(a(1)) / u + do k = 2, n + if (urel.le.abs(a(k))) return + end do + + ! Good 1x1 pivot + if (a(1).lt.0) stats%num_neg = stats%num_neg + 1 + ! Store L in A + d(1) = 1/a(1) + d(2) = zero + a(1) = 1/a(1) + pivval = a(1) !d(2*q+1) + do i = 2, n + a(i) = pivval*a(i) + end do + ! Update q + q = q+1 + +end subroutine factor_solve_block1 + +!******************************* +! +! Swap columns. It may be assumed that 1<=j1 a(j2, 1:j1-1) + l = j1-1 + if (l>0) call dswap(l,a(k1),lda,a(k2),lda) + if (aln>0) call dswap(aln,aleft(j1),lda,aleft(j2),lda) + + ! calulate values for next phase + d1 = k1 + l*int(lda,long) + k1 = d1 + 1 + k2 = k2 + l*int(lda,long) + lda + + ! Swap columns with rows + ! i.e. a(j1+1:j2-1, j1) <-> a(j2, j1+1:j2-1) + jb = j2-j1-1 + l = min(jb,nb-j1,j2-1) + if (l>0.and.j2.ge.1) call dswap(l,a(k1),1,a(k2),lda) + + ! set up values for next phase + d2 = k2 + l*int(lda,long) + k2 = d2 + 1 + k1 = k1 + l + 1 + + ! Swap the diagonals + ! i.e. a(j1,j1) <-> a(j2,j2) + temp = a(d1) + a(d1) = a(d2) + a(d2) = temp + + ! Swap columns + ! i.e. a(j2+1:n,j1) <-> a(j2+1:n,j2) + if (n>j2) call dswap(n-j2,a(k1),1,a(k2),1) + +end subroutine ma64_swap + +!******************************* +! +! Update columns jl:jr for pivots pl:pr +! This was based on a routine within ma64. +! +subroutine ma64_update(n,nb,kkq,a,lda,buf,ldbuf,jl,jr,pl,pr) + integer, intent(in) :: n + integer, intent(in) :: nb + integer(long), intent(in) :: kkq + real(wp), intent(inout) :: a(*) + integer, intent(in) :: lda + real(wp), intent(in) :: buf(*) + integer, intent(in) :: ldbuf + integer, intent(in) :: jl,jr,pl,pr + + ! Local variables + integer i + integer j ! column index + integer j2 + integer p + integer(long) kkj ! Position of diagonal j + + integer, parameter :: bs=64 ! block size for update + + j = max(jl,1) + j2 = min(nb,jr) + + if (n.lt.j .or. j2.lt.j .or. pl.gt.pr) return + + do i = 1, j2-j+1, bs + kkj = 1 + (j-1+i-1)*(lda+1_long) + p = min(bs, j2-j+1-i+1) + call dgemm ('n', 't', n-j+1-i+1, p, pr-pl+1, -one, & + a(kkq+j-1+lda*(pl-1)+i-1), lda, buf(j+ldbuf*(pl-1)+i-1), ldbuf, & + one, a(kkj), lda) + end do + +end subroutine ma64_update + +!******************************* +! Equivalent to call: +! call dgemv('NoTrans', m, n, -one, a, lda, b, ldb, one, c, 1) +! However for small updates exploit explicit loops as this is faster +! (calls dgemv itself for large updates) +subroutine mydgemv(m, n, a, lda, b, ldb, c) + integer, intent(in) :: m + integer, intent(in) :: n + real(wp), dimension(*), intent(in) :: a + integer, intent(in) :: lda + real(wp), dimension(*), intent(in) :: b + integer, intent(in) :: ldb + real(wp), dimension(*), intent(inout) :: c + + integer :: i + integer :: ipa, ipb + real(wp) :: b1, b2, b3, b4, val + + select case(n) + case(1) + !call dgemv('NoTrans', m, 1, -one, a, lda, b, ldb, one, c, 1) + b1 = b(1) + c(1:m) = c(1:m) - b1 * a(1:m) + case(2) + !call dgemv('NoTrans', m, 2, -one, a, lda, b, ldb, one, c, 1) + b1 = b(1) + b2 = b(1+ldb) + c(1:m) = c(1:m) - b1 * a(1:m) - b2 * a(lda+1:lda+m) + case default + select case(m) + case(1) + b1 = 0 + ipa = 1; ipb = 1 + do i = 1, n + b1 = b1 + a(ipa) * b(ipb) + ipa = ipa + lda + ipb = ipb + ldb + end do + c(1) = c(1) - b1 + case(2) + b1 = 0; b2 = 0 + ipa = 1; ipb = 1 + do i = 1, n + val = b(ipb) + b1 = b1 + a(ipa) * val + b2 = b2 + a(ipa+1) * val + ipa = ipa + lda + ipb = ipb + ldb + end do + c(1) = c(1) - b1 + c(2) = c(2) - b2 + case(3) + b1 = 0; b2 = 0; b3 = 0 + ipa = 1; ipb = 1 + do i = 1, n + val = b(ipb) + b1 = b1 + a(ipa) * val + b2 = b2 + a(ipa+1) * val + b3 = b3 + a(ipa+2) * val + ipa = ipa + lda + ipb = ipb + ldb + end do + c(1) = c(1) - b1 + c(2) = c(2) - b2 + c(3) = c(3) - b3 + case(4) + b1 = 0; b2 = 0; b3 = 0; b4 = 0 + ipa = 1; ipb = 1 + do i = 1, n + val = b(ipb) + b1 = b1 + a(ipa) * val + b2 = b2 + a(ipa+1) * val + b3 = b3 + a(ipa+2) * val + b4 = b4 + a(ipa+3) * val + ipa = ipa + lda + ipb = ipb + ldb + end do + c(1) = c(1) - b1 + c(2) = c(2) - b2 + c(3) = c(3) - b3 + c(4) = c(4) - b4 + case default + call dgemv('NoTrans', m, n, -one, a, lda, b, ldb, one, c, 1) + end select + end select + +end subroutine mydgemv + +!************************************************* +! +! Allocates memory on supplied stack +! ptr is set to point to a chunk of size len +! Note: no locks required as local to a single thread +! +subroutine stack_alloc(stack, ptr, len, st) + type(stack_mem_type), pointer, intent(inout) :: stack + real(wp), dimension(:), pointer, intent(out) :: ptr + integer(long), intent(in) :: len + integer, intent(out) :: st + + type(stack_mem_type), pointer :: stack_ptr + + st = 0 + + ! If stack is null, allocate it + if(.not.associated(stack)) then + allocate(stack, stat=st) + if(st.ne.0) return + stack%mem_size = max(len, BLK_SZ) + allocate(stack%mem(stack%mem_size), stat=st) + if(st.ne.0) return + end if + + ! Check if there is room on this page for the allocation + if(stack%head+len.gt.stack%mem_size) then + ! If insufficient space, allocate a new page at top of stack + allocate(stack_ptr, stat=st) + if(st.ne.0) return + stack_ptr%below => stack + stack => stack_ptr + stack%mem_size = max(len, BLK_SZ) + allocate(stack%mem(stack%mem_size), stat=st) + if(st.ne.0) return + end if + + ! Set pointer to next available block and increment head + ptr => stack%mem(stack%head+1:stack%head+len) + stack%head = stack%head + len +end subroutine stack_alloc + +!************************************************* +! +! This releases the top len bytes of the stack. Frees should be used in +! reverse order to allocates (ie last on first off). +! If a stack page becomes empty, delete it. +! Note: no locks required as local to a single thread +! +subroutine stack_free(stack, len) + type(stack_mem_type), pointer, intent(inout) :: stack + integer(long), intent(in) :: len + + type(stack_mem_type), pointer :: stack_ptr + + stack%head = stack%head - len + + ! If a stack page is empty, delete it and update stack to next page down + ! (which may be null) + if(stack%head.eq.0) then + stack_ptr => stack + stack => stack%below + deallocate(stack_ptr%mem) + deallocate(stack_ptr) + end if +end subroutine stack_free + +!************************************************* +! +! This routine frees all memory associated with the stack. +! It is designed to be called if a factorization needs to abort for some reason +! (e.g. finds matrix is pos def or singular) +! +subroutine stack_free_all(stack) + type(stack_mem_type), pointer, intent(inout) :: stack + + type(stack_mem_type), pointer :: next + + next => stack + do while(associated(next)) + stack => next + next => stack%below + deallocate(stack) ! Automatically deallocates components + end do + nullify(stack) +end subroutine stack_free_all + +!************************************************* +! +! Initialize memory storage of current unallocated page with specified sizes +! (minimum of BLK_SZ) +! MUST be called prior to smalloc() to set up alloc%lock +! +subroutine smalloc_setup(alloc, int_hint, real_hint, st) + type(smalloc_type), intent(inout) :: alloc + integer(long), intent(in) :: int_hint + integer(long), intent(in) :: real_hint + integer, intent(out) :: st + +!$ call omp_init_lock(alloc%lock) + + st = 0 + if(.not.allocated(alloc%imem)) then + alloc%imem_size = max(BLK_SZ+0_long,int_hint) + allocate(alloc%imem(alloc%imem_size), stat=st) + end if + if(.not.allocated(alloc%rmem)) then + alloc%rmem_size = max(BLK_SZ+0_long,real_hint) + allocate(alloc%rmem(alloc%rmem_size), stat=st) + end if +end subroutine smalloc_setup + +!************************************************* +! +! Grab some real memory of the specified size and return a pointer to it +! Preference given to same page as last allocation. +! If this is not possible then check if we fit on any existing pages +! If not make a new page +! Note: as may be accessed by multiple threads, we have a lock +! +subroutine real_alloc(alloc_in, ptr, len, srcptr, srchead, st) + type(smalloc_type), target, intent(inout) :: alloc_in + real(wp), dimension(:), pointer, intent(out) :: ptr + integer(long), intent(in) :: len + type(smalloc_type), pointer, intent(out) :: srcptr + integer(long), intent(out) :: srchead + integer, intent(out) :: st + + type(smalloc_type), pointer :: alloc + + st = 0 + if(len.lt.0) return + +!$ call omp_set_lock(alloc_in%lock) + + ! First try same page as last alloc + if(associated(alloc_in%top_real)) then + alloc => alloc_in%top_real + if(alloc%rhead+len.le.alloc%rmem_size) then + ! Sufficient space, allocate in this block + ptr => alloc%rmem(alloc%rhead+1:alloc%rhead+len) + srcptr => alloc + srchead = alloc%rhead+1 + alloc%rhead = alloc%rhead + len +!$ call omp_unset_lock(alloc_in%lock) + return + end if + end if + + ! Else check all pages, if we reach the end create a new one of sufficient + ! size to allocate the pointer + alloc => alloc_in + do + if(.not.allocated(alloc%rmem)) then + alloc%rmem_size = max(len,BLK_SZ) + allocate(alloc%rmem(alloc%rmem_size), stat=st) + if(st.ne.0) then +!$ call omp_unset_lock(alloc_in%lock) + return + end if + end if + if(alloc%rhead+len.le.alloc%rmem_size) then + ! Sufficient space, allocate in this block + ptr => alloc%rmem(alloc%rhead+1:alloc%rhead+len) + srcptr => alloc + srchead = alloc%rhead+1 + alloc%rhead = alloc%rhead + len + alloc_in%top_real => alloc + exit + end if + ! Insufficent space, move to next block + if(.not.associated(alloc%next_alloc)) then + allocate(alloc%next_alloc, stat=st) + if(st.ne.0) then +!$ call omp_unset_lock(alloc_in%lock) + return + end if + end if + alloc => alloc%next_alloc + end do + +!$ call omp_unset_lock(alloc_in%lock) +end subroutine real_alloc + +!************************************************* +! +! Grab some integer memory of the specified size and return a pointer to it +! Preference given to same page as last allocation. +! If this is not possible then check if we fit on any existing pages +! If not make a new page +! Note: as may be accessed by multiple threads, we have a lock +! +subroutine int_alloc(alloc_in, ptr, len, srcptr, srchead, st) + type(smalloc_type), target, intent(inout) :: alloc_in + integer, dimension(:), pointer, intent(out) :: ptr + integer(long), intent(in) :: len + type(smalloc_type), pointer, intent(out) :: srcptr + integer(long), intent(out) :: srchead + integer, intent(out) :: st + + type(smalloc_type), pointer :: alloc + + st = 0 + if(len.lt.0) return + +!$ call omp_set_lock(alloc_in%lock) + + ! First try same page as last alloc + if(associated(alloc_in%top_int)) then + alloc => alloc_in%top_int + if(alloc%ihead+len.le.alloc%imem_size) then + ! Sufficient space, allocate in this block + ptr => alloc%imem(alloc%ihead+1:alloc%ihead+len) + srcptr => alloc + srchead = alloc%ihead+1 + alloc%ihead = alloc%ihead + len +!$ call omp_unset_lock(alloc_in%lock) + return + end if + end if + + ! Else check all pages, if we reach the end create a new one of sufficient + ! size to allocate the pointer + alloc => alloc_in + do + if(.not.allocated(alloc%imem)) then + alloc%imem_size = max(len,BLK_SZ) + allocate(alloc%imem(alloc%imem_size),stat=st) + if(st.ne.0) then +!$ call omp_unset_lock(alloc_in%lock) + return + end if + end if + if(alloc%ihead+len.le.size(alloc%imem)) then + ! Sufficient space, allocate in this block + ptr => alloc%imem(alloc%ihead+1:alloc%ihead+len) + srcptr => alloc + srchead = alloc%ihead+1 + alloc%ihead = alloc%ihead + len + alloc_in%top_int => alloc + exit + end if + ! Insufficent space, move to next block + if(.not.associated(alloc%next_alloc)) then + allocate(alloc%next_alloc, stat=st) + if(st.ne.0) then +!$ call omp_unset_lock(alloc_in%lock) + return + end if + end if + alloc => alloc%next_alloc + end do + +!$ call omp_unset_lock(alloc_in%lock) +end subroutine int_alloc + +!************************************************* +! +! Free all memory associated with the specified alloc linked list +! (both real and integer) +! +subroutine smfreeall(alloc_in) + type(smalloc_type), intent(inout) :: alloc_in + + type(smalloc_type), pointer :: alloc, alloc2 + integer :: st + + !integer :: cnt + !integer :: wasted + +!$ call omp_destroy_lock(alloc_in%lock) + + deallocate(alloc_in%rmem, stat=st) + alloc_in%rhead = 0 + deallocate(alloc_in%imem, stat=st) + alloc_in%ihead = 0 + alloc => alloc_in%next_alloc + nullify(alloc_in%next_alloc, alloc_in%top_real, alloc_in%top_int) + !cnt = 1 + !wasted = wasted + BLK_SZ - alloc_in%rhead + + do while(associated(alloc)) + !cnt = cnt + 1 + !wasted = wasted + BLK_SZ - alloc%rhead + deallocate(alloc%rmem, stat=st) + deallocate(alloc%imem, stat=st) + alloc2 => alloc%next_alloc + deallocate(alloc) + alloc => alloc2 + end do + !print *, "Freed", cnt, "pages", wasted/real(BLK_SZ*cnt), "wasted." +end subroutine smfreeall + +!************************************************* +! +! routine to print errors and warnings +! +subroutine ma97_print_flag(context,nout,iflag,st) + integer, intent(in) :: iflag, nout + integer, intent(in), optional :: st + character (len=*), optional, intent(in) :: context + + if (nout < 0) return + if (iflag < 0) then + write (nout,'(/3a,i3)') ' Error return from ',trim(context),& + '. Error flag = ', iflag + else + write (nout,'(/3a,i3)') ' Warning from ',trim(context),& + '. Warning flag = ', iflag + end if + + ! Errors + select case(iflag) + case(MA97_ERROR_CALL_SEQUENCE) + write (nout,'(a)') ' Error in sequence of calls.' + + case(MA97_ERROR_A_N_OOR) + write (nout,'(a)') ' n or ne is out of range (or has changed)' + + case(MA97_ERROR_A_PTR) + write (nout,'(a)') ' Error in ptr' + + case(MA97_ERROR_A_ALL_OOR) + write (nout,'(a)') ' All entries in a column out-of-range (ma97_analyse)' + write (nout,'(a)') ' or all entries out-of-range (ma97_analyse_coord)' + + case(MA97_ERROR_MATRIX_TYPE) + write (nout,'(a)') ' matrix_type is out of range or has changed' + + ! Below error is only present in complex version + !case(MA97_ERROR_IMAG_DIAGONAL) + ! write (nout,'(a)') ' one or more diagonal entries is not real' + + case(MA97_ERROR_SINGULAR) + write (nout,'(a)') ' Matrix found to be singular' + + case(MA97_ERROR_NOT_POS_DEF) + write (nout,'(a)') ' Matrix is not positive-definite' + + case(MA97_ERROR_INFINITY) + write (nout,'(a)') ' IEEE infinities detected. Factorization terminated.' + + case(MA97_ERROR_PTR_ROW) + write (nout,'(a)') ' ptr and row should be present' + + case(MA97_ERROR_ORDER) + write (nout,'(a/a)') & + ' Either control%ordering out of range or error in user-supplied & + &elimination order' + + case(MA97_ERROR_X_SIZE) + write (nout,'(a)') ' Error in size of x or nrhs' + + case(MA97_ERROR_JOB_OOR) + write (nout,'(a,i10)') ' job out of range.' + + case(MA97_ERROR_NOT_LLT) + write (nout,'(a)')& + ' Not a LL^T factorization of a positive-definite matrix' + + case(MA97_ERROR_NOT_LDLT) + write (nout,'(a)')& + ' Not a LDL^T factorization of an indefinite matrix' + + case(MA97_ERROR_ALLOCATION) + if (present(st)) then + write (nout,'(a,i6)') ' Allocation error. stat parameter = ', st + else + write (nout,'(a)') ' Allocation error' + end if + + case(MA97_ERROR_NO_METIS) + write (nout,'(a)') & + ' METIS requested but not available' + + case(MA97_ERROR_MC68) + write (nout,'(a)') & + ' Unexpected error return from HSL_MC68 (called by ma97_analyse)' + + case(MA97_ERROR_MC77) + write (nout,'(a)') & + ' Unexpected error return from MC77 (called by ma97_factor)' + + case(MA97_ERROR_VAL) + write (nout,'(a)') & + ' Optional argument val not present when expected' + + case(MA97_ERROR_NO_SAVED_SCALING) + write (nout,'(a)') & + ' Requested use of scaling from matching-based & + &ordering but matching-based ordering not used.' + + case(MA97_ERROR_NBI_OOR) + write (nout,'(a)') ' nbi out of range.' + + ! Warnings + case(MA97_WARNING_IDX_OOR) + write (nout,'(a)') ' out-of-range indices detected' + + case(MA97_WARNING_DUP_IDX) + write (nout,'(a)') ' duplicate entries detected' + + case(MA97_WARNING_DUP_AND_OOR) + write (nout,'(a)') & + ' out-of-range indices detected and duplicate entries detected' + + case(MA97_WARNING_MISSING_DIAGONAL) + write (nout,'(a)') ' one or more diagonal entries is missing' + + case(MA97_WARNING_MISS_DIAG_OORDUP) + write (nout,'(a)') ' one or more diagonal entries is missing and' + write (nout,'(a)') ' out-of-range and/or duplicate entries detected' + + case(MA97_WARNING_ANAL_SINGULAR) + write (nout,'(a)') ' Matrix found to be structually singular' + + case(MA97_WARNING_FACT_SINGULAR) + write (nout,'(a)') ' Matrix found to be singular' + + case(MA97_WARNING_MATCH_ORD_NO_SCALE) + write (nout,'(a)') & + ' Matching-based ordering used but associated scaling ignored' + + case default + write (nout,'(a)') ' HSL_MA97 Internal Error ' + + end select + +end subroutine ma97_print_flag + +!************************************************* +! +! This subroutine converts a node number X to a string "nX" without space +! between the n and the X. +! It is used to output the graph in a nice fashion if dograph=.true. +! +!%%subroutine node_name(str, num) +!%% character(len=8), intent(out) :: str +!%% integer, intent(in) :: num +!%% +!%% str(1:8) = " " +!%% select case(num) +!%% case(0:9) +!%% write(str, "(a1,i1)") "n", num +!%% case(10:99) +!%% write(str, "(a1,i2)") "n", num +!%% case(100:999) +!%% write(str, "(a1,i3)") "n", num +!%% case(1000:9999) +!%% write(str, "(a1,i4)") "n", num +!%% case(10000:99999) +!%% write(str, "(a1,i5)") "n", num +!%% case default +!%% print *, "node name too large" +!%% stop +!%% end select +!%%end subroutine node_name + +! +! This subroutine can be used to compare to fkeeps +! Used for debugging between different parallel runs to check answer is the same +! +!subroutine cmp_fkeep(akeep, fkeep1, fkeep2) +! type(ma97_akeep), intent(in) :: akeep +! type(ma97_fkeep), intent(in) :: fkeep1 +! type(ma97_fkeep), intent(in) :: fkeep2 +! +! integer :: nd +! integer :: node +! integer :: blkm +! integer :: blkn +! integer :: nelim +! logical :: diff +! integer(long) :: ip1, ip2 +! integer :: i +! +! real(wp), dimension(:), pointer :: lcol1, lcol2 +! +! print *, "Checking nodes:" +! do node = 1, akeep%nnodes +! diff = .false. +! if(fkeep1%nodes(node)%nelim .ne. fkeep2%nodes(node)%nelim) then +! print *, "Node ", node, "has differing nelim:", & +! fkeep1%nodes(node)%nelim, fkeep2%nodes(node)%nelim +! diff = .true. +! end if +! if(fkeep1%nodes(node)%ndelay .ne. fkeep2%nodes(node)%ndelay) then +! print *, "Node ", node, "has differing ndelay:", & +! fkeep1%nodes(node)%ndelay, fkeep2%nodes(node)%ndelay +! diff = .true. +! end if +! if(any(fkeep1%nodes(node)%perm .ne. fkeep2%nodes(node)%perm)) then +! print *, "Node ", node, "has differing perm:" +! print *, "Perm 1:", fkeep1%nodes(node)%perm +! print *, "Perm 2:", fkeep2%nodes(node)%perm +! diff = .true. +! end if +! if(diff) then +! print *, " (not checking lcol)" +! else +! nd = fkeep1%nodes(node)%ndelay +! nelim = fkeep1%nodes(node)%nelim +! blkn = akeep%sptr(node+1) - akeep%sptr(node) + nd +! blkm = int(akeep%rptr(node+1) - akeep%rptr(node)) + nd +! ! lcol +! if(any(fkeep1%nodes(node)%lcol .ne. fkeep2%nodes(node)%lcol)) then +! print *, "========" +! print *, "Node ", node, "has differing lcol." +! print *, "Is ", blkm, "x", blkn, "with ", nd, "delays in" +! print *, "nelim = ", nelim +! print *, "parent = ", akeep%sparent(node) +! lcol1 => fkeep1%nodes(node)%lcol +! lcol2 => fkeep2%nodes(node)%lcol +! do i = 1, nelim +! ip1 = (i-1)*blkm + i +! ip2 = i*blkm +! if(any(lcol1(ip1:ip2).ne.lcol2(ip1:ip2))) then +! print *, " col ", i, "differs:" +! print *, " 1:", lcol1(ip1:ip2) +! print *, " 2:", lcol2(ip1:ip2) +! print *, " diff:", abs(lcol1(ip1:ip2)-lcol2(ip1:ip2)) +! print *, " [last entry ip = ", ip2, "]" +! end if +! end do +! end if +! end if +! end do +! print *, "== End of node diff ==" +!end subroutine cmp_fkeep + +pure integer function ma97_get_n_double(akeep) + type(ma97_akeep), intent(in) :: akeep + + ma97_get_n_double = akeep%n +end function ma97_get_n_double + +pure integer function ma97_get_nz_double(akeep) + type(ma97_akeep), intent(in) :: akeep + + ma97_get_nz_double = akeep%ne +end function ma97_get_nz_double + +end module hsl_ma97_double diff --git a/coinhsl/hsl_ma97/hsl_ma97d.lo b/coinhsl/hsl_ma97/hsl_ma97d.lo new file mode 100644 index 0000000..71a32db --- /dev/null +++ b/coinhsl/hsl_ma97/hsl_ma97d.lo @@ -0,0 +1,12 @@ +# coinhsl/hsl_ma97/hsl_ma97d.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4.6 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/hsl_ma97d.o' + +# Name of the non-PIC object +non_pic_object=none + diff --git a/coinhsl/hsl_mc68/C/.deps/.dirstamp b/coinhsl/hsl_mc68/C/.deps/.dirstamp new file mode 100644 index 0000000..e69de29 diff --git a/coinhsl/hsl_mc68/C/.dirstamp b/coinhsl/hsl_mc68/C/.dirstamp new file mode 100644 index 0000000..e69de29 diff --git a/coinhsl/hsl_mc68/C/.libs/hsl_mc68i_ciface.o b/coinhsl/hsl_mc68/C/.libs/hsl_mc68i_ciface.o new file mode 100644 index 0000000000000000000000000000000000000000..478e0dd355dd87274070ac50b191b3e448ddcf36 GIT binary patch literal 5760 zcmb_gYit}>6`p<6ag%gs9YQfQ;1L=j2c=tYF~LTr>^ke+>vqz(ZC=on$!0wpZ@ar= zt!JBuBI2^%lB>z4MidGXLjBPn6{1k2v)jgVtQXcC9RC*-b4bYm}}ZFVY1lR-PxPLu6+YB^0V zw^L!74BM%dG`Z4Fb<$)f`oOt%s+%Ue?bI5YTmwF&ge@oREx~AgsCq{JS)KY(JBOMN z9LA}H4j}^gg9zXcB7i@Lu!==cSOgU!fH%mO9Ko#G;2|?hP$e^|P9%iTR6D8E+dziN zkx@XFIw({+osGy{Q_z*9_?Gx)as=n&6WLqGNWpzy-!uiOdZWMdRToEa56Kc))ge4*;Zm!`GD~BZdGArLpmLSMYoE@xa^r(6P z0wa7Cq~I2b72Mtcoax{i!`8+dl^Z@Sa}5`!9Y*9sK`3c~%SUSiZ-E_fIeh(=m&@V) zcN{K(NhELxr#2<M!zNf3Ay2pp#GIvm3O zxPZw50|+oOJ#5S~0Jvbrw%{z-u=h#r==}Da1_y$|S3wsP{(|coeNBBG^y)R-rjwvy z*aILjtbAw+COBEu4m-nmx(K~aXfMkSPUAr*UD)28qz31(VX5I^dQt;@>v}r3o?eJ= z(d;}P&P&Xf)_?i?-?QM1{)cy8W3H{0#2!#J`cDU?|6&p<>aNzUB(V>xBan?o8w@Aa zD;6Z;xL9AkhW@TQBQKo9o8;+d;@jfS#D5UiPb}OGCL3e^$&D65;;FFR#{_X7-{ zQjr_de{+9Ls|Bl|!z#`Ai2VCwWc69%yBfVlYAb&v?&qbppH%+hJ9e`xdV2L~I8xNF z`HqwRTjlrXhLJ+&9v3^%IhJrKz{#9D^U3_UIPJHMk9|Bp?i2^S(M|V1YLr^_zkoo-w zn+8*hUa4GyyX_o-6Nv|K&V-1h_8l0KqII4;>oFZ+rwtb^W2aG4%;$|#HgE1yc8wWD zC6mr)%K5aFEACXRF+)ig%yQ9E%&bx{3TA1KVwp-hpEomU%W(X}onFo?D!a^bepE4b zXAEOh*ynSFoF!tq<%zep`Fh;Ir_^76?%ma?CI4Wk^H4wwDYf8WsQchOiBQjrZShcFWyzzVS$|+A z5IXN430?3%0WuDVKfN^67Z3HsL*0WR1tx=&!BG2S%lwy?f=O~2570tDsZvn-u+eNd zz;3g}BLN96=_V}zo|?6QbWbxFykOCbTR^&ZF$hS2ee&EsbU*7Z_WuCK$?fK>7m(T) zp$Z@?T=j}I-^p(YfhDmAzRK}1E(A2T z4?sQyecUtNHq-*wTHsH#z;i9|pSHl?Xn~(Fwk?(70B)M^&1kpu4l~g zJ*`c^FHFmtpMjfTzMmAl}TTmAZr{^5lER7l^ z=;$eJ!(d#~Hzbo!4QvaRVpw6828MwN0 zMt8RbbX>!`NJ@Bf4#Y7yXV~!OmEnOe8rCXsZm=Q#Id}yAn-=(G7mn{lVSkce^`n`oxC#a;7;yBV0%P%Pw4ezaV~}3s<;~`S2~nkX{e2@V$KEfY7+~1$=j-hB z7Jn1q8spxJ2?H);co{$o^F_in$2j84N9>2Maoqbwx7iaH%veJo?zRRx=+irYJD)%1 zHU?es^rO&6pAUO*F~8u!MgAg>AwJ(5{{oLM_LFd<2!+cS$Y%VFbT|gv9l_2Fu91i@ z_%;kcndhx1`TUFXh@*JjJ_m5K z`rqXBPxJY>fAIbh^F{s5V&jxC{s}+J6T>?MeR$`inRo2~lKRjXn%^_% mc68_control, & + f_mc68_info => mc68_info, & + f_mc68_order => mc68_order + implicit none + + type, bind(C) :: mc68_control + integer(C_INT) :: f_array_in ! 0 is false, otherwise true + integer(C_INT) :: f_array_out! 0 is false, otherwise true + integer(C_INT) :: min_l_workspace + integer(C_INT) :: lp + integer(C_INT) :: wp + integer(C_INT) :: mp + integer(C_INT) :: nemin + integer(C_INT) :: print_level + integer(C_INT) :: row_full_thresh + integer(C_INT) :: row_search + end type mc68_control + + type, bind(C) :: mc68_info + integer(C_INT) :: flag + integer(C_INT) :: iostat + integer(C_INT) :: stat + integer(C_INT) :: out_range + integer(C_INT) :: duplicate + integer(C_INT) :: n_compressions + integer(C_INT) :: n_zero_eigs + integer(C_LONG) :: l_workspace + integer(C_INT) :: zb01_info + integer(C_INT) :: n_dense_rows + end type mc68_info +contains + subroutine copy_control_in(ccontrol, fcontrol, f_array_in, f_array_out, & + min_l_workspace) + type(mc68_control), intent(in) :: ccontrol + type(f_mc68_control), intent(out) :: fcontrol + logical, intent(out) :: f_array_in + logical, intent(out) :: f_array_out + integer, intent(out) :: min_l_workspace + + f_array_in = (ccontrol%f_array_in .ne. 0) + f_array_out = (ccontrol%f_array_out .ne. 0) + min_l_workspace = ccontrol%min_l_workspace + fcontrol%lp = ccontrol%lp + fcontrol%wp = ccontrol%wp + fcontrol%mp = ccontrol%mp + fcontrol%nemin = ccontrol%nemin + fcontrol%print_level = ccontrol%print_level + fcontrol%row_full_thresh = ccontrol%row_full_thresh + fcontrol%row_search = ccontrol%row_search + end subroutine copy_control_in + + subroutine copy_info_out(finfo, cinfo) + type(f_mc68_info), intent(in) :: finfo + type(mc68_info), intent(out) :: cinfo + + cinfo%flag = finfo%flag + cinfo%iostat = finfo%iostat + cinfo%stat = finfo%stat + cinfo%out_range = finfo%out_range + cinfo%duplicate = finfo%duplicate + cinfo%n_compressions = finfo%n_compressions + cinfo%n_zero_eigs = finfo%n_zero_eigs + cinfo%l_workspace = finfo%l_workspace + cinfo%zb01_info = finfo%zb01_info + cinfo%n_dense_rows = finfo%n_dense_rows + end subroutine copy_info_out +end module hsl_mc68_integer_ciface + +subroutine mc68_default_control_i(ccontrol) bind(C) + use hsl_mc68_integer_ciface + implicit none + + type(mc68_control), intent(out) :: ccontrol + + type(f_mc68_control) :: fcontrol + + ccontrol%f_array_in = 0 ! C array indexing for input + ccontrol%f_array_out = 0 ! C array indexing for output + ccontrol%min_l_workspace = 0 ! Equivalent to not present in Fortran + ccontrol%lp = fcontrol%lp + ccontrol%wp = fcontrol%wp + ccontrol%mp = fcontrol%mp + ccontrol%nemin = fcontrol%nemin + ccontrol%print_level = fcontrol%print_level + ccontrol%row_full_thresh = fcontrol%row_full_thresh + ccontrol%row_search = fcontrol%row_search +end subroutine mc68_default_control_i + +subroutine mc68_order_i(ord, n, cptr, crow, cperm, ccontrol, cinfo) bind(C) + use hsl_mc68_integer_ciface + implicit none + + integer(C_INT), value, intent(in) :: ord + integer(C_INT), value, intent(in) :: n + type(C_PTR), value, intent(in) :: cptr + type(C_PTR), value, intent(in) :: crow + type(C_PTR), value, intent(in) :: cperm + type(mc68_control), intent(in) :: ccontrol + type(mc68_info), intent(out) :: cinfo + + integer, dimension(:), pointer :: fptr + integer, dimension(:), allocatable, target :: fptr_alloc + integer, dimension(:), pointer :: frow + integer, dimension(:), allocatable, target :: frow_alloc + integer, dimension(:), pointer :: fperm + type(f_mc68_control) :: fcontrol + type(f_mc68_info) :: finfo + logical :: f_array_in, f_array_out + integer :: min_l_workspace + + ! Copy data in and associate pointers correctly + call copy_control_in(ccontrol, fcontrol, f_array_in, f_array_out, & + min_l_workspace) + call C_F_POINTER(cptr, fptr, shape = (/ n+1 /)) + if(.not.f_array_in) then + allocate(fptr_alloc(n+1)) + fptr_alloc(:) = fptr(:) + 1 + fptr => fptr_alloc + endif + call C_F_POINTER(crow, frow, shape = (/ fptr(n+1)-1 /)) + if(.not.f_array_in) then + allocate(frow_alloc(fptr(n+1)-1)) + frow_alloc(:) = frow(:) + 1 + frow => frow_alloc + endif + call C_F_POINTER(cperm, fperm, shape = (/ n /)) + + ! Call the Fortran routine + if(min_l_workspace.le.0) then + call f_mc68_order(ord, n, fptr, frow, fperm, fcontrol, finfo) + else + call f_mc68_order(ord, n, fptr, frow, fperm, fcontrol, finfo, & + min_l_workspace=min_l_workspace) + endif + + ! Adjust perm for C indexing + if(.not.f_array_out) then + ! Note: 2x2 pivoting are distinguished by negative values. However in + ! C zero is a valid index and we cannot distinguish between +/- 0. + ! Hence we do not offer 2x2 pivoting information if C indexing is + ! requested. + fperm(:) = abs(fperm(:)) - 1 + endif + + ! Copy information out to C structure + call copy_info_out(finfo, cinfo) +end subroutine mc68_order_i diff --git a/coinhsl/hsl_mc68/C/hsl_mc68i_ciface.lo b/coinhsl/hsl_mc68/C/hsl_mc68i_ciface.lo new file mode 100644 index 0000000..14c27ea --- /dev/null +++ b/coinhsl/hsl_mc68/C/hsl_mc68i_ciface.lo @@ -0,0 +1,12 @@ +# coinhsl/hsl_mc68/C/hsl_mc68i_ciface.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4.6 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/hsl_mc68i_ciface.o' + +# Name of the non-PIC object +non_pic_object=none + diff --git a/coinhsl/install-sh b/coinhsl/install-sh new file mode 100755 index 0000000..377bb86 --- /dev/null +++ b/coinhsl/install-sh @@ -0,0 +1,527 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2011-11-20.07; # UTC + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# 'make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +nl=' +' +IFS=" "" $nl" + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit=${DOITPROG-} +if test -z "$doit"; then + doit_exec=exec +else + doit_exec=$doit +fi + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_glob='?' +initialize_posix_glob=' + test "$posix_glob" != "?" || { + if (set -f) 2>/dev/null; then + posix_glob= + else + posix_glob=: + fi + } +' + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +no_target_directory= + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *' '* | *' +'* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) dst_arg=$2 + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + shift;; + + -T) no_target_directory=true;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call 'install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + do_exit='(exit $ret); exit $ret' + trap "ret=129; $do_exit" 1 + trap "ret=130; $do_exit" 2 + trap "ret=141; $do_exit" 13 + trap "ret=143; $do_exit" 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names problematic for 'test' and other utilities. + case $src in + -* | [=\(\)!]) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + dst=$dst_arg + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test -n "$no_target_directory"; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + # Prefer dirname, but fall back on a substitute if dirname fails. + dstdir=` + (dirname "$dst") 2>/dev/null || + expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$dst" : 'X\(//\)[^/]' \| \ + X"$dst" : 'X\(//\)$' \| \ + X"$dst" : 'X\(/\)' \| . 2>/dev/null || + echo X"$dst" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q' + ` + + test -d "$dstdir" + dstdir_status=$? + fi + fi + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + + if (umask $mkdir_umask && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + ls_ld_tmpdir=`ls -ld "$tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/d" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + [-=\(\)!]*) prefix='./';; + *) prefix='';; + esac + + eval "$initialize_posix_glob" + + oIFS=$IFS + IFS=/ + $posix_glob set -f + set fnord $dstdir + shift + $posix_glob set +f + IFS=$oIFS + + prefixes= + + for d + do + test X"$d" = X && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + + eval "$initialize_posix_glob" && + $posix_glob set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + $posix_glob set +f && + + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/coinhsl/libcoinhsl.sym b/coinhsl/libcoinhsl.sym new file mode 100644 index 0000000..d93f704 --- /dev/null +++ b/coinhsl/libcoinhsl.sym @@ -0,0 +1,58 @@ +dump_mat_ +dump_mat_csc_ +ma27ad_ +ma27bd_ +ma27cd_ +ma27id_ +ma28ad_ +ma28bd_ +ma28cd_ +ma28id_ +ma57ad_ +ma57bd_ +ma57cd_ +ma57dd_ +ma57ed_ +ma57id_ +ma77_alter_d +ma77_analyse_d +ma77_default_control_d +ma77_enquire_indef_d +ma77_enquire_posdef_d +ma77_factor_d +ma77_factor_solve_d +ma77_finalise_d +ma77_input_reals_d +ma77_input_vars_d +ma77_lmultiply_d +ma77_open_d +ma77_open_nelt_d +ma77_resid_d +ma77_restart_d +ma77_scale_d +ma77_solve_d +ma77_solve_fredholm_d +ma86_analyse_d +ma86_default_control_d +ma86_factor_d +ma86_factor_solve_d +ma86_finalise_d +ma86_solve_d +ma97_alter_d +ma97_analyse_coord_d +ma97_analyse_d +ma97_default_control_d +ma97_enquire_indef_d +ma97_enquire_posdef_d +ma97_factor_d +ma97_factor_solve_d +ma97_finalise_d +ma97_free_akeep_d +ma97_free_fkeep_d +ma97_lmultiply_d +ma97_solve_d +ma97_solve_fredholm_d +ma97_sparse_fwd_solve_d +mc19ad_ +mc68_default_control_i +mc68_order_i diff --git a/coinhsl/loadmetis/loadmetis.c b/coinhsl/loadmetis/loadmetis.c new file mode 100644 index 0000000..5019a6c --- /dev/null +++ b/coinhsl/loadmetis/loadmetis.c @@ -0,0 +1,53 @@ +/* + * This file will load symbols dynamically from shared libraries + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#ifdef HAVE_WINDOWS_H +#include +#define LOADLIB LoadLibrary +#define LOADSYM GetProcAddress +#define SHLIBEXT "dll" +#else +#include +#define LOADLIB(X) dlopen(X, RTLD_NOW) +#define LOADSYM dlsym +#define SHLIBEXT "so" +#endif + +#define METISLIB "libmetis." SHLIBEXT +#define BLASLIB "libblas." SHLIBEXT + +typedef void (*METIS_NodeND_t) (int *nvtxs, int *xadj, int *adjncy, + int *numflag, int *options, int *perm, int *iperm); + +void *METIS_handle=NULL; +static METIS_NodeND_t func_METIS_NodeND=NULL; + +void metis_nodend_(int *nvtxs, int *xadj, int *adjncy, int *numflag, + int *options, int *perm, int *iperm) { + if(!func_METIS_NodeND) { + if(!METIS_handle) { + METIS_handle = LOADLIB(METISLIB); + if(!METIS_handle) { + printf("Failed to load '%s' - using fallback AMD code\n", METISLIB); + //printf("%s\n", dlerror()); + perm[0]=-1; + return; + } + } + func_METIS_NodeND = LOADSYM(METIS_handle, "METIS_NodeND"); + if(!func_METIS_NodeND) { + printf("Failed to retrieve symbol from '%s' - using fallback AMD code\n", METISLIB); + perm[0]=-1; + return; + } + } + func_METIS_NodeND(nvtxs, xadj, adjncy, numflag, options, perm, iperm); +} diff --git a/coinhsl/ltmain.sh b/coinhsl/ltmain.sh new file mode 100644 index 0000000..a356aca --- /dev/null +++ b/coinhsl/ltmain.sh @@ -0,0 +1,9661 @@ + +# libtool (GNU libtool) 2.4.2 +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, +# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, +# or obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# Usage: $progname [OPTION]... [MODE-ARG]... +# +# Provide generalized library-building support services. +# +# --config show all configuration variables +# --debug enable verbose shell tracing +# -n, --dry-run display commands without modifying any files +# --features display basic configuration information and exit +# --mode=MODE use operation mode MODE +# --preserve-dup-deps don't remove duplicate dependency libraries +# --quiet, --silent don't print informational messages +# --no-quiet, --no-silent +# print informational messages (default) +# --no-warn don't display warning messages +# --tag=TAG use configuration variables from tag TAG +# -v, --verbose print more informational messages than default +# --no-verbose don't print the extra informational messages +# --version print version information +# -h, --help, --help-all print short, long, or detailed help message +# +# MODE must be one of the following: +# +# clean remove files from the build directory +# compile compile a source file into a libtool object +# execute automatically set library path, then run a program +# finish complete the installation of libtool libraries +# install install libraries or executables +# link create a library or an executable +# uninstall remove libraries from an installed directory +# +# MODE-ARGS vary depending on the MODE. When passed as first option, +# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. +# Try `$progname --help --mode=MODE' for a more detailed description of MODE. +# +# When reporting a bug, please describe a test case to reproduce it and +# include the following information: +# +# host-triplet: $host +# shell: $SHELL +# compiler: $LTCC +# compiler flags: $LTCFLAGS +# linker: $LD (gnu? $with_gnu_ld) +# $progname: (GNU libtool) 2.4.2 Debian-2.4.2-1.7ubuntu1 +# automake: $automake_version +# autoconf: $autoconf_version +# +# Report bugs to . +# GNU libtool home page: . +# General help using GNU software: . + +PROGRAM=libtool +PACKAGE=libtool +VERSION="2.4.2 Debian-2.4.2-1.7ubuntu1" +TIMESTAMP="" +package_revision=1.3337 + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# NLS nuisances: We save the old values to restore during execute mode. +lt_user_locale= +lt_safe_locale= +for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test \"\${$lt_var+set}\" = set; then + save_$lt_var=\$$lt_var + $lt_var=C + export $lt_var + lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" + lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" + fi" +done +LC_ALL=C +LANGUAGE=C +export LANGUAGE LC_ALL + +$lt_unset CDPATH + + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath="$0" + + + +: ${CP="cp -f"} +test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} +: ${Xsed="$SED -e 1s/^X//"} + +# Global variables: +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +exit_status=$EXIT_SUCCESS + +# Make sure IFS has a sensible default +lt_nl=' +' +IFS=" $lt_nl" + +dirname="s,/[^/]*$,," +basename="s,^.*/,," + +# func_dirname file append nondir_replacement +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +func_dirname () +{ + func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi +} # func_dirname may be replaced by extended shell implementation + + +# func_basename file +func_basename () +{ + func_basename_result=`$ECHO "${1}" | $SED "$basename"` +} # func_basename may be replaced by extended shell implementation + + +# func_dirname_and_basename file append nondir_replacement +# perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# Implementation must be kept synchronized with func_dirname +# and func_basename. For efficiency, we do not delegate to +# those functions but instead duplicate the functionality here. +func_dirname_and_basename () +{ + # Extract subdirectory from the argument. + func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi + func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` +} # func_dirname_and_basename may be replaced by extended shell implementation + + +# func_stripname prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# func_strip_suffix prefix name +func_stripname () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + esac +} # func_stripname may be replaced by extended shell implementation + + +# These SED scripts presuppose an absolute path with a trailing slash. +pathcar='s,^/\([^/]*\).*$,\1,' +pathcdr='s,^/[^/]*,,' +removedotparts=':dotsl + s@/\./@/@g + t dotsl + s,/\.$,/,' +collapseslashes='s@/\{1,\}@/@g' +finalslash='s,/*$,/,' + +# func_normal_abspath PATH +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +# value returned in "$func_normal_abspath_result" +func_normal_abspath () +{ + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` + while :; do + # Processed it all yet? + if test "$func_normal_abspath_tpath" = / ; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result" ; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result +} + +# func_relative_path SRCDIR DSTDIR +# generates a relative path from SRCDIR to DSTDIR, with a trailing +# slash if non-empty, suitable for immediately appending a filename +# without needing to append a separator. +# value returned in "$func_relative_path_result" +func_relative_path () +{ + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=${func_dirname_result} + if test "x$func_relative_path_tlibdir" = x ; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done + + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test "x$func_stripname_result" != x ; then + func_relative_path_result=${func_relative_path_result}/${func_stripname_result} + fi + + # Normalisation. If bindir is libdir, return empty string, + # else relative path ending with a slash; either way, target + # file name can be directly appended. + if test ! -z "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result/" + func_relative_path_result=$func_stripname_result + fi +} + +# The name of this program: +func_dirname_and_basename "$progpath" +progname=$func_basename_result + +# Make sure we have an absolute path for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=$func_dirname_result + progdir=`cd "$progdir" && pwd` + progpath="$progdir/$progname" + ;; + *) + save_IFS="$IFS" + IFS=${PATH_SEPARATOR-:} + for progdir in $PATH; do + IFS="$save_IFS" + test -x "$progdir/$progname" && break + done + IFS="$save_IFS" + test -n "$progdir" || progdir=`pwd` + progpath="$progdir/$progname" + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed="${SED}"' -e 1s/^X//' +sed_quote_subst='s/\([`"$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution that turns a string into a regex matching for the +# string literally. +sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' + +# Sed substitution that converts a w32 file name or path +# which contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-`\' parameter expansions in output of double_quote_subst that were +# `\'-ed in input to the same. If an odd number of `\' preceded a '$' +# in input to double_quote_subst, that '$' was protected from expansion. +# Since each input `\' is now two `\'s, look for any number of runs of +# four `\'s followed by two `\'s and then a '$'. `\' that '$'. +bs='\\' +bs2='\\\\' +bs4='\\\\\\\\' +dollar='\$' +sed_double_backslash="\ + s/$bs4/&\\ +/g + s/^$bs2$dollar/$bs&/ + s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g + s/\n//g" + +# Standard options: +opt_dry_run=false +opt_help=false +opt_quiet=false +opt_verbose=false +opt_warning=: + +# func_echo arg... +# Echo program name prefixed message, along with the current mode +# name if it has been set yet. +func_echo () +{ + $ECHO "$progname: ${opt_mode+$opt_mode: }$*" +} + +# func_verbose arg... +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $opt_verbose && func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +# func_error arg... +# Echo program name prefixed message to standard error. +func_error () +{ + $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 +} + +# func_warning arg... +# Echo program name prefixed warning message to standard error. +func_warning () +{ + $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 + + # bash bug again: + : +} + +# func_fatal_error arg... +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + +# func_fatal_help arg... +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + func_error ${1+"$@"} + func_fatal_error "$help" +} +help="Try \`$progname --help' for more information." ## default + + +# func_grep expression filename +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_mkdir_p directory-path +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + my_directory_path="$1" + my_dir_list= + + if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then + + # Protect directory names starting with `-' + case $my_directory_path in + -*) my_directory_path="./$my_directory_path" ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$my_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + my_dir_list="$my_directory_path:$my_dir_list" + + # If the last portion added has no slash in it, the list is done + case $my_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` + done + my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` + + save_mkdir_p_IFS="$IFS"; IFS=':' + for my_dir in $my_dir_list; do + IFS="$save_mkdir_p_IFS" + # mkdir can fail with a `File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$my_dir" 2>/dev/null || : + done + IFS="$save_mkdir_p_IFS" + + # Bail out if we (or some other process) failed to create a directory. + test -d "$my_directory_path" || \ + func_fatal_error "Failed to create \`$1'" + fi +} + + +# func_mktempdir [string] +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, STRING is the basename for that directory. +func_mktempdir () +{ + my_template="${TMPDIR-/tmp}/${1-$progname}" + + if test "$opt_dry_run" = ":"; then + # Return a directory name, but don't create it in dry-run mode + my_tmpdir="${my_template}-$$" + else + + # If mktemp works, use that first and foremost + my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` + + if test ! -d "$my_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + my_tmpdir="${my_template}-${RANDOM-0}$$" + + save_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$my_tmpdir" + umask $save_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$my_tmpdir" || \ + func_fatal_error "cannot create temporary directory \`$my_tmpdir'" + fi + + $ECHO "$my_tmpdir" +} + + +# func_quote_for_eval arg +# Aesthetically quote ARG to be evaled later. +# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT +# is double-quoted, suitable for a subsequent eval, whereas +# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters +# which are still active within double quotes backslashified. +func_quote_for_eval () +{ + case $1 in + *[\\\`\"\$]*) + func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; + *) + func_quote_for_eval_unquoted_result="$1" ;; + esac + + case $func_quote_for_eval_unquoted_result in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and and variable + # expansion for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" + ;; + *) + func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" + esac +} + + +# func_quote_for_expand arg +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + case $1 in + *[\\\`\"]*) + my_arg=`$ECHO "$1" | $SED \ + -e "$double_quote_subst" -e "$sed_double_backslash"` ;; + *) + my_arg="$1" ;; + esac + + case $my_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + my_arg="\"$my_arg\"" + ;; + esac + + func_quote_for_expand_result="$my_arg" +} + + +# func_show_eval cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$my_cmd" + my_status=$? + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + + +# func_show_eval_locale cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$lt_user_locale + $my_cmd" + my_status=$? + eval "$lt_safe_locale" + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + +# func_tr_sh +# Turn $1 into a string suitable for a shell variable name. +# Result is stored in $func_tr_sh_result. All characters +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, +# if $1 begins with a digit, a '_' is prepended as well. +func_tr_sh () +{ + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} + + +# func_version +# Echo version message to standard output and exit. +func_version () +{ + $opt_debug + + $SED -n '/(C)/!b go + :more + /\./!{ + N + s/\n# / / + b more + } + :go + /^# '$PROGRAM' (GNU /,/# warranty; / { + s/^# // + s/^# *$// + s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ + p + }' < "$progpath" + exit $? +} + +# func_usage +# Echo short help message to standard output and exit. +func_usage () +{ + $opt_debug + + $SED -n '/^# Usage:/,/^# *.*--help/ { + s/^# // + s/^# *$// + s/\$progname/'$progname'/ + p + }' < "$progpath" + echo + $ECHO "run \`$progname --help | more' for full usage" + exit $? +} + +# func_help [NOEXIT] +# Echo long help message to standard output and exit, +# unless 'noexit' is passed as argument. +func_help () +{ + $opt_debug + + $SED -n '/^# Usage:/,/# Report bugs to/ { + :print + s/^# // + s/^# *$// + s*\$progname*'$progname'* + s*\$host*'"$host"'* + s*\$SHELL*'"$SHELL"'* + s*\$LTCC*'"$LTCC"'* + s*\$LTCFLAGS*'"$LTCFLAGS"'* + s*\$LD*'"$LD"'* + s/\$with_gnu_ld/'"$with_gnu_ld"'/ + s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ + s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ + p + d + } + /^# .* home page:/b print + /^# General help using/b print + ' < "$progpath" + ret=$? + if test -z "$1"; then + exit $ret + fi +} + +# func_missing_arg argname +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + $opt_debug + + func_error "missing argument for $1." + exit_cmd=exit +} + + +# func_split_short_opt shortopt +# Set func_split_short_opt_name and func_split_short_opt_arg shell +# variables after splitting SHORTOPT after the 2nd character. +func_split_short_opt () +{ + my_sed_short_opt='1s/^\(..\).*$/\1/;q' + my_sed_short_rest='1s/^..\(.*\)$/\1/;q' + + func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` + func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` +} # func_split_short_opt may be replaced by extended shell implementation + + +# func_split_long_opt longopt +# Set func_split_long_opt_name and func_split_long_opt_arg shell +# variables after splitting LONGOPT at the `=' sign. +func_split_long_opt () +{ + my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' + my_sed_long_arg='1s/^--[^=]*=//' + + func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` + func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` +} # func_split_long_opt may be replaced by extended shell implementation + +exit_cmd=: + + + + + +magic="%%%MAGIC variable%%%" +magic_exe="%%%MAGIC EXE variable%%%" + +# Global variables. +nonopt= +preserve_args= +lo2o="s/\\.lo\$/.${objext}/" +o2lo="s/\\.${objext}\$/.lo/" +extracted_archives= +extracted_serial=0 + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "${1}=\$${1}\${2}" +} # func_append may be replaced by extended shell implementation + +# func_append_quoted var value +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +func_append_quoted () +{ + func_quote_for_eval "${2}" + eval "${1}=\$${1}\\ \$func_quote_for_eval_result" +} # func_append_quoted may be replaced by extended shell implementation + + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=`expr "${@}"` +} # func_arith may be replaced by extended shell implementation + + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` +} # func_len may be replaced by extended shell implementation + + +# func_lo2o object +func_lo2o () +{ + func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` +} # func_lo2o may be replaced by extended shell implementation + + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` +} # func_xform may be replaced by extended shell implementation + + +# func_fatal_configuration arg... +# Echo program name prefixed message to standard error, followed by +# a configuration failure hint, and exit. +func_fatal_configuration () +{ + func_error ${1+"$@"} + func_error "See the $PACKAGE documentation for more information." + func_fatal_error "Fatal configuration error." +} + + +# func_config +# Display the configuration for all the tags in this script. +func_config () +{ + re_begincf='^# ### BEGIN LIBTOOL' + re_endcf='^# ### END LIBTOOL' + + # Default configuration. + $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" + + # Now print the configurations for the tags. + for tagname in $taglist; do + $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" + done + + exit $? +} + +# func_features +# Display the features supported by this script. +func_features () +{ + echo "host: $host" + if test "$build_libtool_libs" = yes; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test "$build_old_libs" = yes; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + + exit $? +} + +# func_enable_tag tagname +# Verify that TAGNAME is valid, and either flag an error and exit, or +# enable the TAGNAME tag. We also add TAGNAME to the global $taglist +# variable here. +func_enable_tag () +{ + # Global variable: + tagname="$1" + + re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" + re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" + sed_extractcf="/$re_begincf/,/$re_endcf/p" + + # Validate tagname. + case $tagname in + *[!-_A-Za-z0-9,/]*) + func_fatal_error "invalid tag name: $tagname" + ;; + esac + + # Don't test for the "default" C tag, as we know it's + # there but not specially marked. + case $tagname in + CC) ;; + *) + if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + +# func_check_version_match +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +# Shorthand for --mode=foo, only valid as the first argument +case $1 in +clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; +compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; +execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; +finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; +install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; +link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; +uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; +esac + + + +# Option defaults: +opt_debug=: +opt_dry_run=false +opt_config=false +opt_preserve_dup_deps=false +opt_features=false +opt_finish=false +opt_help=false +opt_help_all=false +opt_silent=: +opt_warning=: +opt_verbose=: +opt_silent=false +opt_verbose=false + + +# Parse options once, thoroughly. This comes as soon as possible in the +# script to make things like `--version' happen as quickly as we can. +{ + # this just eases exit handling + while test $# -gt 0; do + opt="$1" + shift + case $opt in + --debug|-x) opt_debug='set -x' + func_echo "enabling shell trace mode" + $opt_debug + ;; + --dry-run|--dryrun|-n) + opt_dry_run=: + ;; + --config) + opt_config=: +func_config + ;; + --dlopen|-dlopen) + optarg="$1" + opt_dlopen="${opt_dlopen+$opt_dlopen +}$optarg" + shift + ;; + --preserve-dup-deps) + opt_preserve_dup_deps=: + ;; + --features) + opt_features=: +func_features + ;; + --finish) + opt_finish=: +set dummy --mode finish ${1+"$@"}; shift + ;; + --help) + opt_help=: + ;; + --help-all) + opt_help_all=: +opt_help=': help-all' + ;; + --mode) + test $# = 0 && func_missing_arg $opt && break + optarg="$1" + opt_mode="$optarg" +case $optarg in + # Valid mode arguments: + clean|compile|execute|finish|install|link|relink|uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $opt" + exit_cmd=exit + break + ;; +esac + shift + ;; + --no-silent|--no-quiet) + opt_silent=false +func_append preserve_args " $opt" + ;; + --no-warning|--no-warn) + opt_warning=false +func_append preserve_args " $opt" + ;; + --no-verbose) + opt_verbose=false +func_append preserve_args " $opt" + ;; + --silent|--quiet) + opt_silent=: +func_append preserve_args " $opt" + opt_verbose=false + ;; + --verbose|-v) + opt_verbose=: +func_append preserve_args " $opt" +opt_silent=false + ;; + --tag) + test $# = 0 && func_missing_arg $opt && break + optarg="$1" + opt_tag="$optarg" +func_append preserve_args " $opt $optarg" +func_enable_tag "$optarg" + shift + ;; + + -\?|-h) func_usage ;; + --help) func_help ;; + --version) func_version ;; + + # Separate optargs to long options: + --*=*) + func_split_long_opt "$opt" + set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-n*|-v*) + func_split_short_opt "$opt" + set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) break ;; + -*) func_fatal_help "unrecognized option \`$opt'" ;; + *) set dummy "$opt" ${1+"$@"}; shift; break ;; + esac + done + + # Validate options: + + # save first non-option argument + if test "$#" -gt 0; then + nonopt="$opt" + shift + fi + + # preserve --debug + test "$opt_debug" = : || func_append preserve_args " --debug" + + case $host in + *cygwin* | *mingw* | *pw32* | *cegcc*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps + ;; + esac + + $opt_help || { + # Sanity checks first: + func_check_version_match + + if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then + func_fatal_configuration "not configured to build any kind of library" + fi + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test "$opt_mode" != execute; then + func_error "unrecognized option \`-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$progname --help --mode=$opt_mode' for more information." + } + + + # Bail if the options were screwed + $exit_cmd $EXIT_FAILURE +} + + + + +## ----------- ## +## Main. ## +## ----------- ## + +# func_lalib_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null \ + | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if `file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case "$lalib_p_line" in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test "$lalib_p" = yes +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + func_lalib_p "$1" +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $opt_debug + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$save_ifs + eval cmd=\"$cmd\" + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# `FILE.' does not work on cygwin managed mounts. +func_source () +{ + $opt_debug + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_resolve_sysroot PATH +# Replace a leading = in PATH with a sysroot. Store the result into +# func_resolve_sysroot_result +func_resolve_sysroot () +{ + func_resolve_sysroot_result=$1 + case $func_resolve_sysroot_result in + =*) + func_stripname '=' '' "$func_resolve_sysroot_result" + func_resolve_sysroot_result=$lt_sysroot$func_stripname_result + ;; + esac +} + +# func_replace_sysroot PATH +# If PATH begins with the sysroot, replace it with = and +# store the result into func_replace_sysroot_result. +func_replace_sysroot () +{ + case "$lt_sysroot:$1" in + ?*:"$lt_sysroot"*) + func_stripname "$lt_sysroot" '' "$1" + func_replace_sysroot_result="=$func_stripname_result" + ;; + *) + # Including no sysroot. + func_replace_sysroot_result=$1 + ;; + esac +} + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $opt_debug + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case "$@ " in + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with \`--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=${1} + if test "$build_libtool_libs" = yes; then + write_lobj=\'${2}\' + else + write_lobj=none + fi + + if test "$build_old_libs" = yes; then + write_oldobj=\'${3}\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T </dev/null` + if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then + func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | + $SED -e "$lt_sed_naive_backslashify"` + else + func_convert_core_file_wine_to_w32_result= + fi + fi +} +# end: func_convert_core_file_wine_to_w32 + + +# func_convert_core_path_wine_to_w32 ARG +# Helper function used by path conversion functions when $build is *nix, and +# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly +# configured wine environment available, with the winepath program in $build's +# $PATH. Assumes ARG has no leading or trailing path separator characters. +# +# ARG is path to be converted from $build format to win32. +# Result is available in $func_convert_core_path_wine_to_w32_result. +# Unconvertible file (directory) names in ARG are skipped; if no directory names +# are convertible, then the result may be empty. +func_convert_core_path_wine_to_w32 () +{ + $opt_debug + # unfortunately, winepath doesn't convert paths, only file names + func_convert_core_path_wine_to_w32_result="" + if test -n "$1"; then + oldIFS=$IFS + IFS=: + for func_convert_core_path_wine_to_w32_f in $1; do + IFS=$oldIFS + func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" + if test -n "$func_convert_core_file_wine_to_w32_result" ; then + if test -z "$func_convert_core_path_wine_to_w32_result"; then + func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" + else + func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" + fi + fi + done + IFS=$oldIFS + fi +} +# end: func_convert_core_path_wine_to_w32 + + +# func_cygpath ARGS... +# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when +# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) +# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or +# (2), returns the Cygwin file name or path in func_cygpath_result (input +# file name or path is assumed to be in w32 format, as previously converted +# from $build's *nix or MSYS format). In case (3), returns the w32 file name +# or path in func_cygpath_result (input file name or path is assumed to be in +# Cygwin format). Returns an empty string on error. +# +# ARGS are passed to cygpath, with the last one being the file name or path to +# be converted. +# +# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH +# environment variable; do not put it in $PATH. +func_cygpath () +{ + $opt_debug + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then + func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` + if test "$?" -ne 0; then + # on failure, ensure result is empty + func_cygpath_result= + fi + else + func_cygpath_result= + func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" + fi +} +#end: func_cygpath + + +# func_convert_core_msys_to_w32 ARG +# Convert file name or path ARG from MSYS format to w32 format. Return +# result in func_convert_core_msys_to_w32_result. +func_convert_core_msys_to_w32 () +{ + $opt_debug + # awkward: cmd appends spaces to result + func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` +} +#end: func_convert_core_msys_to_w32 + + +# func_convert_file_check ARG1 ARG2 +# Verify that ARG1 (a file name in $build format) was converted to $host +# format in ARG2. Otherwise, emit an error message, but continue (resetting +# func_to_host_file_result to ARG1). +func_convert_file_check () +{ + $opt_debug + if test -z "$2" && test -n "$1" ; then + func_error "Could not determine host file name corresponding to" + func_error " \`$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_file_result="$1" + fi +} +# end func_convert_file_check + + +# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH +# Verify that FROM_PATH (a path in $build format) was converted to $host +# format in TO_PATH. Otherwise, emit an error message, but continue, resetting +# func_to_host_file_result to a simplistic fallback value (see below). +func_convert_path_check () +{ + $opt_debug + if test -z "$4" && test -n "$3"; then + func_error "Could not determine the host path corresponding to" + func_error " \`$3'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This is a deliberately simplistic "conversion" and + # should not be "improved". See libtool.info. + if test "x$1" != "x$2"; then + lt_replace_pathsep_chars="s|$1|$2|g" + func_to_host_path_result=`echo "$3" | + $SED -e "$lt_replace_pathsep_chars"` + else + func_to_host_path_result="$3" + fi + fi +} +# end func_convert_path_check + + +# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG +# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT +# and appending REPL if ORIG matches BACKPAT. +func_convert_path_front_back_pathsep () +{ + $opt_debug + case $4 in + $1 ) func_to_host_path_result="$3$func_to_host_path_result" + ;; + esac + case $4 in + $2 ) func_append func_to_host_path_result "$3" + ;; + esac +} +# end func_convert_path_front_back_pathsep + + +################################################## +# $build to $host FILE NAME CONVERSION FUNCTIONS # +################################################## +# invoked via `$to_host_file_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# Result will be available in $func_to_host_file_result. + + +# func_to_host_file ARG +# Converts the file name ARG from $build format to $host format. Return result +# in func_to_host_file_result. +func_to_host_file () +{ + $opt_debug + $to_host_file_cmd "$1" +} +# end func_to_host_file + + +# func_to_tool_file ARG LAZY +# converts the file name ARG from $build format to toolchain format. Return +# result in func_to_tool_file_result. If the conversion in use is listed +# in (the comma separated) LAZY, no conversion takes place. +func_to_tool_file () +{ + $opt_debug + case ,$2, in + *,"$to_tool_file_cmd",*) + func_to_tool_file_result=$1 + ;; + *) + $to_tool_file_cmd "$1" + func_to_tool_file_result=$func_to_host_file_result + ;; + esac +} +# end func_to_tool_file + + +# func_convert_file_noop ARG +# Copy ARG to func_to_host_file_result. +func_convert_file_noop () +{ + func_to_host_file_result="$1" +} +# end func_convert_file_noop + + +# func_convert_file_msys_to_w32 ARG +# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_file_result. +func_convert_file_msys_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_to_host_file_result="$func_convert_core_msys_to_w32_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_w32 + + +# func_convert_file_cygwin_to_w32 ARG +# Convert file name ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_file_cygwin_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + # because $build is cygwin, we call "the" cygpath in $PATH; no need to use + # LT_CYGPATH in this case. + func_to_host_file_result=`cygpath -m "$1"` + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_cygwin_to_w32 + + +# func_convert_file_nix_to_w32 ARG +# Convert file name ARG from *nix to w32 format. Requires a wine environment +# and a working winepath. Returns result in func_to_host_file_result. +func_convert_file_nix_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_file_wine_to_w32 "$1" + func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_w32 + + +# func_convert_file_msys_to_cygwin ARG +# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_file_msys_to_cygwin () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_cygpath -u "$func_convert_core_msys_to_w32_result" + func_to_host_file_result="$func_cygpath_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_cygwin + + +# func_convert_file_nix_to_cygwin ARG +# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed +# in a wine environment, working winepath, and LT_CYGPATH set. Returns result +# in func_to_host_file_result. +func_convert_file_nix_to_cygwin () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. + func_convert_core_file_wine_to_w32 "$1" + func_cygpath -u "$func_convert_core_file_wine_to_w32_result" + func_to_host_file_result="$func_cygpath_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_cygwin + + +############################################# +# $build to $host PATH CONVERSION FUNCTIONS # +############################################# +# invoked via `$to_host_path_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# The result will be available in $func_to_host_path_result. +# +# Path separators are also converted from $build format to $host format. If +# ARG begins or ends with a path separator character, it is preserved (but +# converted to $host format) on output. +# +# All path conversion functions are named using the following convention: +# file name conversion function : func_convert_file_X_to_Y () +# path conversion function : func_convert_path_X_to_Y () +# where, for any given $build/$host combination the 'X_to_Y' value is the +# same. If conversion functions are added for new $build/$host combinations, +# the two new functions must follow this pattern, or func_init_to_host_path_cmd +# will break. + + +# func_init_to_host_path_cmd +# Ensures that function "pointer" variable $to_host_path_cmd is set to the +# appropriate value, based on the value of $to_host_file_cmd. +to_host_path_cmd= +func_init_to_host_path_cmd () +{ + $opt_debug + if test -z "$to_host_path_cmd"; then + func_stripname 'func_convert_file_' '' "$to_host_file_cmd" + to_host_path_cmd="func_convert_path_${func_stripname_result}" + fi +} + + +# func_to_host_path ARG +# Converts the path ARG from $build format to $host format. Return result +# in func_to_host_path_result. +func_to_host_path () +{ + $opt_debug + func_init_to_host_path_cmd + $to_host_path_cmd "$1" +} +# end func_to_host_path + + +# func_convert_path_noop ARG +# Copy ARG to func_to_host_path_result. +func_convert_path_noop () +{ + func_to_host_path_result="$1" +} +# end func_convert_path_noop + + +# func_convert_path_msys_to_w32 ARG +# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_path_result. +func_convert_path_msys_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # Remove leading and trailing path separator characters from ARG. MSYS + # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; + # and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result="$func_convert_core_msys_to_w32_result" + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_msys_to_w32 + + +# func_convert_path_cygwin_to_w32 ARG +# Convert path ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_path_cygwin_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_cygwin_to_w32 + + +# func_convert_path_nix_to_w32 ARG +# Convert path ARG from *nix to w32 format. Requires a wine environment and +# a working winepath. Returns result in func_to_host_file_result. +func_convert_path_nix_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_nix_to_w32 + + +# func_convert_path_msys_to_cygwin ARG +# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_path_msys_to_cygwin () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_msys_to_w32_result" + func_to_host_path_result="$func_cygpath_result" + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_msys_to_cygwin + + +# func_convert_path_nix_to_cygwin ARG +# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a +# a wine environment, working winepath, and LT_CYGPATH set. Returns result in +# func_to_host_file_result. +func_convert_path_nix_to_cygwin () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" + func_to_host_path_result="$func_cygpath_result" + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_nix_to_cygwin + + +# func_mode_compile arg... +func_mode_compile () +{ + $opt_debug + # Get the compilation command and the source file. + base_compile= + srcfile="$nonopt" # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + pie_flag= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg="$arg" + arg_mode=normal + ;; + + target ) + libobj="$arg" + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + test -n "$libobj" && \ + func_fatal_error "you cannot specify \`-o' more than once" + arg_mode=target + continue + ;; + + -pie | -fpie | -fPIE) + func_append pie_flag " $arg" + continue + ;; + + -shared | -static | -prefer-pic | -prefer-non-pic) + func_append later " $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + lastarg= + save_ifs="$IFS"; IFS=',' + for arg in $args; do + IFS="$save_ifs" + func_append_quoted lastarg "$arg" + done + IFS="$save_ifs" + func_stripname ' ' '' "$lastarg" + lastarg=$func_stripname_result + + # Add the arguments to base_compile. + func_append base_compile " $lastarg" + continue + ;; + + *) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg="$srcfile" + srcfile="$arg" + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + func_append_quoted base_compile "$lastarg" + done # for arg + + case $arg_mode in + arg) + func_fatal_error "you must specify an argument for -Xcompile" + ;; + target) + func_fatal_error "you must specify a target with \`-o'" + ;; + *) + # Get the name of the library object. + test -z "$libobj" && { + func_basename "$srcfile" + libobj="$func_basename_result" + } + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + case $libobj in + *.[cCFSifmso] | \ + *.ada | *.adb | *.ads | *.asm | \ + *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ + *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) + func_xform "$libobj" + libobj=$func_xform_result + ;; + esac + + case $libobj in + *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; + *) + func_fatal_error "cannot determine name of library object from \`$libobj'" + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -shared) + test "$build_libtool_libs" != yes && \ + func_fatal_configuration "can not build a shared library" + build_old_libs=no + continue + ;; + + -static) + build_libtool_libs=no + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + func_quote_for_eval "$libobj" + test "X$libobj" != "X$func_quote_for_eval_result" \ + && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && func_warning "libobj name \`$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname="$func_basename_result" + xdir="$func_dirname_result" + lobj=${xdir}$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test "$compiler_c_o" = no; then + output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test "$need_locks" = yes; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + $ECHO "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + func_append removelist " $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + func_append removelist " $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 + srcfile=$func_to_tool_file_result + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # Only build a PIC object if we are building libtool libraries. + if test "$build_libtool_libs" = yes; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test "$pic_mode" != no; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + func_append command " -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test "$suppress_opt" = yes; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test "$build_old_libs" = yes; then + if test "$pic_mode" != yes; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test "$compiler_c_o" = yes; then + func_append command " -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + func_append command "$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test "$need_locks" != no; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { + test "$opt_mode" = compile && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $opt_mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $ECHO \ +"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to build PIC objects only + -prefer-non-pic try to build non-PIC objects only + -shared do not build a \`.o' file suitable for static linking + -static only build a \`.o' file suitable for static linking + -Wc,FLAG pass FLAG directly to the compiler + +COMPILE-COMMAND is a command to be used in creating a \`standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix \`.c' with the +library object suffix, \`.lo'." + ;; + + execute) + $ECHO \ +"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to \`-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $ECHO \ +"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the \`--dry-run' option if you just want to see what would be executed." + ;; + + install) + $ECHO \ +"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the \`install' or \`cp' program. + +The following components of INSTALL-COMMAND are treated specially: + + -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -bindir BINDIR specify path to binaries directory (for systems where + libraries must be found in the PATH setting at runtime) + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE Use a list of object files found in FILE to specify objects + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + -Wc,FLAG + -Xcompiler FLAG pass linker-specific FLAG directly to the compiler + -Wl,FLAG + -Xlinker FLAG pass linker-specific FLAG directly to the linker + -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) + +All other options (arguments beginning with \`-') are ignored. + +Every other argument is treated as a filename. Files ending in \`.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +only library objects (\`.lo' files) may be specified, and \`-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +is created, otherwise an executable program is created." + ;; + + uninstall) + $ECHO \ +"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + + *) + func_fatal_help "invalid operation mode \`$opt_mode'" + ;; + esac + + echo + $ECHO "Try \`$progname --help' for more information about other modes." +} + +# Now that we've collected a possible --mode arg, show help if necessary +if $opt_help; then + if test "$opt_help" = :; then + func_mode_help + else + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + func_mode_help + done + } | sed -n '1p; 2,$s/^Usage:/ or: /p' + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + echo + func_mode_help + done + } | + sed '1d + /^When reporting/,/^Report/{ + H + d + } + $x + /information about other modes/d + /more detailed .*MODE/d + s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' + fi + exit $? +fi + + +# func_mode_execute arg... +func_mode_execute () +{ + $opt_debug + # The first argument is the command name. + cmd="$nonopt" + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $opt_dlopen; do + test -f "$file" \ + || func_fatal_help "\`$file' is not a file" + + dir= + case $file in + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "\`$file' was not linked with \`-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir="$func_dirname_result" + + if test -f "$dir/$objdir/$dlname"; then + func_append dir "/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir="$func_dirname_result" + ;; + + *) + func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -* | *.la | *.lo ) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file="$progdir/$program" + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_append_quoted args "$file" + done + + if test "X$opt_dry_run" = Xfalse; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" + echo "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + fi +} + +test "$opt_mode" = execute && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $opt_debug + libs= + libdirs= + admincmds= + + for opt in "$nonopt" ${1+"$@"} + do + if test -d "$opt"; then + func_append libdirs " $opt" + + elif test -f "$opt"; then + if func_lalib_unsafe_p "$opt"; then + func_append libs " $opt" + else + func_warning "\`$opt' is not a valid libtool archive" + fi + + else + func_fatal_error "invalid argument \`$opt'" + fi + done + + if test -n "$libs"; then + if test -n "$lt_sysroot"; then + sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` + sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" + else + sysroot_cmd= + fi + + # Remove sysroot references + if $opt_dry_run; then + for lib in $libs; do + echo "removing references to $lt_sysroot and \`=' prefixes from $lib" + done + else + tmpdir=`func_mktempdir` + for lib in $libs; do + sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ + > $tmpdir/tmp-la + mv -f $tmpdir/tmp-la $lib + done + ${RM}r "$tmpdir" + fi + fi + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || func_append admincmds " + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_silent && exit $EXIT_SUCCESS + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use the \`-LLIBDIR'" + echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + echo " - add LIBDIR to the \`$shlibpath_var' environment variable" + echo " during execution" + fi + if test -n "$runpath_var"; then + echo " - add LIBDIR to the \`$runpath_var' environment variable" + echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the \`$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + fi + echo + + echo "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" + echo "pages." + ;; + *) + echo "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + echo "----------------------------------------------------------------------" + fi + exit $EXIT_SUCCESS +} + +test "$opt_mode" = finish && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $opt_debug + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. + case $nonopt in *shtool*) :;; *) false;; esac; then + # Aesthetically quote it. + func_quote_for_eval "$nonopt" + install_prog="$func_quote_for_eval_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_for_eval "$arg" + func_append install_prog "$func_quote_for_eval_result" + install_shared_prog=$install_prog + case " $install_prog " in + *[\\\ /]cp\ *) install_cp=: ;; + *) install_cp=false ;; + esac + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + no_mode=: + for arg + do + arg2= + if test -n "$dest"; then + func_append files " $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) + if $install_cp; then :; else + prev=$arg + fi + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + if test "x$prev" = x-m && test -n "$install_override_mode"; then + arg2=$install_override_mode + no_mode=false + fi + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + func_append install_prog " $func_quote_for_eval_result" + if test -n "$arg2"; then + func_quote_for_eval "$arg2" + fi + func_append install_shared_prog " $func_quote_for_eval_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the \`$prev' option requires an argument" + + if test -n "$install_override_mode" && $no_mode; then + if $install_cp; then :; else + func_quote_for_eval "$install_override_mode" + func_append install_shared_prog " -m $func_quote_for_eval_result" + fi + fi + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir="$func_dirname_result" + destname="$func_basename_result" + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "\`$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "\`$destdir' must be an absolute directory name" + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + func_append staticlibs " $file" + ;; + + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) func_append current_libdirs " $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) func_append future_libdirs " $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir="$func_dirname_result" + func_append dir "$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking \`$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname="$1" + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. + func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme="$stripme" + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme="" + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try `ln -sf' first, because the `ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name="$func_basename_result" + instname="$dir/$name"i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && func_append staticlibs " $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest="$destfile" + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to \`$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext="" + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=".exe" + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script \`$wrapper'" + + finalize=yes + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "\`$lib' has not been installed in \`$libdir'" + finalize=no + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + $opt_dry_run || { + if test "$finalize" = yes; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file="$func_basename_result" + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_silent || { + func_quote_for_expand "$relink_command" + eval "func_echo $func_quote_for_expand_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink \`$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file="$outputname" + else + func_warning "cannot relink \`$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name="$func_basename_result" + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $tool_oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run \`$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test "$opt_mode" = install && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $opt_debug + my_outputname="$1" + my_originator="$2" + my_pic_p="${3-no}" + my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms="${my_outputname}S.c" + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${my_outputname}.nm" + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" +#endif + +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + func_verbose "generating symbol list for \`$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_to_tool_file "$progfile" func_convert_file_msys_to_w32 + func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" + $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$outputname.exp" + $opt_dry_run || { + $RM $export_symbols + eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from \`$dlprefile'" + func_basename "$dlprefile" + name="$func_basename_result" + case $host in + *cygwin* | *mingw* | *cegcc* ) + # if an import library, we need to obtain dlname + if func_win32_import_lib_p "$dlprefile"; then + func_tr_sh "$dlprefile" + eval "curr_lafile=\$libfile_$func_tr_sh_result" + dlprefile_dlbasename="" + if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then + # Use subshell, to avoid clobbering current variable values + dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` + if test -n "$dlprefile_dlname" ; then + func_basename "$dlprefile_dlname" + dlprefile_dlbasename="$func_basename_result" + else + # no lafile. user explicitly requested -dlpreopen . + $sharedlib_from_linklib_cmd "$dlprefile" + dlprefile_dlbasename=$sharedlib_from_linklib_result + fi + fi + $opt_dry_run || { + if test -n "$dlprefile_dlbasename" ; then + eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' + else + func_warning "Could not compute DLL name from $name" + eval '$ECHO ": $name " >> "$nlist"' + fi + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + } + else # not an import lib + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + fi + ;; + *) + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + ;; + esac + done + + $opt_dry_run || { + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $MV "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if $GREP -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + $GREP -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + echo >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +extern LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[]; +LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{\ + { \"$my_originator\", (void *) 0 }," + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + echo >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + if test "X$my_pic_p" != Xno; then + pic_flag_for_symtable=" $pic_flag" + fi + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) func_append symtab_cflags " $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' + + # Transform the symbol file into the correct name. + symfileobj="$output_objdir/${my_outputname}S.$objext" + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for \`$my_dlsyms'" + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` + fi +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +# Despite the name, also deal with 64 bit binaries. +func_win32_libid () +{ + $opt_debug + win32_libid_type="unknown" + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then + func_to_tool_file "$1" func_convert_file_msys_to_w32 + win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | + $SED -n -e ' + 1,100{ + / I /{ + s,.*,import, + p + q + } + }'` + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + +# func_cygming_dll_for_implib ARG +# +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib () +{ + $opt_debug + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` +} + +# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs +# +# The is the core of a fallback implementation of a +# platform-specific function to extract the name of the +# DLL associated with the specified import library LIBNAME. +# +# SECTION_NAME is either .idata$6 or .idata$7, depending +# on the platform and compiler that created the implib. +# +# Echos the name of the DLL associated with the +# specified import library. +func_cygming_dll_for_implib_fallback_core () +{ + $opt_debug + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` + $OBJDUMP -s --section "$1" "$2" 2>/dev/null | + $SED '/^Contents of section '"$match_literal"':/{ + # Place marker at beginning of archive member dllname section + s/.*/====MARK====/ + p + d + } + # These lines can sometimes be longer than 43 characters, but + # are always uninteresting + /:[ ]*file format pe[i]\{,1\}-/d + /^In archive [^:]*:/d + # Ensure marker is printed + /^====MARK====/p + # Remove all lines with less than 43 characters + /^.\{43\}/!d + # From remaining lines, remove first 43 characters + s/^.\{43\}//' | + $SED -n ' + # Join marker and all lines until next marker into a single line + /^====MARK====/ b para + H + $ b para + b + :para + x + s/\n//g + # Remove the marker + s/^====MARK====// + # Remove trailing dots and whitespace + s/[\. \t]*$// + # Print + /./p' | + # we now have a list, one entry per line, of the stringified + # contents of the appropriate section of all members of the + # archive which possess that section. Heuristic: eliminate + # all those which have a first or second character that is + # a '.' (that is, objdump's representation of an unprintable + # character.) This should work for all archives with less than + # 0x302f exports -- but will fail for DLLs whose name actually + # begins with a literal '.' or a single character followed by + # a '.'. + # + # Of those that remain, print the first one. + $SED -e '/^\./d;/^.\./d;q' +} + +# func_cygming_gnu_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is a GNU/binutils-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_gnu_implib_p () +{ + $opt_debug + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` + test -n "$func_cygming_gnu_implib_tmp" +} + +# func_cygming_ms_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is an MS-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_ms_implib_p () +{ + $opt_debug + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` + test -n "$func_cygming_ms_implib_tmp" +} + +# func_cygming_dll_for_implib_fallback ARG +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# +# This fallback implementation is for use when $DLLTOOL +# does not support the --identify-strict option. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib_fallback () +{ + $opt_debug + if func_cygming_gnu_implib_p "$1" ; then + # binutils import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` + elif func_cygming_ms_implib_p "$1" ; then + # ms-generated import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` + else + # unknown + sharedlib_from_linklib_result="" + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $opt_debug + f_ex_an_ar_dir="$1"; shift + f_ex_an_ar_oldlib="$1" + if test "$lock_old_archive_extraction" = yes; then + lockfile=$f_ex_an_ar_oldlib.lock + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + fi + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ + 'stat=$?; rm -f "$lockfile"; exit $stat' + if test "$lock_old_archive_extraction" = yes; then + $opt_dry_run || rm -f "$lockfile" + fi + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $opt_debug + my_gentop="$1"; shift + my_oldlibs=${1+"$@"} + my_oldobjs="" + my_xlib="" + my_xabs="" + my_xdir="" + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib="$func_basename_result" + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir="$my_gentop/$my_xlib_u" + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + darwin_base_archive=`basename "$darwin_archive"` + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches ; do + func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" + $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" + cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" + func_extract_an_archive "`pwd`" "${darwin_base_archive}" + cd "$darwin_curdir" + $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` + done + + func_extract_archives_result="$my_oldobjs" +} + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory in which it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=${1-no} + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$ECHO are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + file=\"\$0\"" + + qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` + $ECHO "\ + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + ECHO=\"$qECHO\" + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ which is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options which match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's $0 value, followed by "$@". +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=\$0 + shift + for lt_opt + do + case \"\$lt_opt\" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` + cat \"\$lt_dump_D/\$lt_dump_F\" + exit 0 + ;; + --lt-*) + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n \"\$lt_option_debug\"; then + echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from \$@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + case \" \$* \" in + *\\ --lt-*) + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done ;; + esac + func_exec_program_core \${1+\"\$@\"} +} + + # Parse options + func_parse_lt_options \"\$0\" \${1+\"\$@\"} + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` + done + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + $ECHO "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $MKDIR \"\$progdir\" + else + $RM \"\$progdir/\$file\" + fi" + + $ECHO "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + $ECHO \"\$relink_command_output\" >&2 + $RM \"\$progdir/\$file\" + exit 1 + fi + fi + + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $RM \"\$progdir/\$program\"; + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $RM \"\$progdir/\$file\" + fi" + else + $ECHO "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # fixup the dll searchpath if we need to. + # + # Fix the DLL searchpath if we need to. Do this before prepending + # to shlibpath, because on Windows, both are PATH and uninstalled + # libraries must come first. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` + + export $shlibpath_var +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + func_exec_program \${1+\"\$@\"} + fi + else + # The program doesn't exist. + \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 + \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" +} + + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat < +#include +#ifdef _MSC_VER +# include +# include +# include +#else +# include +# include +# ifdef __CYGWIN__ +# include +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +/* declarations of non-ANSI functions */ +#if defined(__MINGW32__) +# ifdef __STRICT_ANSI__ +int _putenv (const char *); +# endif +#elif defined(__CYGWIN__) +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +/* #elif defined (other platforms) ... */ +#endif + +/* portability defines, excluding path handling macros */ +#if defined(_MSC_VER) +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +# define S_IXUSR _S_IEXEC +# ifndef _INTPTR_T_DEFINED +# define _INTPTR_T_DEFINED +# define intptr_t int +# endif +#elif defined(__MINGW32__) +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +#elif defined(__CYGWIN__) +# define HAVE_SETENV +# define FOPEN_WB "wb" +/* #elif defined (other platforms) ... */ +#endif + +#if defined(PATH_MAX) +# define LT_PATHMAX PATH_MAX +#elif defined(MAXPATHLEN) +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +/* path handling portability macros */ +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ + defined (__OS2__) +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ +} while (0) + +#if defined(LT_DEBUGWRAPPER) +static int lt_debug = 1; +#else +static int lt_debug = 0; +#endif + +const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_debugprintf (const char *file, int line, const char *fmt, ...); +void lt_fatal (const char *file, int line, const char *message, ...); +static const char *nonnull (const char *s); +static const char *nonempty (const char *s); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); +char **prepare_spawn (char **argv); +void lt_dump_script (FILE *f); +EOF + + cat <= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", + nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + int tmp_len; + char *concat_name; + + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", + nonempty (wrapper)); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = q - p; + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + lt_debugprintf (__FILE__, __LINE__, + "checking path component for symlinks: %s\n", + tmp_pathspec); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + lt_fatal (__FILE__, __LINE__, + "error accessing file \"%s\": %s", + tmp_pathspec, nonnull (strerror (errno))); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal (__FILE__, __LINE__, + "could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (strcmp (str, pat) == 0) + *str = '\0'; + } + return str; +} + +void +lt_debugprintf (const char *file, int line, const char *fmt, ...) +{ + va_list args; + if (lt_debug) + { + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); + } +} + +static void +lt_error_core (int exit_status, const char *file, + int line, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *file, int line, const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); + va_end (ap); +} + +static const char * +nonnull (const char *s) +{ + return s ? s : "(null)"; +} + +static const char * +nonempty (const char *s) +{ + return (s && !*s) ? "(empty)" : nonnull (s); +} + +void +lt_setenv (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_setenv) setting '%s' to '%s'\n", + nonnull (name), nonnull (value)); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + int len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + int orig_value_len = strlen (orig_value); + int add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + int len = strlen (new_value); + while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[len-1] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +EOF + case $host_os in + mingw*) + cat <<"EOF" + +/* Prepares an argument vector before calling spawn(). + Note that spawn() does not by itself call the command interpreter + (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : + ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&v); + v.dwPlatformId == VER_PLATFORM_WIN32_NT; + }) ? "cmd.exe" : "command.com"). + Instead it simply concatenates the arguments, separated by ' ', and calls + CreateProcess(). We must quote the arguments since Win32 CreateProcess() + interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a + special way: + - Space and tab are interpreted as delimiters. They are not treated as + delimiters if they are surrounded by double quotes: "...". + - Unescaped double quotes are removed from the input. Their only effect is + that within double quotes, space and tab are treated like normal + characters. + - Backslashes not followed by double quotes are not special. + - But 2*n+1 backslashes followed by a double quote become + n backslashes followed by a double quote (n >= 0): + \" -> " + \\\" -> \" + \\\\\" -> \\" + */ +#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +char ** +prepare_spawn (char **argv) +{ + size_t argc; + char **new_argv; + size_t i; + + /* Count number of arguments. */ + for (argc = 0; argv[argc] != NULL; argc++) + ; + + /* Allocate new argument vector. */ + new_argv = XMALLOC (char *, argc + 1); + + /* Put quoted arguments into the new argument vector. */ + for (i = 0; i < argc; i++) + { + const char *string = argv[i]; + + if (string[0] == '\0') + new_argv[i] = xstrdup ("\"\""); + else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) + { + int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); + size_t length; + unsigned int backslashes; + const char *s; + char *quoted_string; + char *p; + + length = 0; + backslashes = 0; + if (quote_around) + length++; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + length += backslashes + 1; + length++; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + length += backslashes + 1; + + quoted_string = XMALLOC (char, length + 1); + + p = quoted_string; + backslashes = 0; + if (quote_around) + *p++ = '"'; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + { + unsigned int j; + for (j = backslashes + 1; j > 0; j--) + *p++ = '\\'; + } + *p++ = c; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + { + unsigned int j; + for (j = backslashes; j > 0; j--) + *p++ = '\\'; + *p++ = '"'; + } + *p = '\0'; + + new_argv[i] = quoted_string; + } + else + new_argv[i] = (char *) string; + } + new_argv[argc] = NULL; + + return new_argv; +} +EOF + ;; + esac + + cat <<"EOF" +void lt_dump_script (FILE* f) +{ +EOF + func_emit_wrapper yes | + $SED -n -e ' +s/^\(.\{79\}\)\(..*\)/\1\ +\2/ +h +s/\([\\"]\)/\\\1/g +s/$/\\n/ +s/\([^\n]*\).*/ fputs ("\1", f);/p +g +D' + cat <<"EOF" +} +EOF +} +# end: func_emit_cwrapperexe_src + +# func_win32_import_lib_p ARG +# True if ARG is an import lib, as indicated by $file_magic_cmd +func_win32_import_lib_p () +{ + $opt_debug + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in + *import*) : ;; + *) false ;; + esac +} + +# func_mode_link arg... +func_mode_link () +{ + $opt_debug + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # which system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll which has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + bindir= + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=no + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + single_module="${wl}-single_module" + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test "$build_libtool_libs" != yes && \ + func_fatal_configuration "can not build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg="$1" + shift + func_quote_for_eval "$arg" + qarg=$func_quote_for_eval_unquoted_result + func_append libtool_args " $func_quote_for_eval_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" + ;; + esac + + case $prev in + bindir) + bindir="$arg" + prev= + continue + ;; + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=yes + fi + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + func_append dlfiles " $arg" + else + func_append dlprefiles " $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols="$arg" + test -f "$arg" \ + || func_fatal_error "symbol file \`$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) func_append deplibs " $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# func_append moreargs " $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file \`$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + precious_regex) + precious_files_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) func_append rpath " $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) func_append xrpath " $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + weak) + func_append weak_libs " $arg" + prev= + continue + ;; + xcclinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $wl$qarg" + prev= + func_append compile_command " $wl$qarg" + func_append finalize_command " $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg="$arg" + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + # See comment for -static flag below, for more details. + func_append compile_command " $link_static_flag" + func_append finalize_command " $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "\`-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -bindir) + prev=bindir + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + func_append compile_command " $arg" + func_append finalize_command " $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname "-L" '' "$arg" + if test -z "$func_stripname_result"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between \`-L' and \`$1'" + else + func_fatal_error "need path for \`-L' option" + fi + fi + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of \`$dir'" + dir="$absdir" + ;; + esac + case "$deplibs " in + *" -L$dir "* | *" $arg "*) + # Will only happen for absolute or sysroot arguments + ;; + *) + # Preserve sysroot, but never include relative directories + case $dir in + [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; + *) func_append deplibs " -L$dir" ;; + esac + func_append lib_search_path " $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) func_append dllsearchpath ":$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + func_append deplibs " System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test "X$arg" = "X-lc" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test "X$arg" = "X-lc" && continue + ;; + esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + func_append deplibs " $arg" + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot|--sysroot) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) func_append new_inherited_linker_flags " $arg" ;; + esac + continue + ;; + + -multi_module) + single_module="${wl}-multi_module" + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "\`-no-install' is ignored for $host" + func_warning "assuming \`-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + =*) + func_stripname '=' '' "$dir" + dir=$lt_sysroot$func_stripname_result + ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + func_append arg " $func_quote_for_eval_result" + func_append compiler_flags " $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + func_append arg " $wl$func_quote_for_eval_result" + func_append compiler_flags " $wl$func_quote_for_eval_result" + func_append linker_flags " $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + # Flags to be passed through unchanged, with rationale: + # -64, -mips[0-9] enable 64-bit mode for the SGI compiler + # -r[0-9][0-9]* specify processor for the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler + # +DA*, +DD* enable 64-bit mode for the HP compiler + # -q* compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* architecture-specific flags for GCC + # -F/path path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* profiling flags for GCC + # @file GCC response files + # -tp=* Portland pgcc target processor selection + # --sysroot=* for sysroot support + # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ + -O*|-flto*|-fwhopr*|-fuse-linker-plugin) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + func_append compile_command " $arg" + func_append finalize_command " $arg" + func_append compiler_flags " $arg" + continue + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + *.$objext) + # A standard object. + func_append objs " $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + func_append deplibs " $arg" + func_append old_deplibs " $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + func_resolve_sysroot "$arg" + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + func_append dlfiles " $func_resolve_sysroot_result" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + func_append dlprefiles " $func_resolve_sysroot_result" + prev= + else + func_append deplibs " $func_resolve_sysroot_result" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the \`$prevarg' option requires an argument" + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname="$func_basename_result" + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + func_dirname "$output" "/" "" + output_objdir="$func_dirname_result$objdir" + func_to_tool_file "$output_objdir/" + tool_output_objdir=$func_to_tool_file_result + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if $opt_preserve_dup_deps ; then + case "$libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append libs " $deplib" + done + + if test "$linkmode" = lib; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; + esac + func_append pre_post_deps " $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + + case $linkmode in + lib) + passes="conv dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=no + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + + for pass in $passes; do + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test "$linkmode,$pass" = "lib,link"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs="$tmp_deplibs" + fi + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan"; then + libs="$deplibs" + deplibs= + fi + if test "$linkmode" = prog; then + case $pass in + dlopen) libs="$dlfiles" ;; + dlpreopen) libs="$dlprefiles" ;; + link) + libs="$deplibs %DEPLIBS%" + test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" + ;; + esac + fi + if test "$linkmode,$pass" = "lib,dlpreopen"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + func_resolve_sysroot "$lib" + case $lib in + *.la) func_source "$func_resolve_sysroot_result" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + func_basename "$deplib" + deplib_base=$func_basename_result + case " $weak_libs " in + *" $deplib_base "*) ;; + *) func_append deplibs " $deplib" ;; + esac + done + done + libs="$dlprefiles" + fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi + + for deplib in $libs; do + lib= + found=no + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append compiler_flags " $deplib" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test "$linkmode" != lib && test "$linkmode" != prog; then + func_warning "\`-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test "$linkmode" = lib; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib="$searchdir/lib${name}${search_ext}" + if test -f "$lib"; then + if test "$search_ext" = ".la"; then + found=yes + else + found=no + fi + break 2 + fi + done + done + if test "$found" != yes; then + # deplib doesn't seem to be a libtool library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + else # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll="$l" + done + if test "X$ll" = "X$old_library" ; then # only static version available + found=no + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + lib=$ladir/$old_library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + fi + ;; # -l + *.ltframework) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test "$pass" = conv && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + prog) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + *) + func_warning "\`-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + func_stripname '-R' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) + func_resolve_sysroot "$deplib" + lib=$func_resolve_sysroot_result + ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=no + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=yes + fi + ;; + pass_all) + valid_a_lib=yes + ;; + esac + if test "$valid_a_lib" != yes; then + echo + $ECHO "*** Warning: Trying to link with static lib archive $deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because the file extensions .$libext of this argument makes me believe" + echo "*** that it is just a static archive that I should not use here." + else + echo + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + ;; + esac + continue + ;; + prog) + if test "$pass" != link; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + func_append newdlprefiles " $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append newdlfiles " $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + + if test "$found" = yes || test -f "$lib"; then : + else + func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" + fi + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "\`$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" != prog && test "$linkmode" != lib; }; then + test -n "$dlopen" && func_append dlfiles " $dlopen" + test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + # It is a libtool convenience library, so add in its objects. + func_append convenience " $ladir/$objdir/$old_library" + func_append old_convenience " $ladir/$objdir/$old_library" + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done + elif test "$linkmode" != prog && test "$linkmode" != lib; then + func_fatal_error "\`$lib' is not a convenience library" + fi + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + if test -n "$old_library" && + { test "$prefer_static_libs" = yes || + test "$prefer_static_libs,$installed" = "built,no"; }; then + linklib=$old_library + else + for l in $old_library $library_names; do + linklib="$l" + done + fi + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + func_fatal_error "cannot -dlopen a convenience library: \`$lib'" + fi + if test -z "$dlname" || + test "$dlopen_support" != yes || + test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + func_append dlprefiles " $lib $dependency_libs" + else + func_append newdlfiles " $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + func_warning "cannot determine absolute directory name of \`$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir="$ladir" + fi + ;; + esac + func_basename "$lib" + laname="$func_basename_result" + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then + if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library \`$lib' was moved." + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$lt_sysroot$libdir" + absdir="$lt_sysroot$libdir" + fi + test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir="$ladir" + absdir="$abs_ladir" + # Remove this search path later + func_append notinst_path " $abs_ladir" + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + func_append notinst_path " $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test "$pass" = dlpreopen; then + if test -z "$libdir" && test "$linkmode" = prog; then + func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" + fi + case "$host" in + # special handling for platforms with PE-DLLs. + *cygwin* | *mingw* | *cegcc* ) + # Linker will automatically link against shared library if both + # static and shared are present. Therefore, ensure we extract + # symbols from the import library if a shared library is present + # (otherwise, the dlopen module name will be incorrect). We do + # this by putting the import library name into $newdlprefiles. + # We recover the dlopen module name by 'saving' the la file + # name in a special purpose variable, and (later) extracting the + # dlname from the la file. + if test -n "$dlname"; then + func_tr_sh "$dir/$linklib" + eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" + func_append newdlprefiles " $dir/$linklib" + else + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + fi + ;; + * ) + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + func_append newdlprefiles " $dir/$dlname" + else + func_append newdlprefiles " $dir/$linklib" + fi + ;; + esac + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test "$linkmode" = prog && test "$pass" != link; then + func_append newlib_search_path " $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + esac + # Need to link against all dependency_libs? + if test "$linkalldeplibs" = yes; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { { test "$prefer_static_libs" = no || + test "$prefer_static_libs,$installed" = "built,yes"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath:" in + *"$absdir:"*) ;; + *) func_append temp_rpath "$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test "$use_static_libs" = built && test "$installed" = yes; then + use_static_libs=no + fi + if test -n "$library_names" && + { test "$use_static_libs" = no || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc*) + # No point in relinking DLLs because paths are not encoded + func_append notinst_deplibs " $lib" + need_relink=no + ;; + *) + if test "$installed" = no; then + func_append notinst_deplibs " $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule="" + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule="$dlpremoduletest" + break + fi + done + if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then + echo + if test "$linkmode" = prog; then + $ECHO "*** Warning: Linking the executable $output against the loadable module" + else + $ECHO "*** Warning: Linking the shared library $output against the loadable module" + fi + $ECHO "*** $linklib is not portable!" + fi + if test "$linkmode" = lib && + test "$hardcode_into_libs" = yes; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname="$1" + shift + libname=`eval "\\$ECHO \"$libname_spec\""` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname="$dlname" + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw* | *cegcc*) + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + esac + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" + func_basename "$soroot" + soname="$func_basename_result" + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from \`$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for \`$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test "$linkmode" = prog || test "$opt_mode" != relink; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test "$hardcode_direct" = no; then + add="$dir/$linklib" + case $host in + *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; + *-*-sysv4*uw2*) add_dir="-L$dir" ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir="-L$dir" ;; + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we can not + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null ; then + if test "X$dlopenmodule" != "X$lib"; then + $ECHO "*** Warning: lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + echo + echo "*** And there doesn't seem to be a static archive available" + echo "*** The link will probably fail, sorry" + else + add="$dir/$old_library" + fi + elif test -n "$old_library"; then + add="$dir/$old_library" + fi + fi + esac + elif test "$hardcode_minus_L" = no; then + case $host in + *-*-sunos*) add_shlibpath="$dir" ;; + esac + add_dir="-L$dir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = no; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + relink) + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$absdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) func_append compile_shlibpath "$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test "$hardcode_direct" != yes && + test "$hardcode_minus_L" != yes && + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$opt_mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$libdir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib" ; then + add="$inst_prefix_dir$libdir/$linklib" + else + add="$libdir/$linklib" + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + fi + + if test "$linkmode" = prog; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test "$linkmode" = prog; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + echo + $ECHO "*** Warning: This system can not link to static lib archive $lib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + echo "*** But as you try to build a module library, libtool will still create " + echo "*** a static module, that should work as long as the dlopening application" + echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test "$linkmode" = lib; then + if test -n "$dependency_libs" && + { test "$hardcode_into_libs" != yes || + test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) func_append xrpath " $temp_xrpath";; + esac;; + *) func_append temp_deplibs " $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + func_append newlib_search_path " $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result";; + *) func_resolve_sysroot "$deplib" ;; + esac + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $func_resolve_sysroot_result "*) + func_append specialdeplibs " $func_resolve_sysroot_result" ;; + esac + fi + func_append tmp_libs " $func_resolve_sysroot_result" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + path= + case $deplib in + -L*) path="$deplib" ;; + *.la) + func_resolve_sysroot "$deplib" + deplib=$func_resolve_sysroot_result + func_dirname "$deplib" "" "." + dir=$func_dirname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of \`$dir'" + absdir="$dir" + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names" ; then + for tmp in $deplibrary_names ; do + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl" ; then + depdepl="$absdir/$objdir/$depdepl" + darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" + func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" + path= + fi + fi + ;; + *) + path="-L$absdir/$objdir" + ;; + esac + else + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "\`$deplib' seems to be moved" + + path="-L$absdir" + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test "$pass" = link; then + if test "$linkmode" = "prog"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test "$pass" != dlopen; then + if test "$pass" != conv; then + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) func_append lib_search_path " $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) func_append tmp_libs " $deplib" ;; + esac + ;; + *) func_append tmp_libs " $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs ; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i="" + ;; + esac + if test -n "$i" ; then + func_append tmp_libs " $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + fi + if test "$linkmode" = prog || test "$linkmode" = lib; then + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "\`-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "\`-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + func_append objs "$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form `libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test "$module" = no && \ + func_fatal_help "libtool library \`$output' must begin with \`lib'" + + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" + else + echo + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" + func_append libobjs " $objs" + fi + fi + + test "$dlself" != no && \ + func_warning "\`-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test "$#" -gt 1 && \ + func_warning "ignoring multiple \`-rpath's for a libtool library" + + install_libdir="$1" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + # Some compilers have problems with a `.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "\`-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + shift + IFS="$save_ifs" + + test -n "$7" && \ + func_fatal_help "too many parameters to \`-version-info'" + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major="$1" + number_minor="$2" + number_revision="$3" + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # which has an extra 1 added just for fun + # + case $version_type in + # correct linux to gnu/linux during the next big refactor + darwin|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_revision" + ;; + freebsd-aout|freebsd-elf|qnx|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_minor" + lt_irix_increment=no + ;; + *) + func_fatal_configuration "$modename: unknown library version type \`$version_type'" + ;; + esac + ;; + no) + current="$1" + revision="$2" + age="$3" + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "CURRENT \`$current' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "REVISION \`$revision' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "AGE \`$age' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE \`$age' is greater than the current interface number \`$current'" + func_fatal_error "\`$vinfo' is not valid version information" + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current" + ;; + + irix | nonstopux) + if test "X$lt_irix_increment" = "Xno"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring="$verstring_prefix$major.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test "$loop" -ne 0; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring_prefix$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" + ;; + + linux) # correct to gnu/linux during the next big refactor + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test "$loop" -ne 0; do + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + func_append verstring ":${current}.0" + ;; + + qnx) + major=".$current" + versuffix=".$current" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 filesystems. + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + + *) + func_fatal_configuration "unknown library version type \`$version_type'" + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring="0.0" + ;; + esac + if test "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + func_warning "undefined symbols not allowed in $host shared libraries" + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + + fi + + func_generate_dlsyms "$libname" "$libname" "yes" + func_append libobjs " $symfileobj" + test "X$libobjs" = "X " && libobjs= + + if test "$opt_mode" != relink; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if test "X$precious_files_regex" != "X"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + func_append removelist " $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + func_append oldlibs " $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` + # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` + # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + func_replace_sysroot "$libdir" + func_append temp_xrpath " -R$func_replace_sysroot_result" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles="$dlfiles" + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) func_append dlfiles " $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles="$dlprefiles" + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) func_append dlprefiles " $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + func_append deplibs " System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test "$build_libtool_need_lc" = "yes"; then + func_append deplibs " -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release="" + versuffix="" + major="" + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $opt_dry_run || $RM conftest.c + cat > conftest.c </dev/null` + $nocaseglob + else + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + fi + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + func_append newdeplibs " $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib="$potent_lib" # see symlink-check above in file_magic test + if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` + done + fi + case $tmp_deplibs in + *[!\ \ ]*) + echo + if test "X$deplibs_check_method" = "Xnone"; then + echo "*** Warning: inter-library dependencies are not supported in this platform." + else + echo "*** Warning: inter-library dependencies are not known to be supported." + fi + echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + ;; + esac + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" + $ECHO "*** dependencies of module $libname. Therefore, libtool will create" + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." + + if test "$allow_undefined" = no; then + echo + echo "*** Since this library must not contain undefined symbols," + echo "*** because either the platform does not support them or" + echo "*** it was explicitly requested with -no-undefined," + echo "*** libtool will only create a static version of it." + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + deplibs="$new_libs" + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then + # Remove ${wl} instances when linking with ld. + # FIXME: should test the right _cmds variable. + case $archive_cmds in + *\$LD\ *) wl= ;; + esac + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$opt_mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + func_replace_sysroot "$libdir" + libdir=$func_replace_sysroot_result + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append dep_rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath="$finalize_shlibpath" + test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + shift + realname="$1" + shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib="$output_objdir/$realname" + linknames= + for link + do + func_append linknames " $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols="$output_objdir/$libname.uexp" + func_append delfiles " $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + if test "x`$SED 1q $export_symbols`" != xEXPORTS; then + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols="$export_symbols" + export_symbols= + always_export_symbols=yes + fi + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs="$IFS"; IFS='~' + for cmd1 in $cmds; do + IFS="$save_ifs" + # Take the normal branch if the nm_file_list_spec branch + # doesn't work or if tool conversion is not needed. + case $nm_file_list_spec~$to_tool_file_cmd in + *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) + try_normal_branch=yes + eval cmd=\"$cmd1\" + func_len " $cmd" + len=$func_len_result + ;; + *) + try_normal_branch=no + ;; + esac + if test "$try_normal_branch" = yes \ + && { test "$len" -lt "$max_cmd_len" \ + || test "$max_cmd_len" -le -1; } + then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + elif test -n "$nm_file_list_spec"; then + func_basename "$output" + output_la=$func_basename_result + save_libobjs=$libobjs + save_output=$output + output=${output_objdir}/${output_la}.nm + func_to_tool_file "$output" + libobjs=$nm_file_list_spec$func_to_tool_file_result + func_append delfiles " $output" + func_verbose "creating $NM input file list: $output" + for obj in $save_libobjs; do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > "$output" + eval cmd=\"$cmd1\" + func_show_eval "$cmd" 'exit $?' + output=$save_output + libobjs=$save_libobjs + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS="$save_ifs" + if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + func_append tmp_deplibs " $test_deplib" + ;; + esac + done + deplibs="$tmp_deplibs" + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test "$compiler_needs_object" = yes && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + func_append linker_flags " $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$opt_mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test "X$skipped_export" != "X:" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + func_basename "$output" + output_la=$func_basename_result + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then + output=${output_objdir}/${output_la}.lnkscript + func_verbose "creating GNU ld script: $output" + echo 'INPUT (' > $output + for obj in $save_libobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + echo ')' >> $output + func_append delfiles " $output" + func_to_tool_file "$output" + output=$func_to_tool_file_result + elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then + output=${output_objdir}/${output_la}.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test "$compiler_needs_object" = yes; then + firstobj="$1 " + shift + fi + for obj + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + func_append delfiles " $output" + func_to_tool_file "$output" + output=$firstobj\"$file_list_spec$func_to_tool_file_result\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-${k}.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test "X$objlist" = X || + test "$len" -lt "$max_cmd_len"; then + func_append objlist " $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + reload_objs=$objlist + eval concat_cmds=\"$reload_cmds\" + else + # All subsequent reloadable object files will link in + # the last one created. + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-${k}.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-${k}.$objext + objlist=" $obj" + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\${concat_cmds}$reload_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" + fi + func_append delfiles " $output" + + else + output= + fi + + if ${skipped_export-false}; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + fi + + test -n "$save_libobjs" && + func_verbose "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs="$IFS"; IFS='~' + for cmd in $concat_cmds; do + IFS="$save_ifs" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + if ${skipped_export-false}; then + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + fi + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "\`-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object \`$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $opt_dry_run || $RM $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec and hope we can get by with + # turning comma into space.. + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + else + gentop="$output_objdir/${obj}x" + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # If we're not building shared, we need to use non_pic_objs + test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + fi + + if test -n "$pic_flag" || test "$pic_mode" != default; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "\`-release' is ignored for programs" + + test "$preload" = yes \ + && test "$dlopen_support" = unknown \ + && test "$dlopen_self" = unknown \ + && test "$dlopen_self_static" = unknown && \ + func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test "$tagname" = CXX ; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + func_append compile_command " ${wl}-bind_at_load" + func_append finalize_command " ${wl}-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + compile_deplibs="$new_libs" + + + func_append compile_command " $compile_deplibs" + func_append finalize_command " $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) func_append dllsearchpath ":$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath="$rpath" + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) func_append finalize_perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" "no" + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=yes + case $host in + *cegcc* | *mingw32ce*) + # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. + wrappers_required=no + ;; + *cygwin* | *mingw* ) + if test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + *) + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + esac + if test "$wrappers_required" = no; then + # Replace the output file specification. + compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.${objext}"; then + func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' + fi + + exit $exit_status + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + func_append rpath "$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; then + # We don't need to create a wrapper script. + link_command="$compile_var$compile_command$compile_rpath" + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + exit $EXIT_SUCCESS + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "\`$output' will be relinked during installation" + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output_objdir/$outputname" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Now create the wrapper script. + func_verbose "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + cwrappersource="$output_path/$objdir/lt-$output_name.c" + cwrapper="$output_path/$output_name.exe" + $RM $cwrappersource $cwrapper + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host" ; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save $symfileobj" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$old_deplibs $non_pic_objects" + if test "$preload" = yes && test -f "$symfileobj"; then + func_append oldobjs " $symfileobj" + fi + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $addlibs + func_append oldobjs " $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append oldobjs " $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + echo "copying selected object files to avoid basename conflicts..." + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase="$func_basename_result" + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + func_append oldobjs " $gentop/$newobj" + ;; + *) func_append oldobjs " $obj" ;; + esac + done + fi + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + elif test -n "$archiver_list_spec"; then + func_verbose "using command file archive linking..." + for obj in $oldobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > $output_objdir/$libname.libcmd + func_to_tool_file "$output_objdir/$libname.libcmd" + oldobjs=" $archiver_list_spec$func_to_tool_file_result" + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + oldobjs= + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + func_append objlist " $obj" + if test "$len" -lt "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj" ; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" + objlist= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test "X$oldobjs" = "X" ; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + func_verbose "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + func_basename "$deplib" + name="$func_basename_result" + func_resolve_sysroot "$deplib" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" + ;; + -L*) + func_stripname -L '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -L$func_replace_sysroot_result" + ;; + -R*) + func_stripname -R '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -R$func_replace_sysroot_result" + ;; + *) func_append newdependency_libs " $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" + ;; + *) func_append newdlfiles " $lib" ;; + esac + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" + ;; + esac + done + dlprefiles="$newdlprefiles" + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlfiles " $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlprefiles " $abs" + done + dlprefiles="$newdlprefiles" + fi + $RM $output + # place dlname in correct position for cygwin + # In fact, it would be nice if we could use this code for all target + # systems that can't hard-code library paths into their executables + # and that have no shared library path variable independent of PATH, + # but it turns out we can't easily determine that from inspecting + # libtool variables, so we have to hard-code the OSs to which it + # applies here; at the moment, that means platforms that use the PE + # object format with DLL files. See the long comment at the top of + # tests/bindir.at for full details. + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) + # If a -bindir argument was supplied, place the dll there. + if test "x$bindir" != x ; + then + func_relative_path "$install_libdir" "$bindir" + tdlname=$func_relative_path_result$dlname + else + # Otherwise fall back on heuristic. + tdlname=../bin/$dlname + fi + ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Linker flags that can not go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test "$installed" = no && test "$need_relink" = yes; then + $ECHO >> $output "\ +relink_command=\"$relink_command\"" + fi + done + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +{ test "$opt_mode" = link || test "$opt_mode" = relink; } && + func_mode_link ${1+"$@"} + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $opt_debug + RM="$nonopt" + files= + rmforce= + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + for arg + do + case $arg in + -f) func_append RM " $arg"; rmforce=yes ;; + -*) func_append RM " $arg" ;; + *) func_append files " $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + for file in $files; do + func_dirname "$file" "" "." + dir="$func_dirname_result" + if test "X$dir" = X.; then + odir="$objdir" + else + odir="$dir/$objdir" + fi + func_basename "$file" + name="$func_basename_result" + test "$opt_mode" = uninstall && odir="$dir" + + # Remember odir for removal later, being careful to avoid duplicates + if test "$opt_mode" = clean; then + case " $rmdirs " in + *" $odir "*) ;; + *) func_append rmdirs " $odir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + func_append rmfiles " $odir/$n" + done + test -n "$old_library" && func_append rmfiles " $odir/$old_library" + + case "$opt_mode" in + clean) + case " $library_names " in + *" $dlname "*) ;; + *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; + esac + test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && + test "$pic_object" != none; then + func_append rmfiles " $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && + test "$non_pic_object" != none; then + func_append rmfiles " $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$opt_mode" = clean ; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + func_append rmfiles " $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + func_append rmfiles " $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + func_append rmfiles " $odir/$name $odir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + func_append rmfiles " $odir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + func_append rmfiles " $odir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && + func_mode_uninstall ${1+"$@"} + +test -z "$opt_mode" && { + help="$generic_help" + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode \`$opt_mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# in which we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: +# vi:sw=2 + diff --git a/coinhsl/m4/ax_blas.m4 b/coinhsl/m4/ax_blas.m4 new file mode 100644 index 0000000..821459d --- /dev/null +++ b/coinhsl/m4/ax_blas.m4 @@ -0,0 +1,238 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_blas.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_BLAS([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +# +# DESCRIPTION +# +# This macro looks for a library that implements the BLAS linear-algebra +# interface (see http://www.netlib.org/blas/). On success, it sets the +# BLAS_LIBS output variable to hold the requisite library linkages. +# +# To link with BLAS, you should link with: +# +# $BLAS_LIBS $LIBS $FLIBS +# +# in that order. FLIBS is the output variable of the +# AC_F77_LIBRARY_LDFLAGS macro (called if necessary by AX_BLAS), and is +# sometimes necessary in order to link with F77 libraries. Users will also +# need to use AC_F77_DUMMY_MAIN (see the autoconf manual), for the same +# reason. +# +# Many libraries are searched for, from ATLAS to CXML to ESSL. The user +# may also use --with-blas= in order to use some specific BLAS +# library . In order to link successfully, however, be aware that you +# will probably need to use the same Fortran compiler (which can be set +# via the F77 env. var.) as was used to compile the BLAS library. +# +# ACTION-IF-FOUND is a list of shell commands to run if a BLAS library is +# found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it is +# not found. If ACTION-IF-FOUND is not specified, the default action will +# define HAVE_BLAS. +# +# LICENSE +# +# Copyright (c) 2008 Steven G. Johnson +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 14 + +AU_ALIAS([ACX_BLAS], [AX_BLAS]) +AC_DEFUN([AX_BLAS], [ +AC_PREREQ(2.50) +AC_REQUIRE([AC_F77_LIBRARY_LDFLAGS]) +AC_REQUIRE([AC_CANONICAL_HOST]) +ax_blas_ok=no + +AC_ARG_WITH(blas, + [AS_HELP_STRING([--with-blas=], [use BLAS library ])]) +case $with_blas in + yes | "") ;; + no) ax_blas_ok=disable ;; + -* | */* | *.a | *.so | *.so.* | *.o) BLAS_LIBS="$with_blas" ;; + *) BLAS_LIBS="-l$with_blas" ;; +esac + +# Get fortran linker names of BLAS functions to check for. +AC_F77_FUNC(sgemm) +AC_F77_FUNC(dgemm) + +ax_blas_save_LIBS="$LIBS" +LIBS="$LIBS $FLIBS" + +# First, check BLAS_LIBS environment variable +if test $ax_blas_ok = no; then +if test "x$BLAS_LIBS" != x; then + save_LIBS="$LIBS"; LIBS="$BLAS_LIBS $LIBS" + AC_MSG_CHECKING([for $sgemm in $BLAS_LIBS]) + AC_TRY_LINK_FUNC($sgemm, [ax_blas_ok=yes], [BLAS_LIBS=""]) + AC_MSG_RESULT($ax_blas_ok) + LIBS="$save_LIBS" +fi +fi + +# BLAS linked to by default? (happens on some supercomputers) +if test $ax_blas_ok = no; then + save_LIBS="$LIBS"; LIBS="$LIBS" + AC_MSG_CHECKING([if $sgemm is being linked in already]) + AC_TRY_LINK_FUNC($sgemm, [ax_blas_ok=yes]) + AC_MSG_RESULT($ax_blas_ok) + LIBS="$save_LIBS" +fi + +# BLAS in OpenBLAS library? (http://xianyi.github.com/OpenBLAS/) +if test $ax_blas_ok = no; then + AC_CHECK_LIB(openblas, $sgemm, [ax_blas_ok=yes + BLAS_LIBS="-lopenblas"]) +fi + +# BLAS in ATLAS library? (http://math-atlas.sourceforge.net/) +if test $ax_blas_ok = no; then + AC_CHECK_LIB(atlas, ATL_xerbla, + [AC_CHECK_LIB(f77blas, $sgemm, + [AC_CHECK_LIB(cblas, cblas_dgemm, + [ax_blas_ok=yes + BLAS_LIBS="-lcblas -lf77blas -latlas"], + [], [-lf77blas -latlas])], + [], [-latlas])]) +fi + +# BLAS in PhiPACK libraries? (requires generic BLAS lib, too) +if test $ax_blas_ok = no; then + AC_CHECK_LIB(blas, $sgemm, + [AC_CHECK_LIB(dgemm, $dgemm, + [AC_CHECK_LIB(sgemm, $sgemm, + [ax_blas_ok=yes; BLAS_LIBS="-lsgemm -ldgemm -lblas"], + [], [-lblas])], + [], [-lblas])]) +fi + +# BLAS in Intel MKL library? +if test $ax_blas_ok = no; then + # MKL for gfortran + if test x"$ac_cv_fc_compiler_gnu" = xyes; then + # 64 bit + if test $host_cpu = x86_64; then + AC_CHECK_LIB(mkl_gf_lp64, $sgemm, + [ax_blas_ok=yes;BLAS_LIBS="-lmkl_gf_lp64 -lmkl_sequential -lmkl_core -lpthread"],, + [-lmkl_gf_lp64 -lmkl_sequential -lmkl_core -lpthread]) + # 32 bit + elif test $host_cpu = i686; then + AC_CHECK_LIB(mkl_gf, $sgemm, + [ax_blas_ok=yes;BLAS_LIBS="-lmkl_gf -lmkl_sequential -lmkl_core -lpthread"],, + [-lmkl_gf -lmkl_sequential -lmkl_core -lpthread]) + fi + # MKL for other compilers (Intel, PGI, ...?) + else + # 64-bit + if test $host_cpu = x86_64; then + AC_CHECK_LIB(mkl_intel_lp64, $sgemm, + [ax_blas_ok=yes;BLAS_LIBS="-lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lpthread"],, + [-lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lpthread]) + # 32-bit + elif test $host_cpu = i686; then + AC_CHECK_LIB(mkl_intel, $sgemm, + [ax_blas_ok=yes;BLAS_LIBS="-lmkl_intel -lmkl_sequential -lmkl_core -lpthread"],, + [-lmkl_intel -lmkl_sequential -lmkl_core -lpthread]) + fi + fi +fi +# Old versions of MKL +if test $ax_blas_ok = no; then + AC_CHECK_LIB(mkl, $sgemm, [ax_blas_ok=yes;BLAS_LIBS="-lmkl -lguide -lpthread"],,[-lguide -lpthread]) +fi + +# BLAS in Apple vecLib library? +if test $ax_blas_ok = no; then + save_LIBS="$LIBS"; LIBS="-framework vecLib $LIBS" + AC_MSG_CHECKING([for $sgemm in -framework vecLib]) + AC_TRY_LINK_FUNC($sgemm, [ax_blas_ok=yes;BLAS_LIBS="-framework vecLib"]) + AC_MSG_RESULT($ax_blas_ok) + LIBS="$save_LIBS" +fi + +# BLAS in Alpha CXML library? +if test $ax_blas_ok = no; then + AC_CHECK_LIB(cxml, $sgemm, [ax_blas_ok=yes;BLAS_LIBS="-lcxml"]) +fi + +# BLAS in Alpha DXML library? (now called CXML, see above) +if test $ax_blas_ok = no; then + AC_CHECK_LIB(dxml, $sgemm, [ax_blas_ok=yes;BLAS_LIBS="-ldxml"]) +fi + +# BLAS in Sun Performance library? +if test $ax_blas_ok = no; then + if test "x$GCC" != xyes; then # only works with Sun CC + AC_CHECK_LIB(sunmath, acosp, + [AC_CHECK_LIB(sunperf, $sgemm, + [BLAS_LIBS="-xlic_lib=sunperf -lsunmath" + ax_blas_ok=yes],[],[-lsunmath])]) + fi +fi + +# BLAS in SCSL library? (SGI/Cray Scientific Library) +if test $ax_blas_ok = no; then + AC_CHECK_LIB(scs, $sgemm, [ax_blas_ok=yes; BLAS_LIBS="-lscs"]) +fi + +# BLAS in SGIMATH library? +if test $ax_blas_ok = no; then + AC_CHECK_LIB(complib.sgimath, $sgemm, + [ax_blas_ok=yes; BLAS_LIBS="-lcomplib.sgimath"]) +fi + +# BLAS in IBM ESSL library? (requires generic BLAS lib, too) +if test $ax_blas_ok = no; then + AC_CHECK_LIB(blas, $sgemm, + [AC_CHECK_LIB(essl, $sgemm, + [ax_blas_ok=yes; BLAS_LIBS="-lessl -lblas"], + [], [-lblas $FLIBS])]) +fi + +# Generic BLAS library? +if test $ax_blas_ok = no; then + AC_CHECK_LIB(blas, $sgemm, [ax_blas_ok=yes; BLAS_LIBS="-lblas"]) +fi + +AC_SUBST(BLAS_LIBS) + +LIBS="$ax_blas_save_LIBS" + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x"$ax_blas_ok" = xyes; then + ifelse([$1],,AC_DEFINE(HAVE_BLAS,1,[Define if you have a BLAS library.]),[$1]) + : +else + ax_blas_ok=no + $2 +fi +])dnl AX_BLAS diff --git a/coinhsl/m4/libtool.m4 b/coinhsl/m4/libtool.m4 new file mode 100644 index 0000000..d7c043f --- /dev/null +++ b/coinhsl/m4/libtool.m4 @@ -0,0 +1,7997 @@ +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +m4_define([_LT_COPYING], [dnl +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +]) + +# serial 57 LT_INIT + + +# LT_PREREQ(VERSION) +# ------------------ +# Complain and exit if this libtool version is less that VERSION. +m4_defun([LT_PREREQ], +[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, + [m4_default([$3], + [m4_fatal([Libtool version $1 or higher is required], + 63)])], + [$2])]) + + +# _LT_CHECK_BUILDDIR +# ------------------ +# Complain if the absolute build directory name contains unusual characters +m4_defun([_LT_CHECK_BUILDDIR], +[case `pwd` in + *\ * | *\ *) + AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; +esac +]) + + +# LT_INIT([OPTIONS]) +# ------------------ +AC_DEFUN([LT_INIT], +[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT +AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +AC_BEFORE([$0], [LT_LANG])dnl +AC_BEFORE([$0], [LT_OUTPUT])dnl +AC_BEFORE([$0], [LTDL_INIT])dnl +m4_require([_LT_CHECK_BUILDDIR])dnl + +dnl Autoconf doesn't catch unexpanded LT_ macros by default: +m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +dnl unless we require an AC_DEFUNed macro: +AC_REQUIRE([LTOPTIONS_VERSION])dnl +AC_REQUIRE([LTSUGAR_VERSION])dnl +AC_REQUIRE([LTVERSION_VERSION])dnl +AC_REQUIRE([LTOBSOLETE_VERSION])dnl +m4_require([_LT_PROG_LTMAIN])dnl + +_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) + +dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ltmain" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +_LT_SETUP + +# Only expand once: +m4_define([LT_INIT]) +])# LT_INIT + +# Old names: +AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) +AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PROG_LIBTOOL], []) +dnl AC_DEFUN([AM_PROG_LIBTOOL], []) + + +# _LT_CC_BASENAME(CC) +# ------------------- +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +m4_defun([_LT_CC_BASENAME], +[for cc_temp in $1""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +]) + + +# _LT_FILEUTILS_DEFAULTS +# ---------------------- +# It is okay to use these file commands and assume they have been set +# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. +m4_defun([_LT_FILEUTILS_DEFAULTS], +[: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} +])# _LT_FILEUTILS_DEFAULTS + + +# _LT_SETUP +# --------- +m4_defun([_LT_SETUP], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl + +_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl +dnl +_LT_DECL([], [host_alias], [0], [The host system])dnl +_LT_DECL([], [host], [0])dnl +_LT_DECL([], [host_os], [0])dnl +dnl +_LT_DECL([], [build_alias], [0], [The build system])dnl +_LT_DECL([], [build], [0])dnl +_LT_DECL([], [build_os], [0])dnl +dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +test -z "$LN_S" && LN_S="ln -s" +_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl +dnl +AC_REQUIRE([LT_CMD_MAX_LEN])dnl +_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl +_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl +dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl +m4_require([_LT_CMD_RELOAD])dnl +m4_require([_LT_CHECK_MAGIC_METHOD])dnl +m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl +m4_require([_LT_CMD_OLD_ARCHIVE])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_WITH_SYSROOT])dnl + +_LT_CONFIG_LIBTOOL_INIT([ +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi +]) +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +_LT_CHECK_OBJDIR + +m4_require([_LT_TAG_COMPILER])dnl + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld="$lt_cv_prog_gnu_ld" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + _LT_PATH_MAGIC + fi + ;; +esac + +# Use C for the default configuration in the libtool script +LT_SUPPORTED_TAG([CC]) +_LT_LANG_C_CONFIG +_LT_LANG_DEFAULT_CONFIG +_LT_CONFIG_COMMANDS +])# _LT_SETUP + + +# _LT_PREPARE_SED_QUOTE_VARS +# -------------------------- +# Define a few sed substitution that help us do robust quoting. +m4_defun([_LT_PREPARE_SED_QUOTE_VARS], +[# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([["`\\]]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' +]) + +# _LT_PROG_LTMAIN +# --------------- +# Note that this code is called both from `configure', and `config.status' +# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, +# `config.status' has no value for ac_aux_dir unless we are using Automake, +# so we pass a copy along to make sure it has a sensible value anyway. +m4_defun([_LT_PROG_LTMAIN], +[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl +_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) +ltmain="$ac_aux_dir/ltmain.sh" +])# _LT_PROG_LTMAIN + + +## ------------------------------------- ## +## Accumulate code for creating libtool. ## +## ------------------------------------- ## + +# So that we can recreate a full libtool script including additional +# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS +# in macros and then make a single call at the end using the `libtool' +# label. + + +# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) +# ---------------------------------------- +# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL_INIT], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_INIT], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_INIT]) + + +# _LT_CONFIG_LIBTOOL([COMMANDS]) +# ------------------------------ +# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) + + +# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) +# ----------------------------------------------------- +m4_defun([_LT_CONFIG_SAVE_COMMANDS], +[_LT_CONFIG_LIBTOOL([$1]) +_LT_CONFIG_LIBTOOL_INIT([$2]) +]) + + +# _LT_FORMAT_COMMENT([COMMENT]) +# ----------------------------- +# Add leading comment marks to the start of each line, and a trailing +# full-stop to the whole comment if one is not present already. +m4_define([_LT_FORMAT_COMMENT], +[m4_ifval([$1], [ +m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], + [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) +)]) + + + +## ------------------------ ## +## FIXME: Eliminate VARNAME ## +## ------------------------ ## + + +# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) +# ------------------------------------------------------------------- +# CONFIGNAME is the name given to the value in the libtool script. +# VARNAME is the (base) name used in the configure script. +# VALUE may be 0, 1 or 2 for a computed quote escaped value based on +# VARNAME. Any other value will be used directly. +m4_define([_LT_DECL], +[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], + [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], + [m4_ifval([$1], [$1], [$2])]) + lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) + m4_ifval([$4], + [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) + lt_dict_add_subkey([lt_decl_dict], [$2], + [tagged?], [m4_ifval([$5], [yes], [no])])]) +]) + + +# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) +# -------------------------------------------------------- +m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) + + +# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_tag_varnames], +[_lt_decl_filter([tagged?], [yes], $@)]) + + +# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) +# --------------------------------------------------------- +m4_define([_lt_decl_filter], +[m4_case([$#], + [0], [m4_fatal([$0: too few arguments: $#])], + [1], [m4_fatal([$0: too few arguments: $#: $1])], + [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], + [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], + [lt_dict_filter([lt_decl_dict], $@)])[]dnl +]) + + +# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) +# -------------------------------------------------- +m4_define([lt_decl_quote_varnames], +[_lt_decl_filter([value], [1], $@)]) + + +# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_dquote_varnames], +[_lt_decl_filter([value], [2], $@)]) + + +# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_varnames_tagged], +[m4_assert([$# <= 2])dnl +_$0(m4_quote(m4_default([$1], [[, ]])), + m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), + m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) +m4_define([_lt_decl_varnames_tagged], +[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) + + +# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_all_varnames], +[_$0(m4_quote(m4_default([$1], [[, ]])), + m4_if([$2], [], + m4_quote(lt_decl_varnames), + m4_quote(m4_shift($@))))[]dnl +]) +m4_define([_lt_decl_all_varnames], +[lt_join($@, lt_decl_varnames_tagged([$1], + lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl +]) + + +# _LT_CONFIG_STATUS_DECLARE([VARNAME]) +# ------------------------------------ +# Quote a variable value, and forward it to `config.status' so that its +# declaration there will have the same value as in `configure'. VARNAME +# must have a single quote delimited value for this to work. +m4_define([_LT_CONFIG_STATUS_DECLARE], +[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) + + +# _LT_CONFIG_STATUS_DECLARATIONS +# ------------------------------ +# We delimit libtool config variables with single quotes, so when +# we write them to config.status, we have to be sure to quote all +# embedded single quotes properly. In configure, this macro expands +# each variable declared with _LT_DECL (and _LT_TAGDECL) into: +# +# ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' +m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], +[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), + [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAGS +# ---------------- +# Output comment and list of tags supported by the script +m4_defun([_LT_LIBTOOL_TAGS], +[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl +available_tags="_LT_TAGS"dnl +]) + + +# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) +# ----------------------------------- +# Extract the dictionary values for VARNAME (optionally with TAG) and +# expand to a commented shell variable setting: +# +# # Some comment about what VAR is for. +# visible_name=$lt_internal_name +m4_define([_LT_LIBTOOL_DECLARE], +[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], + [description])))[]dnl +m4_pushdef([_libtool_name], + m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl +m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), + [0], [_libtool_name=[$]$1], + [1], [_libtool_name=$lt_[]$1], + [2], [_libtool_name=$lt_[]$1], + [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl +m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl +]) + + +# _LT_LIBTOOL_CONFIG_VARS +# ----------------------- +# Produce commented declarations of non-tagged libtool config variables +# suitable for insertion in the LIBTOOL CONFIG section of the `libtool' +# script. Tagged libtool config variables (even for the LIBTOOL CONFIG +# section) are produced by _LT_LIBTOOL_TAG_VARS. +m4_defun([_LT_LIBTOOL_CONFIG_VARS], +[m4_foreach([_lt_var], + m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAG_VARS(TAG) +# ------------------------- +m4_define([_LT_LIBTOOL_TAG_VARS], +[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) + + +# _LT_TAGVAR(VARNAME, [TAGNAME]) +# ------------------------------ +m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) + + +# _LT_CONFIG_COMMANDS +# ------------------- +# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of +# variables for single and double quote escaping we saved from calls +# to _LT_DECL, we can put quote escaped variables declarations +# into `config.status', and then the shell code to quote escape them in +# for loops in `config.status'. Finally, any additional code accumulated +# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. +m4_defun([_LT_CONFIG_COMMANDS], +[AC_PROVIDE_IFELSE([LT_OUTPUT], + dnl If the libtool generation code has been placed in $CONFIG_LT, + dnl instead of duplicating it all over again into config.status, + dnl then we will have config.status run $CONFIG_LT later, so it + dnl needs to know what name is stored there: + [AC_CONFIG_COMMANDS([libtool], + [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], + dnl If the libtool generation code is destined for config.status, + dnl expand the accumulated commands and init code now: + [AC_CONFIG_COMMANDS([libtool], + [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) +])#_LT_CONFIG_COMMANDS + + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], +[ + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +_LT_CONFIG_STATUS_DECLARATIONS +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$[]1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_quote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_dquote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +_LT_OUTPUT_LIBTOOL_INIT +]) + +# _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) +# ------------------------------------ +# Generate a child script FILE with all initialization necessary to +# reuse the environment learned by the parent script, and make the +# file executable. If COMMENT is supplied, it is inserted after the +# `#!' sequence but before initialization text begins. After this +# macro, additional text can be appended to FILE to form the body of +# the child script. The macro ends with non-zero status if the +# file could not be fully written (such as if the disk is full). +m4_ifdef([AS_INIT_GENERATED], +[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], +[m4_defun([_LT_GENERATED_FILE_INIT], +[m4_require([AS_PREPARE])]dnl +[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl +[lt_write_fail=0 +cat >$1 <<_ASEOF || lt_write_fail=1 +#! $SHELL +# Generated by $as_me. +$2 +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$1 <<\_ASEOF || lt_write_fail=1 +AS_SHELL_SANITIZE +_AS_PREPARE +exec AS_MESSAGE_FD>&1 +_ASEOF +test $lt_write_fail = 0 && chmod +x $1[]dnl +m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT + +# LT_OUTPUT +# --------- +# This macro allows early generation of the libtool script (before +# AC_OUTPUT is called), incase it is used in configure for compilation +# tests. +AC_DEFUN([LT_OUTPUT], +[: ${CONFIG_LT=./config.lt} +AC_MSG_NOTICE([creating $CONFIG_LT]) +_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], +[# Run this file to recreate a libtool stub with the current configuration.]) + +cat >>"$CONFIG_LT" <<\_LTEOF +lt_cl_silent=false +exec AS_MESSAGE_LOG_FD>>config.log +{ + echo + AS_BOX([Running $as_me.]) +} >&AS_MESSAGE_LOG_FD + +lt_cl_help="\ +\`$as_me' creates a local libtool stub from the current configuration, +for use in further configure time tests before the real libtool is +generated. + +Usage: $[0] [[OPTIONS]] + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + +Report bugs to ." + +lt_cl_version="\ +m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +configured by $[0], generated by m4_PACKAGE_STRING. + +Copyright (C) 2011 Free Software Foundation, Inc. +This config.lt script is free software; the Free Software Foundation +gives unlimited permision to copy, distribute and modify it." + +while test $[#] != 0 +do + case $[1] in + --version | --v* | -V ) + echo "$lt_cl_version"; exit 0 ;; + --help | --h* | -h ) + echo "$lt_cl_help"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --quiet | --q* | --silent | --s* | -q ) + lt_cl_silent=: ;; + + -*) AC_MSG_ERROR([unrecognized option: $[1] +Try \`$[0] --help' for more information.]) ;; + + *) AC_MSG_ERROR([unrecognized argument: $[1] +Try \`$[0] --help' for more information.]) ;; + esac + shift +done + +if $lt_cl_silent; then + exec AS_MESSAGE_FD>/dev/null +fi +_LTEOF + +cat >>"$CONFIG_LT" <<_LTEOF +_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AC_MSG_NOTICE([creating $ofile]) +_LT_OUTPUT_LIBTOOL_COMMANDS +AS_EXIT(0) +_LTEOF +chmod +x "$CONFIG_LT" + +# configure is writing to config.log, but config.lt does its own redirection, +# appending to config.log, which fails on DOS, as config.log is still kept +# open by configure. Here we exec the FD to /dev/null, effectively closing +# config.log, so it can be properly (re)opened and appended to by config.lt. +lt_cl_success=: +test "$silent" = yes && + lt_config_lt_args="$lt_config_lt_args --quiet" +exec AS_MESSAGE_LOG_FD>/dev/null +$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false +exec AS_MESSAGE_LOG_FD>>config.log +$lt_cl_success || AS_EXIT(1) +])# LT_OUTPUT + + +# _LT_CONFIG(TAG) +# --------------- +# If TAG is the built-in tag, create an initial libtool script with a +# default configuration from the untagged config vars. Otherwise add code +# to config.status for appending the configuration named by TAG from the +# matching tagged config vars. +m4_defun([_LT_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_CONFIG_SAVE_COMMANDS([ + m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl + m4_if(_LT_TAG, [C], [ + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +_LT_COPYING +_LT_LIBTOOL_TAGS + +# ### BEGIN LIBTOOL CONFIG +_LT_LIBTOOL_CONFIG_VARS +_LT_LIBTOOL_TAG_VARS +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + _LT_PROG_LTMAIN + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + _LT_PROG_REPLACE_SHELLFNS + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +], +[cat <<_LT_EOF >> "$ofile" + +dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded +dnl in a comment (ie after a #). +# ### BEGIN LIBTOOL TAG CONFIG: $1 +_LT_LIBTOOL_TAG_VARS(_LT_TAG) +# ### END LIBTOOL TAG CONFIG: $1 +_LT_EOF +])dnl /m4_if +], +[m4_if([$1], [], [ + PACKAGE='$PACKAGE' + VERSION='$VERSION' + TIMESTAMP='$TIMESTAMP' + RM='$RM' + ofile='$ofile'], []) +])dnl /_LT_CONFIG_SAVE_COMMANDS +])# _LT_CONFIG + + +# LT_SUPPORTED_TAG(TAG) +# --------------------- +# Trace this macro to discover what tags are supported by the libtool +# --tag option, using: +# autoconf --trace 'LT_SUPPORTED_TAG:$1' +AC_DEFUN([LT_SUPPORTED_TAG], []) + + +# C support is built-in for now +m4_define([_LT_LANG_C_enabled], []) +m4_define([_LT_TAGS], []) + + +# LT_LANG(LANG) +# ------------- +# Enable libtool support for the given language if not already enabled. +AC_DEFUN([LT_LANG], +[AC_BEFORE([$0], [LT_OUTPUT])dnl +m4_case([$1], + [C], [_LT_LANG(C)], + [C++], [_LT_LANG(CXX)], + [Go], [_LT_LANG(GO)], + [Java], [_LT_LANG(GCJ)], + [Fortran 77], [_LT_LANG(F77)], + [Fortran], [_LT_LANG(FC)], + [Windows Resource], [_LT_LANG(RC)], + [m4_ifdef([_LT_LANG_]$1[_CONFIG], + [_LT_LANG($1)], + [m4_fatal([$0: unsupported language: "$1"])])])dnl +])# LT_LANG + + +# _LT_LANG(LANGNAME) +# ------------------ +m4_defun([_LT_LANG], +[m4_ifdef([_LT_LANG_]$1[_enabled], [], + [LT_SUPPORTED_TAG([$1])dnl + m4_append([_LT_TAGS], [$1 ])dnl + m4_define([_LT_LANG_]$1[_enabled], [])dnl + _LT_LANG_$1_CONFIG($1)])dnl +])# _LT_LANG + + +m4_ifndef([AC_PROG_GO], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_GO. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ +m4_defun([AC_PROG_GO], +[AC_LANG_PUSH(Go)dnl +AC_ARG_VAR([GOC], [Go compiler command])dnl +AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl +_AC_ARG_VAR_LDFLAGS()dnl +AC_CHECK_TOOL(GOC, gccgo) +if test -z "$GOC"; then + if test -n "$ac_tool_prefix"; then + AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) + fi +fi +if test -z "$GOC"; then + AC_CHECK_PROG(GOC, gccgo, gccgo, false) +fi +])#m4_defun +])#m4_ifndef + + +# _LT_LANG_DEFAULT_CONFIG +# ----------------------- +m4_defun([_LT_LANG_DEFAULT_CONFIG], +[AC_PROVIDE_IFELSE([AC_PROG_CXX], + [LT_LANG(CXX)], + [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) + +AC_PROVIDE_IFELSE([AC_PROG_F77], + [LT_LANG(F77)], + [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) + +AC_PROVIDE_IFELSE([AC_PROG_FC], + [LT_LANG(FC)], + [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) + +dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal +dnl pulling things in needlessly. +AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([LT_PROG_GCJ], + [LT_LANG(GCJ)], + [m4_ifdef([AC_PROG_GCJ], + [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([A][M_PROG_GCJ], + [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([LT_PROG_GCJ], + [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) + +AC_PROVIDE_IFELSE([AC_PROG_GO], + [LT_LANG(GO)], + [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) + +AC_PROVIDE_IFELSE([LT_PROG_RC], + [LT_LANG(RC)], + [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) +])# _LT_LANG_DEFAULT_CONFIG + +# Obsolete macros: +AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_CXX], []) +dnl AC_DEFUN([AC_LIBTOOL_F77], []) +dnl AC_DEFUN([AC_LIBTOOL_FC], []) +dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) +dnl AC_DEFUN([AC_LIBTOOL_RC], []) + + +# _LT_TAG_COMPILER +# ---------------- +m4_defun([_LT_TAG_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl +_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl +_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl +_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_TAG_COMPILER + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +m4_defun([_LT_COMPILER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +m4_defun([_LT_LINKER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* +])# _LT_LINKER_BOILERPLATE + +# _LT_REQUIRED_DARWIN_CHECKS +# ------------------------- +m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + AC_CHECK_TOOL([LIPO], [lipo], [:]) + AC_CHECK_TOOL([OTOOL], [otool], [:]) + AC_CHECK_TOOL([OTOOL64], [otool64], [:]) + _LT_DECL([], [DSYMUTIL], [1], + [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) + _LT_DECL([], [NMEDIT], [1], + [Tool to change global to local symbols on Mac OS X]) + _LT_DECL([], [LIPO], [1], + [Tool to manipulate fat objects and archives on Mac OS X]) + _LT_DECL([], [OTOOL], [1], + [ldd/readelf like tool for Mach-O binaries on Mac OS X]) + _LT_DECL([], [OTOOL64], [1], + [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) + + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], + [lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test $_lt_result -eq 0; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi]) + + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [lt_cv_ld_exported_symbols_list=yes], + [lt_cv_ld_exported_symbols_list=no]) + LDFLAGS="$save_LDFLAGS" + ]) + + AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], + [lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD + echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD + $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD + echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD + $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + ]) + case $host_os in + rhapsody* | darwin1.[[012]]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[[012]]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +]) + + +# _LT_DARWIN_LINKER_FEATURES([TAG]) +# --------------------------------- +# Checks for linker and compiler features on darwin +m4_defun([_LT_DARWIN_LINKER_FEATURES], +[ + m4_require([_LT_REQUIRED_DARWIN_CHECKS]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_automatic, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + if test "$lt_cv_ld_force_load" = "yes"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], + [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='' + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=func_echo_all + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + m4_if([$1], [CXX], +[ if test "$lt_cv_apple_cc_single_mod" != "yes"; then + _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi +],[]) + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi +]) + +# _LT_SYS_MODULE_PATH_AIX([TAGNAME]) +# ---------------------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +# Store the results from the different compilers for each TAGNAME. +# Allow to override them for all tags through lt_cv_aix_libpath. +m4_defun([_LT_SYS_MODULE_PATH_AIX], +[m4_require([_LT_DECL_SED])dnl +if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], + [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ + lt_aix_libpath_sed='[ + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }]' + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi],[]) + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" + fi + ]) + aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) +fi +])# _LT_SYS_MODULE_PATH_AIX + + +# _LT_SHELL_INIT(ARG) +# ------------------- +m4_define([_LT_SHELL_INIT], +[m4_divert_text([M4SH-INIT], [$1 +])])# _LT_SHELL_INIT + + + +# _LT_PROG_ECHO_BACKSLASH +# ----------------------- +# Find how we can fake an echo command that does not interpret backslash. +# In particular, with Autoconf 2.60 or later we add some code to the start +# of the generated configure script which will find a shell with a builtin +# printf (which we can use as an echo command). +m4_defun([_LT_PROG_ECHO_BACKSLASH], +[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +AC_MSG_CHECKING([how to print strings]) +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$[]1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +case "$ECHO" in + printf*) AC_MSG_RESULT([printf]) ;; + print*) AC_MSG_RESULT([print -r]) ;; + *) AC_MSG_RESULT([cat]) ;; +esac + +m4_ifdef([_AS_DETECT_SUGGESTED], +[_AS_DETECT_SUGGESTED([ + test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test "X`printf %s $ECHO`" = "X$ECHO" \ + || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) + +_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) +])# _LT_PROG_ECHO_BACKSLASH + + +# _LT_WITH_SYSROOT +# ---------------- +AC_DEFUN([_LT_WITH_SYSROOT], +[AC_MSG_CHECKING([for sysroot]) +AC_ARG_WITH([sysroot], +[ --with-sysroot[=DIR] Search for dependent libraries within DIR + (or the compiler's sysroot if not specified).], +[], [with_sysroot=no]) + +dnl lt_sysroot will always be passed unquoted. We quote it here +dnl in case the user passed a directory name. +lt_sysroot= +case ${with_sysroot} in #( + yes) + if test "$GCC" = yes; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + AC_MSG_RESULT([${with_sysroot}]) + AC_MSG_ERROR([The sysroot must be an absolute path.]) + ;; +esac + + AC_MSG_RESULT([${lt_sysroot:-no}]) +_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl +[dependent libraries, and in which our libraries should be installed.])]) + +# _LT_ENABLE_LOCK +# --------------- +m4_defun([_LT_ENABLE_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AS_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + powerpcle-*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD="${LD-ld}_sol2" + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks="$enable_libtool_lock" +])# _LT_ENABLE_LOCK + + +# _LT_PROG_AR +# ----------- +m4_defun([_LT_PROG_AR], +[AC_CHECK_TOOLS(AR, [ar], false) +: ${AR=ar} +: ${AR_FLAGS=cru} +_LT_DECL([], [AR], [1], [The archiver]) +_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) + +AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], + [lt_cv_ar_at_file=no + AC_COMPILE_IFELSE([AC_LANG_PROGRAM], + [echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([lt_ar_try]) + if test "$ac_status" -eq 0; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + AC_TRY_EVAL([lt_ar_try]) + if test "$ac_status" -ne 0; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + ]) + ]) + +if test "x$lt_cv_ar_at_file" = xno; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi +_LT_DECL([], [archiver_list_spec], [1], + [How to feed a file listing to the archiver]) +])# _LT_PROG_AR + + +# _LT_CMD_OLD_ARCHIVE +# ------------------- +m4_defun([_LT_CMD_OLD_ARCHIVE], +[_LT_PROG_AR + +AC_CHECK_TOOL(STRIP, strip, :) +test -z "$STRIP" && STRIP=: +_LT_DECL([], [STRIP], [1], [A symbol stripping program]) + +AC_CHECK_TOOL(RANLIB, ranlib, :) +test -z "$RANLIB" && RANLIB=: +_LT_DECL([], [RANLIB], [1], + [Commands used to install an old-style archive]) + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac +_LT_DECL([], [old_postinstall_cmds], [2]) +_LT_DECL([], [old_postuninstall_cmds], [2]) +_LT_TAGDECL([], [old_archive_cmds], [2], + [Commands used to build an old-style archive]) +_LT_DECL([], [lock_old_archive_extraction], [0], + [Whether to use a lock for old archive extraction]) +])# _LT_CMD_OLD_ARCHIVE + + +# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([_LT_COMPILER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* +]) + +if test x"[$]$2" = xyes; then + m4_if([$5], , :, [$5]) +else + m4_if([$6], , :, [$6]) +fi +])# _LT_COMPILER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) + + +# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------- +# Check whether the given linker option works +AC_DEFUN([_LT_LINKER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + m4_if([$4], , :, [$4]) +else + m4_if([$5], , :, [$5]) +fi +])# _LT_LINKER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) + + +# LT_CMD_MAX_LEN +#--------------- +AC_DEFUN([LT_CMD_MAX_LEN], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac +]) +if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +max_cmd_len=$lt_cv_sys_max_cmd_len +_LT_DECL([], [max_cmd_len], [0], + [What is the maximum length of a command?]) +])# LT_CMD_MAX_LEN + +# Old name: +AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) + + +# _LT_HEADER_DLFCN +# ---------------- +m4_defun([_LT_HEADER_DLFCN], +[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl +])# _LT_HEADER_DLFCN + + +# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ---------------------------------------------------------------- +m4_defun([_LT_TRY_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test "$cross_compiling" = yes; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +[#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +}] +_LT_EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_TRY_DLOPEN_SELF + + +# LT_SYS_DLOPEN_SELF +# ------------------ +AC_DEFUN([LT_SYS_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +_LT_DECL([dlopen_support], [enable_dlopen], [0], + [Whether dlopen is supported]) +_LT_DECL([dlopen_self], [enable_dlopen_self], [0], + [Whether dlopen of programs is supported]) +_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], + [Whether dlopen of statically linked programs is supported]) +])# LT_SYS_DLOPEN_SELF + +# Old name: +AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) + + +# _LT_COMPILER_C_O([TAGNAME]) +# --------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler. +# This macro does not hard code the compiler like AC_PROG_CC_C_O. +m4_defun([_LT_COMPILER_C_O], +[m4_require([_LT_DECL_SED])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* +]) +_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], + [Does compiler simultaneously support -c and -o options?]) +])# _LT_COMPILER_C_O + + +# _LT_COMPILER_FILE_LOCKS([TAGNAME]) +# ---------------------------------- +# Check to see if we can do hard links to lock some files if needed +m4_defun([_LT_COMPILER_FILE_LOCKS], +[m4_require([_LT_ENABLE_LOCK])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_COMPILER_C_O([$1]) + +hard_links="nottested" +if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) +])# _LT_COMPILER_FILE_LOCKS + + +# _LT_CHECK_OBJDIR +# ---------------- +m4_defun([_LT_CHECK_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +_LT_DECL([], [objdir], [0], + [The name of the directory that contains temporary libtool files])dnl +m4_pattern_allow([LT_OBJDIR])dnl +AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", + [Define to the sub-directory in which libtool stores uninstalled libraries.]) +])# _LT_CHECK_OBJDIR + + +# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) +# -------------------------------------- +# Check hardcoding attributes. +m4_defun([_LT_LINKER_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || + test -n "$_LT_TAGVAR(runpath_var, $1)" || + test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) + +if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || + test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi +_LT_TAGDECL([], [hardcode_action], [0], + [How to hardcode a shared library path into an executable]) +])# _LT_LINKER_HARDCODE_LIBPATH + + +# _LT_CMD_STRIPLIB +# ---------------- +m4_defun([_LT_CMD_STRIPLIB], +[m4_require([_LT_DECL_EGREP]) +striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) +_LT_DECL([], [striplib], [1]) +])# _LT_CMD_STRIPLIB + + +# _LT_SYS_DYNAMIC_LINKER([TAG]) +# ----------------------------- +# PORTME Fill in your ld.so characteristics +m4_defun([_LT_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_OBJDUMP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +m4_if([$1], + [], [ +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; + *) lt_sed_strip_eq="s,=/,/,g" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[[lt_foo]]++; } + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[[4-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[23]].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[[3-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], + [lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ + LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], + [lt_cv_shlibpath_overrides_runpath=yes])]) + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + ]) + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + +_LT_DECL([], [variables_saved_for_relink], [1], + [Variables whose values should be saved in libtool wrapper scripts and + restored at link time]) +_LT_DECL([], [need_lib_prefix], [0], + [Do we need the "lib" prefix for modules?]) +_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) +_LT_DECL([], [version_type], [0], [Library versioning type]) +_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) +_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) +_LT_DECL([], [shlibpath_overrides_runpath], [0], + [Is shlibpath searched before the hard-coded library search path?]) +_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) +_LT_DECL([], [library_names_spec], [1], + [[List of archive names. First name is the real one, the rest are links. + The last name is the one that the linker finds with -lNAME]]) +_LT_DECL([], [soname_spec], [1], + [[The coded name of the library, if different from the real name]]) +_LT_DECL([], [install_override_mode], [1], + [Permission mode override for installation of shared libraries]) +_LT_DECL([], [postinstall_cmds], [2], + [Command to use after installation of a shared archive]) +_LT_DECL([], [postuninstall_cmds], [2], + [Command to use after uninstallation of a shared archive]) +_LT_DECL([], [finish_cmds], [2], + [Commands used to finish a libtool library installation in a directory]) +_LT_DECL([], [finish_eval], [1], + [[As "finish_cmds", except a single script fragment to be evaled but + not shown]]) +_LT_DECL([], [hardcode_into_libs], [0], + [Whether we should hardcode library paths into libraries]) +_LT_DECL([], [sys_lib_search_path_spec], [2], + [Compile-time system search path for libraries]) +_LT_DECL([], [sys_lib_dlsearch_path_spec], [2], + [Run-time system search path for libraries]) +])# _LT_SYS_DYNAMIC_LINKER + + +# _LT_PATH_TOOL_PREFIX(TOOL) +# -------------------------- +# find a file program which can recognize shared library +AC_DEFUN([_LT_PATH_TOOL_PREFIX], +[m4_require([_LT_DECL_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="m4_if([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +_LT_DECL([], [MAGIC_CMD], [0], + [Used to examine libraries when file_magic_cmd begins with "file"])dnl +])# _LT_PATH_TOOL_PREFIX + +# Old name: +AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) + + +# _LT_PATH_MAGIC +# -------------- +# find a file program which can recognize a shared library +m4_defun([_LT_PATH_MAGIC], +[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# _LT_PATH_MAGIC + + +# LT_PATH_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([LT_PATH_LD], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PROG_ECHO_BACKSLASH])dnl + +AC_ARG_WITH([gnu-ld], + [AS_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[[3-9]]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +_LT_DECL([], [deplibs_check_method], [1], + [Method to check whether dependent libraries are shared objects]) +_LT_DECL([], [file_magic_cmd], [1], + [Command to use when deplibs_check_method = "file_magic"]) +_LT_DECL([], [file_magic_glob], [1], + [How to find potential files when deplibs_check_method = "file_magic"]) +_LT_DECL([], [want_nocaseglob], [1], + [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) +])# _LT_CHECK_MAGIC_METHOD + + +# LT_PATH_NM +# ---------- +# find the pathname to a BSD- or MS-compatible name lister +AC_DEFUN([LT_PATH_NM], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} +fi]) +if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) + case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols" + ;; + *) + DUMPBIN=: + ;; + esac + fi + AC_SUBST([DUMPBIN]) + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm +AC_SUBST([NM]) +_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl + +AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], + [lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) + cat conftest.out >&AS_MESSAGE_LOG_FD + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest*]) +])# LT_PATH_NM + +# Old names: +AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) +AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_PROG_NM], []) +dnl AC_DEFUN([AC_PROG_NM], []) + +# _LT_CHECK_SHAREDLIB_FROM_LINKLIB +# -------------------------------- +# how to determine the name of the shared library +# associated with a specific link library. +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +m4_require([_LT_DECL_DLLTOOL]) +AC_CACHE_CHECK([how to associate runtime and link libraries], +lt_cv_sharedlib_from_linklib_cmd, +[lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh + # decide which to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd="$ECHO" + ;; +esac +]) +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + +_LT_DECL([], [sharedlib_from_linklib_cmd], [1], + [Command to associate shared and link libraries]) +])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB + + +# _LT_PATH_MANIFEST_TOOL +# ---------------------- +# locate the manifest tool +m4_defun([_LT_PATH_MANIFEST_TOOL], +[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], + [lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&AS_MESSAGE_LOG_FD + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest*]) +if test "x$lt_cv_path_mainfest_tool" != xyes; then + MANIFEST_TOOL=: +fi +_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl +])# _LT_PATH_MANIFEST_TOOL + + +# LT_LIB_M +# -------- +# check for math library +AC_DEFUN([LT_LIB_M], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +AC_SUBST([LIBM]) +])# LT_LIB_M + +# Old name: +AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_CHECK_LIBM], []) + + +# _LT_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------- +m4_defun([_LT_COMPILER_NO_RTTI], +[m4_require([_LT_TAG_COMPILER])dnl + +_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + case $cc_basename in + nvcc*) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; + *) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; + esac + + _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], + [Compiler flag to turn off builtin functions]) +])# _LT_COMPILER_NO_RTTI + + +# _LT_CMD_GLOBAL_SYMBOLS +# ---------------------- +m4_defun([_LT_CMD_GLOBAL_SYMBOLS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([LT_PATH_NM])dnl +AC_REQUIRE([LT_PATH_LD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_TAG_COMPILER])dnl + +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function + # and D for any global variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK ['"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx]" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT@&t@_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT@&t@_DLSYM_CONST +#else +# define LT@&t@_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT@&t@_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[[]] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + +_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], + [Take the output of nm and produce a listing of raw symbols and C names]) +_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], + [Transform the output of nm in a proper C declaration]) +_LT_DECL([global_symbol_to_c_name_address], + [lt_cv_sys_global_symbol_to_c_name_address], [1], + [Transform the output of nm in a C name address pair]) +_LT_DECL([global_symbol_to_c_name_address_lib_prefix], + [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], + [Transform the output of nm in a C name address pair when lib prefix is needed]) +_LT_DECL([], [nm_file_list_spec], [1], + [Specify filename containing input files for $NM]) +]) # _LT_CMD_GLOBAL_SYMBOLS + + +# _LT_COMPILER_PIC([TAGNAME]) +# --------------------------- +m4_defun([_LT_COMPILER_PIC], +[m4_require([_LT_TAG_COMPILER])dnl +_LT_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_TAGVAR(lt_prog_compiler_static, $1)= + +m4_if([$1], [CXX], [ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix[[4-9]]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64 which still supported -KPIC. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' + if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + hpux9* | hpux10* | hpux11*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' + _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' + ;; + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + *Sun\ F* | *Sun*Fortran*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + *Intel*\ [[CF]]*Compiler*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + *Portland\ Group*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + rdos*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" + ;; +esac + +AC_CACHE_CHECK([for $compiler option to produce PIC], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], + [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], + [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], + [Additional compiler flags for building library objects]) + +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], + [How to pass a linker flag through the compiler]) +# +# Check to make sure the static flag actually works. +# +wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" +_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) +_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], + [Compiler flag to prevent dynamic linking]) +])# _LT_COMPILER_PIC + + +# _LT_LINKER_SHLIBS([TAGNAME]) +# ---------------------------- +# See if the linker supports building shared libraries. +m4_defun([_LT_LINKER_SHLIBS], +[AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +m4_if([$1], [CXX], [ + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + case $host_os in + aix[[4-9]]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global defined + # symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + ;; + esac + ;; + linux* | k*bsd*-gnu | gnu*) + _LT_TAGVAR(link_all_deplibs, $1)=no + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +], [ + runpath_var= + _LT_TAGVAR(allow_undefined_flag, $1)= + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(archive_cmds, $1)= + _LT_TAGVAR(archive_expsym_cmds, $1)= + _LT_TAGVAR(compiler_needs_object, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(hardcode_automatic, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_separator, $1)= + _LT_TAGVAR(hardcode_minus_L, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(inherit_rpath, $1)=no + _LT_TAGVAR(link_all_deplibs, $1)=unknown + _LT_TAGVAR(module_cmds, $1)= + _LT_TAGVAR(module_expsym_cmds, $1)= + _LT_TAGVAR(old_archive_from_new_cmds, $1)= + _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_TAGVAR(thread_safe_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. +dnl Note also adjust exclude_expsyms for C++ above. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu | gnu*) + _LT_TAGVAR(link_all_deplibs, $1)=no + ;; + esac + + _LT_TAGVAR(ld_shlibs, $1)=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test "$with_gnu_ld" = yes; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; + *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test "$lt_use_gnu_ld_interface" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[[3-9]]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + _LT_TAGVAR(whole_archive_flag_spec, $1)= + tmp_sharedflag='--shared' ;; + xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then + runpath_var= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global + # defined symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + + if test "$GCC" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + _LT_TAGVAR(link_all_deplibs, $1)=no + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + bsdi[[45]]*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + esac + ;; + + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + m4_if($1, [], [ + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + _LT_LINKER_OPTION([if $CC understands -b], + _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], + [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) + ;; + esac + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], + [lt_cv_irix_exported_symbol], + [save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + AC_LINK_IFELSE( + [AC_LANG_SOURCE( + [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], + [C++], [[int foo (void) { return 0; }]], + [Fortran 77], [[ + subroutine foo + end]], + [Fortran], [[ + subroutine foo + end]])])], + [lt_cv_irix_exported_symbol=yes], + [lt_cv_irix_exported_symbol=no]) + LDFLAGS="$save_LDFLAGS"]) + if test "$lt_cv_irix_exported_symbol" = yes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + fi + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='${wl}' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + if test x$host_vendor = xsni; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' + ;; + esac + fi + fi +]) +AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) +test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld + +_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl +_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl +_LT_DECL([], [extract_expsyms_cmds], [2], + [The commands to extract the exported symbol list from a shared archive]) + +# +# Do we need to explicitly link libc? +# +case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_CACHE_CHECK([whether -lc should be explicitly linked in], + [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), + [$RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) + _LT_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) + then + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no + else + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + ]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) + ;; + esac + fi + ;; +esac + +_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], + [Whether or not to add -lc for building shared libraries]) +_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], + [enable_shared_with_static_runtimes], [0], + [Whether or not to disallow shared libs when runtime libs are static]) +_LT_TAGDECL([], [export_dynamic_flag_spec], [1], + [Compiler flag to allow reflexive dlopens]) +_LT_TAGDECL([], [whole_archive_flag_spec], [1], + [Compiler flag to generate shared objects directly from archives]) +_LT_TAGDECL([], [compiler_needs_object], [1], + [Whether the compiler copes with passing no objects directly]) +_LT_TAGDECL([], [old_archive_from_new_cmds], [2], + [Create an old-style archive from a shared archive]) +_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], + [Create a temporary old-style archive to link instead of a shared archive]) +_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) +_LT_TAGDECL([], [archive_expsym_cmds], [2]) +_LT_TAGDECL([], [module_cmds], [2], + [Commands used to build a loadable module if different from building + a shared archive.]) +_LT_TAGDECL([], [module_expsym_cmds], [2]) +_LT_TAGDECL([], [with_gnu_ld], [1], + [Whether we are building with GNU ld or not]) +_LT_TAGDECL([], [allow_undefined_flag], [1], + [Flag that allows shared libraries with undefined symbols to be built]) +_LT_TAGDECL([], [no_undefined_flag], [1], + [Flag that enforces no undefined symbols]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], + [Flag to hardcode $libdir into a binary during linking. + This must work even if $libdir does not exist]) +_LT_TAGDECL([], [hardcode_libdir_separator], [1], + [Whether we need a single "-rpath" flag with a separated argument]) +_LT_TAGDECL([], [hardcode_direct], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary]) +_LT_TAGDECL([], [hardcode_direct_absolute], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary and the resulting library dependency is + "absolute", i.e impossible to change by setting ${shlibpath_var} if the + library is relocated]) +_LT_TAGDECL([], [hardcode_minus_L], [0], + [Set to "yes" if using the -LDIR flag during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_shlibpath_var], [0], + [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_automatic], [0], + [Set to "yes" if building a shared library automatically hardcodes DIR + into the library and all subsequent libraries and executables linked + against it]) +_LT_TAGDECL([], [inherit_rpath], [0], + [Set to yes if linker adds runtime paths of dependent libraries + to runtime path list]) +_LT_TAGDECL([], [link_all_deplibs], [0], + [Whether libtool must link a program against all its dependency libraries]) +_LT_TAGDECL([], [always_export_symbols], [0], + [Set to "yes" if exported symbols are required]) +_LT_TAGDECL([], [export_symbols_cmds], [2], + [The commands to list exported symbols]) +_LT_TAGDECL([], [exclude_expsyms], [1], + [Symbols that should not be listed in the preloaded symbols]) +_LT_TAGDECL([], [include_expsyms], [1], + [Symbols that must always be exported]) +_LT_TAGDECL([], [prelink_cmds], [2], + [Commands necessary for linking programs (against libraries) with templates]) +_LT_TAGDECL([], [postlink_cmds], [2], + [Commands necessary for finishing linking programs]) +_LT_TAGDECL([], [file_list_spec], [1], + [Specify filename containing input files]) +dnl FIXME: Not yet implemented +dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], +dnl [Compiler flag to generate thread safe objects]) +])# _LT_LINKER_SHLIBS + + +# _LT_LANG_C_CONFIG([TAG]) +# ------------------------ +# Ensure that the configuration variables for a C compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to `libtool'. +m4_defun([_LT_LANG_C_CONFIG], +[m4_require([_LT_DECL_EGREP])dnl +lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + +_LT_TAG_COMPILER +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + LT_SYS_DLOPEN_SELF + _LT_CMD_STRIPLIB + + # Report which library types will actually be built + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_CONFIG($1) +fi +AC_LANG_POP +CC="$lt_save_CC" +])# _LT_LANG_C_CONFIG + + +# _LT_LANG_CXX_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a C++ compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to `libtool'. +m4_defun([_LT_LANG_CXX_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_PROG_CXXCPP +else + _lt_caught_CXX_error=yes +fi + +AC_LANG_PUSH(C++) +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(compiler_needs_object, $1)=no +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_caught_CXX_error" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + else + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + fi + + if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + LT_PATH_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) + _LT_TAGVAR(ld_shlibs, $1)=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + + if test "$GXX" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty + # executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared + # libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + freebsd-elf*) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + hpux9*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' + fi + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) + _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + openbsd2*) + # C++ shared libraries are fairly broken + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + case $host in + osf3*) + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + ;; + *) + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ + $RM $lib.exp' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + case $host in + osf3*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ + '"$_LT_TAGVAR(old_archive_cmds, $1)" + _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ + '"$_LT_TAGVAR(reload_cmds, $1)" + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) + test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + + _LT_TAGVAR(GCC, $1)="$GXX" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test "$_lt_caught_CXX_error" != yes + +AC_LANG_POP +])# _LT_LANG_CXX_CONFIG + + +# _LT_FUNC_STRIPNAME_CNF +# ---------------------- +# func_stripname_cnf prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# +# This function is identical to the (non-XSI) version of func_stripname, +# except this one can be used by m4 code that may be executed by configure, +# rather than the libtool script. +m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl +AC_REQUIRE([_LT_DECL_SED]) +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) +func_stripname_cnf () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + esac +} # func_stripname_cnf +])# _LT_FUNC_STRIPNAME_CNF + +# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) +# --------------------------------- +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +m4_defun([_LT_SYS_HIDDEN_LIBDEPS], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl +# Dependencies to place before and after the object being linked: +_LT_TAGVAR(predep_objects, $1)= +_LT_TAGVAR(postdep_objects, $1)= +_LT_TAGVAR(predeps, $1)= +_LT_TAGVAR(postdeps, $1)= +_LT_TAGVAR(compiler_lib_search_path, $1)= + +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF +int a; +void foo (void) { a = 0; } +_LT_EOF +], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF +], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer*4 a + a=0 + return + end +_LT_EOF +], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer a + a=0 + return + end +_LT_EOF +], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF +public class foo { + private int a; + public void bar (void) { + a = 0; + } +}; +_LT_EOF +], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF +package foo +func foo() { +} +_LT_EOF +]) + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +dnl Parse the compiler output and extract the necessary +dnl objects, libraries and library flags. +if AC_TRY_EVAL(ac_compile); then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case ${prev}${p} in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" || + test $p = "-R"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test "$pre_test_object_deps_done" = no; then + case ${prev} in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then + _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" + else + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$_LT_TAGVAR(postdeps, $1)"; then + _LT_TAGVAR(postdeps, $1)="${prev}${p}" + else + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$_LT_TAGVAR(predep_objects, $1)"; then + _LT_TAGVAR(predep_objects, $1)="$p" + else + _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" + fi + else + if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then + _LT_TAGVAR(postdep_objects, $1)="$p" + else + _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling $1 test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +m4_if([$1], [CXX], +[case $host_os in +interix[[3-9]]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_TAGVAR(predep_objects,$1)= + _LT_TAGVAR(postdep_objects,$1)= + _LT_TAGVAR(postdeps,$1)= + ;; + +linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + if test "$solaris_use_stlport4" != yes; then + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC* | sunCC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + if test "$solaris_use_stlport4" != yes; then + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac +]) + +case " $_LT_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac + _LT_TAGVAR(compiler_lib_search_dirs, $1)= +if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then + _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi +_LT_TAGDECL([], [compiler_lib_search_dirs], [1], + [The directories searched by this compiler when creating a shared library]) +_LT_TAGDECL([], [predep_objects], [1], + [Dependencies to place before and after the objects being linked to + create a shared library]) +_LT_TAGDECL([], [postdep_objects], [1]) +_LT_TAGDECL([], [predeps], [1]) +_LT_TAGDECL([], [postdeps], [1]) +_LT_TAGDECL([], [compiler_lib_search_path], [1], + [The library search path used internally by the compiler when linking + a shared library]) +])# _LT_SYS_HIDDEN_LIBDEPS + + +# _LT_LANG_F77_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a Fortran 77 compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_F77_CONFIG], +[AC_LANG_PUSH(Fortran 77) +if test -z "$F77" || test "X$F77" = "Xno"; then + _lt_disable_F77=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the F77 compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_F77" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${F77-"f77"} + CFLAGS=$FFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + GCC=$G77 + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)="$G77" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC="$lt_save_CC" + CFLAGS="$lt_save_CFLAGS" +fi # test "$_lt_disable_F77" != yes + +AC_LANG_POP +])# _LT_LANG_F77_CONFIG + + +# _LT_LANG_FC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for a Fortran compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_FC_CONFIG], +[AC_LANG_PUSH(Fortran) + +if test -z "$FC" || test "X$FC" = "Xno"; then + _lt_disable_FC=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for fc test sources. +ac_ext=${ac_fc_srcext-f} + +# Object file extension for compiled fc test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the FC compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_FC" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${FC-"f95"} + CFLAGS=$FCFLAGS + compiler=$CC + GCC=$ac_cv_fc_compiler_gnu + + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test "$_lt_disable_FC" != yes + +AC_LANG_POP +])# _LT_LANG_FC_CONFIG + + +# _LT_LANG_GCJ_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Java Compiler compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_GCJ_CONFIG], +[AC_REQUIRE([LT_PROG_GCJ])dnl +AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GCJ-"gcj"} +CFLAGS=$GCJFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)="$LD" +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GCJ_CONFIG + + +# _LT_LANG_GO_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Go compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_GO_CONFIG], +[AC_REQUIRE([LT_PROG_GO])dnl +AC_LANG_SAVE + +# Source file extension for Go test sources. +ac_ext=go + +# Object file extension for compiled Go test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="package main; func main() { }" + +# Code to be used in simple link tests +lt_simple_link_test_code='package main; func main() { }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GOC-"gccgo"} +CFLAGS=$GOFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)="$LD" +_LT_CC_BASENAME([$compiler]) + +# Go did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GO_CONFIG + + +# _LT_LANG_RC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for the Windows resource compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_RC_CONFIG], +[AC_REQUIRE([LT_PROG_RC])dnl +AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code="$lt_simple_compile_test_code" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC= +CC=${RC-"windres"} +CFLAGS= +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +if test -n "$compiler"; then + : + _LT_CONFIG($1) +fi + +GCC=$lt_save_GCC +AC_LANG_RESTORE +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_RC_CONFIG + + +# LT_PROG_GCJ +# ----------- +AC_DEFUN([LT_PROG_GCJ], +[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], + [AC_CHECK_TOOL(GCJ, gcj,) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS)])])[]dnl +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_GCJ], []) + + +# LT_PROG_GO +# ---------- +AC_DEFUN([LT_PROG_GO], +[AC_CHECK_TOOL(GOC, gccgo,) +]) + + +# LT_PROG_RC +# ---------- +AC_DEFUN([LT_PROG_RC], +[AC_CHECK_TOOL(RC, windres,) +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_RC], []) + + +# _LT_DECL_EGREP +# -------------- +# If we don't have a new enough Autoconf to choose the best grep +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_EGREP], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_REQUIRE([AC_PROG_FGREP])dnl +test -z "$GREP" && GREP=grep +_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) +_LT_DECL([], [EGREP], [1], [An ERE matcher]) +_LT_DECL([], [FGREP], [1], [A literal string matcher]) +dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too +AC_SUBST([GREP]) +]) + + +# _LT_DECL_OBJDUMP +# -------------- +# If we don't have a new enough Autoconf to choose the best objdump +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_OBJDUMP], +[AC_CHECK_TOOL(OBJDUMP, objdump, false) +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) +AC_SUBST([OBJDUMP]) +]) + +# _LT_DECL_DLLTOOL +# ---------------- +# Ensure DLLTOOL variable is set. +m4_defun([_LT_DECL_DLLTOOL], +[AC_CHECK_TOOL(DLLTOOL, dlltool, false) +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program]) +AC_SUBST([DLLTOOL]) +]) + +# _LT_DECL_SED +# ------------ +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +m4_defun([_LT_DECL_SED], +[AC_PROG_SED +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" +_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) +_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], + [Sed that helps us avoid accidentally triggering echo(1) options like -n]) +])# _LT_DECL_SED + +m4_ifndef([AC_PROG_SED], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ + +m4_defun([AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +IFS=$as_save_IFS +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_SUBST([SED]) +AC_MSG_RESULT([$SED]) +])#AC_PROG_SED +])#m4_ifndef + +# Old name: +AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_SED], []) + + +# _LT_CHECK_SHELL_FEATURES +# ------------------------ +# Find out whether the shell is Bourne or XSI compatible, +# or has some other useful features. +m4_defun([_LT_CHECK_SHELL_FEATURES], +[AC_MSG_CHECKING([whether the shell understands some XSI constructs]) +# Try some XSI features +xsi_shell=no +( _lt_dummy="a/b/c" + test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ + = c,a/b,b/c, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes +AC_MSG_RESULT([$xsi_shell]) +_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) + +AC_MSG_CHECKING([whether the shell understands "+="]) +lt_shell_append=no +( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ + >/dev/null 2>&1 \ + && lt_shell_append=yes +AC_MSG_RESULT([$lt_shell_append]) +_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi +_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac +_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl +_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl +])# _LT_CHECK_SHELL_FEATURES + + +# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) +# ------------------------------------------------------ +# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and +# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. +m4_defun([_LT_PROG_FUNCTION_REPLACE], +[dnl { +sed -e '/^$1 ()$/,/^} # $1 /c\ +$1 ()\ +{\ +m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) +} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: +]) + + +# _LT_PROG_REPLACE_SHELLFNS +# ------------------------- +# Replace existing portable implementations of several shell functions with +# equivalent extended shell implementations where those features are available.. +m4_defun([_LT_PROG_REPLACE_SHELLFNS], +[if test x"$xsi_shell" = xyes; then + _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac]) + + _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl + func_basename_result="${1##*/}"]) + + _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac + func_basename_result="${1##*/}"]) + + _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary parameter first. + func_stripname_result=${3} + func_stripname_result=${func_stripname_result#"${1}"} + func_stripname_result=${func_stripname_result%"${2}"}]) + + _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl + func_split_long_opt_name=${1%%=*} + func_split_long_opt_arg=${1#*=}]) + + _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) + + _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl + case ${1} in + *.lo) func_lo2o_result=${1%.lo}.${objext} ;; + *) func_lo2o_result=${1} ;; + esac]) + + _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) + + _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) + + _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) +fi + +if test x"$lt_shell_append" = xyes; then + _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) + + _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl + func_quote_for_eval "${2}" +dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ + eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) + + # Save a `func_append' function call where possible by direct use of '+=' + sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +else + # Save a `func_append' function call even when '+=' is not available + sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +fi + +if test x"$_lt_function_replace_fail" = x":"; then + AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) +fi +]) + +# _LT_PATH_CONVERSION_FUNCTIONS +# ----------------------------- +# Determine which file name conversion functions should be used by +# func_to_host_file (and, implicitly, by func_to_host_path). These are needed +# for certain cross-compile configurations and native mingw. +m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_MSG_CHECKING([how to convert $build file names to $host format]) +AC_CACHE_VAL(lt_cv_to_host_file_cmd, +[case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac +]) +to_host_file_cmd=$lt_cv_to_host_file_cmd +AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) +_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], + [0], [convert $build file names to $host format])dnl + +AC_MSG_CHECKING([how to convert $build file names to toolchain format]) +AC_CACHE_VAL(lt_cv_to_tool_file_cmd, +[#assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac +]) +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) +_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], + [0], [convert $build files to toolchain format])dnl +])# _LT_PATH_CONVERSION_FUNCTIONS diff --git a/coinhsl/m4/ltoptions.m4 b/coinhsl/m4/ltoptions.m4 new file mode 100644 index 0000000..5d9acd8 --- /dev/null +++ b/coinhsl/m4/ltoptions.m4 @@ -0,0 +1,384 @@ +# Helper functions for option handling. -*- Autoconf -*- +# +# Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 7 ltoptions.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) + + +# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) +# ------------------------------------------ +m4_define([_LT_MANGLE_OPTION], +[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) + + +# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) +# --------------------------------------- +# Set option OPTION-NAME for macro MACRO-NAME, and if there is a +# matching handler defined, dispatch to it. Other OPTION-NAMEs are +# saved as a flag. +m4_define([_LT_SET_OPTION], +[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl +m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), + _LT_MANGLE_DEFUN([$1], [$2]), + [m4_warning([Unknown $1 option `$2'])])[]dnl +]) + + +# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) +# ------------------------------------------------------------ +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +m4_define([_LT_IF_OPTION], +[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) + + +# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) +# ------------------------------------------------------- +# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME +# are set. +m4_define([_LT_UNLESS_OPTIONS], +[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), + [m4_define([$0_found])])])[]dnl +m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 +])[]dnl +]) + + +# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) +# ---------------------------------------- +# OPTION-LIST is a space-separated list of Libtool options associated +# with MACRO-NAME. If any OPTION has a matching handler declared with +# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about +# the unknown option and exit. +m4_defun([_LT_SET_OPTIONS], +[# Set options +m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [_LT_SET_OPTION([$1], _LT_Option)]) + +m4_if([$1],[LT_INIT],[ + dnl + dnl Simply set some default values (i.e off) if boolean options were not + dnl specified: + _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no + ]) + _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no + ]) + dnl + dnl If no reference was made to various pairs of opposing options, then + dnl we run the default mode handler for the pair. For example, if neither + dnl `shared' nor `disable-shared' was passed, we enable building of shared + dnl archives by default: + _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) + _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], + [_LT_ENABLE_FAST_INSTALL]) + ]) +])# _LT_SET_OPTIONS + + +## --------------------------------- ## +## Macros to handle LT_INIT options. ## +## --------------------------------- ## + +# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) +# ----------------------------------------- +m4_define([_LT_MANGLE_DEFUN], +[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) + + +# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) +# ----------------------------------------------- +m4_define([LT_OPTION_DEFINE], +[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl +])# LT_OPTION_DEFINE + + +# dlopen +# ------ +LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes +]) + +AU_DEFUN([AC_LIBTOOL_DLOPEN], +[_LT_SET_OPTION([LT_INIT], [dlopen]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `dlopen' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) + + +# win32-dll +# --------- +# Declare package support for building win32 dll's. +LT_OPTION_DEFINE([LT_INIT], [win32-dll], +[enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; +esac + +test -z "$AS" && AS=as +_LT_DECL([], [AS], [1], [Assembler program])dnl + +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl + +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl +])# win32-dll + +AU_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +_LT_SET_OPTION([LT_INIT], [win32-dll]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `win32-dll' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) + + +# _LT_ENABLE_SHARED([DEFAULT]) +# ---------------------------- +# implement the --enable-shared flag, and supports the `shared' and +# `disable-shared' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_SHARED], +[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([shared], + [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) + + _LT_DECL([build_libtool_libs], [enable_shared], [0], + [Whether or not to build shared libraries]) +])# _LT_ENABLE_SHARED + +LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) +]) + +AC_DEFUN([AC_DISABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], [disable-shared]) +]) + +AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_SHARED], []) +dnl AC_DEFUN([AM_DISABLE_SHARED], []) + + + +# _LT_ENABLE_STATIC([DEFAULT]) +# ---------------------------- +# implement the --enable-static flag, and support the `static' and +# `disable-static' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_STATIC], +[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([static], + [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]_LT_ENABLE_STATIC_DEFAULT) + + _LT_DECL([build_old_libs], [enable_static], [0], + [Whether or not to build static libraries]) +])# _LT_ENABLE_STATIC + +LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) +]) + +AC_DEFUN([AC_DISABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], [disable-static]) +]) + +AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_STATIC], []) +dnl AC_DEFUN([AM_DISABLE_STATIC], []) + + + +# _LT_ENABLE_FAST_INSTALL([DEFAULT]) +# ---------------------------------- +# implement the --enable-fast-install flag, and support the `fast-install' +# and `disable-fast-install' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_FAST_INSTALL], +[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([fast-install], + [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) + +_LT_DECL([fast_install], [enable_fast_install], [0], + [Whether or not to optimize for fast installation])dnl +])# _LT_ENABLE_FAST_INSTALL + +LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) + +# Old names: +AU_DEFUN([AC_ENABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `fast-install' option into LT_INIT's first parameter.]) +]) + +AU_DEFUN([AC_DISABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `disable-fast-install' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) +dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) + + +# _LT_WITH_PIC([MODE]) +# -------------------- +# implement the --with-pic flag, and support the `pic-only' and `no-pic' +# LT_INIT options. +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +m4_define([_LT_WITH_PIC], +[AC_ARG_WITH([pic], + [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for lt_pkg in $withval; do + IFS="$lt_save_ifs" + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [pic_mode=default]) + +test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) + +_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl +])# _LT_WITH_PIC + +LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) + +# Old name: +AU_DEFUN([AC_LIBTOOL_PICMODE], +[_LT_SET_OPTION([LT_INIT], [pic-only]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `pic-only' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) + +## ----------------- ## +## LTDL_INIT Options ## +## ----------------- ## + +m4_define([_LTDL_MODE], []) +LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], + [m4_define([_LTDL_MODE], [nonrecursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [recursive], + [m4_define([_LTDL_MODE], [recursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [subproject], + [m4_define([_LTDL_MODE], [subproject])]) + +m4_define([_LTDL_TYPE], []) +LT_OPTION_DEFINE([LTDL_INIT], [installable], + [m4_define([_LTDL_TYPE], [installable])]) +LT_OPTION_DEFINE([LTDL_INIT], [convenience], + [m4_define([_LTDL_TYPE], [convenience])]) diff --git a/coinhsl/m4/ltsugar.m4 b/coinhsl/m4/ltsugar.m4 new file mode 100644 index 0000000..9000a05 --- /dev/null +++ b/coinhsl/m4/ltsugar.m4 @@ -0,0 +1,123 @@ +# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- +# +# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 6 ltsugar.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) + + +# lt_join(SEP, ARG1, [ARG2...]) +# ----------------------------- +# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their +# associated separator. +# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier +# versions in m4sugar had bugs. +m4_define([lt_join], +[m4_if([$#], [1], [], + [$#], [2], [[$2]], + [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) +m4_define([_lt_join], +[m4_if([$#$2], [2], [], + [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) + + +# lt_car(LIST) +# lt_cdr(LIST) +# ------------ +# Manipulate m4 lists. +# These macros are necessary as long as will still need to support +# Autoconf-2.59 which quotes differently. +m4_define([lt_car], [[$1]]) +m4_define([lt_cdr], +[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], + [$#], 1, [], + [m4_dquote(m4_shift($@))])]) +m4_define([lt_unquote], $1) + + +# lt_append(MACRO-NAME, STRING, [SEPARATOR]) +# ------------------------------------------ +# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. +# Note that neither SEPARATOR nor STRING are expanded; they are appended +# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). +# No SEPARATOR is output if MACRO-NAME was previously undefined (different +# than defined and empty). +# +# This macro is needed until we can rely on Autoconf 2.62, since earlier +# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. +m4_define([lt_append], +[m4_define([$1], + m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) + + + +# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) +# ---------------------------------------------------------- +# Produce a SEP delimited list of all paired combinations of elements of +# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list +# has the form PREFIXmINFIXSUFFIXn. +# Needed until we can rely on m4_combine added in Autoconf 2.62. +m4_define([lt_combine], +[m4_if(m4_eval([$# > 3]), [1], + [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl +[[m4_foreach([_Lt_prefix], [$2], + [m4_foreach([_Lt_suffix], + ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, + [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) + + +# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) +# ----------------------------------------------------------------------- +# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited +# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. +m4_define([lt_if_append_uniq], +[m4_ifdef([$1], + [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], + [lt_append([$1], [$2], [$3])$4], + [$5])], + [lt_append([$1], [$2], [$3])$4])]) + + +# lt_dict_add(DICT, KEY, VALUE) +# ----------------------------- +m4_define([lt_dict_add], +[m4_define([$1($2)], [$3])]) + + +# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) +# -------------------------------------------- +m4_define([lt_dict_add_subkey], +[m4_define([$1($2:$3)], [$4])]) + + +# lt_dict_fetch(DICT, KEY, [SUBKEY]) +# ---------------------------------- +m4_define([lt_dict_fetch], +[m4_ifval([$3], + m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), + m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) + + +# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) +# ----------------------------------------------------------------- +m4_define([lt_if_dict_fetch], +[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], + [$5], + [$6])]) + + +# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) +# -------------------------------------------------------------- +m4_define([lt_dict_filter], +[m4_if([$5], [], [], + [lt_join(m4_quote(m4_default([$4], [[, ]])), + lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), + [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl +]) diff --git a/coinhsl/m4/ltversion.m4 b/coinhsl/m4/ltversion.m4 new file mode 100644 index 0000000..07a8602 --- /dev/null +++ b/coinhsl/m4/ltversion.m4 @@ -0,0 +1,23 @@ +# ltversion.m4 -- version numbers -*- Autoconf -*- +# +# Copyright (C) 2004 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# @configure_input@ + +# serial 3337 ltversion.m4 +# This file is part of GNU Libtool + +m4_define([LT_PACKAGE_VERSION], [2.4.2]) +m4_define([LT_PACKAGE_REVISION], [1.3337]) + +AC_DEFUN([LTVERSION_VERSION], +[macro_version='2.4.2' +macro_revision='1.3337' +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +_LT_DECL(, macro_revision, 0) +]) diff --git a/coinhsl/m4/lt~obsolete.m4 b/coinhsl/m4/lt~obsolete.m4 new file mode 100644 index 0000000..c573da9 --- /dev/null +++ b/coinhsl/m4/lt~obsolete.m4 @@ -0,0 +1,98 @@ +# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- +# +# Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004. +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 5 lt~obsolete.m4 + +# These exist entirely to fool aclocal when bootstrapping libtool. +# +# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) +# which have later been changed to m4_define as they aren't part of the +# exported API, or moved to Autoconf or Automake where they belong. +# +# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN +# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us +# using a macro with the same name in our local m4/libtool.m4 it'll +# pull the old libtool.m4 in (it doesn't see our shiny new m4_define +# and doesn't know about Autoconf macros at all.) +# +# So we provide this file, which has a silly filename so it's always +# included after everything else. This provides aclocal with the +# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything +# because those macros already exist, or will be overwritten later. +# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. +# +# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. +# Yes, that means every name once taken will need to remain here until +# we give up compatibility with versions before 1.7, at which point +# we need to keep only those names which we still refer to. + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) + +m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) +m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) +m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) +m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) +m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) +m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) +m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) +m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) +m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) +m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) +m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) +m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) +m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) +m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) +m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) +m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) +m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) +m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) +m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) +m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) +m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) +m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) +m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) +m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) +m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) +m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) +m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) +m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) +m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) +m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) +m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) +m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) +m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) +m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) +m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) +m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) +m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) +m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) +m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) +m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) +m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) +m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) +m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) +m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) +m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) +m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) +m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) +m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) +m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) +m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) diff --git a/coinhsl/ma27/.deps/.dirstamp b/coinhsl/ma27/.deps/.dirstamp new file mode 100644 index 0000000..e69de29 diff --git a/coinhsl/ma27/.dirstamp b/coinhsl/ma27/.dirstamp new file mode 100644 index 0000000..e69de29 diff --git a/coinhsl/ma27/.libs/ma27d.o b/coinhsl/ma27/.libs/ma27d.o new file mode 100644 index 0000000000000000000000000000000000000000..f3c67e2b4d137443a023552a9bc426dcc4064457 GIT binary patch literal 47016 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 Dm=E;) literal 0 HcmV?d00001 diff --git a/coinhsl/ma27/ma27d.f b/coinhsl/ma27/ma27d.f new file mode 100644 index 0000000..c5d5479 --- /dev/null +++ b/coinhsl/ma27/ma27d.f @@ -0,0 +1,3471 @@ +* COPYRIGHT (c) 1982 AEA Technology +*######DATE 20 September 2001 +C September 2001: threadsafe version of MA27 +C 19/3/03. Array ICNTL in MA27GD made assumed size. + + SUBROUTINE MA27ID(ICNTL,CNTL) + INTEGER ICNTL(30) + DOUBLE PRECISION CNTL(5) + + INTEGER IFRLVL + PARAMETER ( IFRLVL=5 ) + +C Stream number for error messages + ICNTL(1) = 6 +C Stream number for diagnostic messages + ICNTL(2) = 6 +C Control the level of diagnostic printing. +C 0 no printing +C 1 printing of scalar parameters and first parts of arrays. +C 2 printing of scalar parameters and whole of arrays. + ICNTL(3) = 0 +C The largest integer such that all integers I in the range +C -ICNTL(4).LE.I.LE.ICNTL(4) can be handled by the shortest integer +C type in use. + ICNTL(4) = 2139062143 +C Minimum number of eliminations in a step that is automatically +C accepted. if two adjacent steps can be combined and each has less +C eliminations then they are combined. + ICNTL(5) = 1 +C Control whether direct or indirect access is used by MA27C/CD. +C Indirect access is employed in forward and back substitution +C respectively if the size of a block is less than +C ICNTL(IFRLVL+MIN(10,NPIV)) and ICNTL(IFRLVL+10+MIN(10,NPIV)) +C respectively, where NPIV is the number of pivots in the block. + ICNTL(IFRLVL+1) = 32639 + ICNTL(IFRLVL+2) = 32639 + ICNTL(IFRLVL+3) = 32639 + ICNTL(IFRLVL+4) = 32639 + ICNTL(IFRLVL+5) = 14 + ICNTL(IFRLVL+6) = 9 + ICNTL(IFRLVL+7) = 8 + ICNTL(IFRLVL+8) = 8 + ICNTL(IFRLVL+9) = 9 + ICNTL(IFRLVL+10) = 10 + ICNTL(IFRLVL+11) = 32639 + ICNTL(IFRLVL+12) = 32639 + ICNTL(IFRLVL+13) = 32639 + ICNTL(IFRLVL+14) = 32689 + ICNTL(IFRLVL+15) = 24 + ICNTL(IFRLVL+16) = 11 + ICNTL(IFRLVL+17) = 9 + ICNTL(IFRLVL+18) = 8 + ICNTL(IFRLVL+19) = 9 + ICNTL(IFRLVL+20) = 10 +C Not used + ICNTL(26) = 0 + ICNTL(27) = 0 + ICNTL(28) = 0 + ICNTL(29) = 0 + ICNTL(30) = 0 + +C Control threshold pivoting. + CNTL(1) = 0.1D0 +C If a column of the reduced matrix has relative density greater than +C CNTL(2), it is forced into the root. All such columns are taken to +C have sparsity pattern equal to their merged patterns, so the fill +C and operation counts may be overestimated. + CNTL(2) = 1.0D0 +C An entry with absolute value less than CNTL(3) is never accepted as +C a 1x1 pivot or as the off-diagonal of a 2x2 pivot. + CNTL(3) = 0.0D0 +C Not used + CNTL(4) = 0.0 + CNTL(5) = 0.0 + + RETURN + END + + SUBROUTINE MA27AD(N,NZ,IRN,ICN,IW,LIW,IKEEP,IW1,NSTEPS,IFLAG, + + ICNTL,CNTL,INFO,OPS) +C THIS SUBROUTINE COMPUTES A MINIMUM DEGREE ORDERING OR ACCEPTS A GIVEN +C ORDERING. IT COMPUTES ASSOCIATED ASSEMBLY AND ELIMINATION +C INFORMATION FOR MA27B/BD. +C N MUST BE SET TO THE MATRIX ORDER. IT IS NOT ALTERED. +C NZ MUST BE SET TO THE NUMBER OF NON-ZEROS INPUT. IT IS NOT +C ALTERED. +C IRN(I),I=1,2,...,NZ MUST BE SET TO THE ROW NUMBERS OF THE +C NON-ZEROS. IT IS NOT ALTERED UNLESS IT IS EQUIVALENCED +C TO IW (SEE DESCRIPTION OF IW). +C ICN(I),I=1,2,...,NZ MUST BE SET TO THE COLUMN NUMBERS OF THE +C NON-ZEROS. IT IS NOT ALTERED UNLESS IT IS EQUIVALENCED +C TO IW (SEE DESCRIPTION OF IW). +C IW NEED NOT BE SET ON INPUT. IT IS USED FOR WORKSPACE. +C IRN(1) MAY BE EQUIVALENCED TO IW(1) AND ICN(1) MAY BE +C EQUIVALENCED TO IW(K), WHERE K.GT.NZ. +C LIW MUST BE SET TO THE LENGTH OF IW. IT MUST BE AT LEAST 2*NZ+3*N +C FOR THE IFLAG=0 ENTRY AND AT LEAST NZ+3*N FOR THE IFLAG=1 +C ENTRY. IT IS NOT ALTERED. +C IKEEP NEED NOT BE SET UNLESS AN ORDERING IS GIVEN, IN WHICH CASE +C IKEEP(I,1) MUST BE SET TO THE POSITION OF VARIABLE I IN THE +C ORDER. ON OUTPUT IKEEP CONTAINS INFORMATION NEEDED BY MA27B/BD. +C IKEEP(I,1) HOLDS THE POSITION OF VARIABLE I IN THE PIVOT ORDER. +C IKEEP(I,2), IKEEP(I,3) HOLD THE NUMBER OF ELIMINATIONS, ASSEMBLIES +C AT MAJOR STEP I, I=1,2,...,NSTEPS. NOTE THAT WHEN AN ORDER IS +C GIVEN IT MAY BE REPLACED BY ANOTHER ORDER THAT GIVES IDENTICAL +C NUMERICAL RESULTS. +C IW1 IS USED FOR WORKSPACE. +C NSTEPS NEED NOT BE SET. ON OUTPUT IT CONTAINS THE NUMBER OF MAJOR +C STEPS NEEDED FOR A DEFINITE MATRIX AND MUST BE PASSED UNCHANGED +C TO MA27B/BD. +C IFLAG MUST SET TO ZERO IF THE USER WANTS THE PIVOT ORDER CHOSEN +C AUTOMATICALLY AND TO ONE IF HE WANTS TO SPECIFY IT IN IKEEP. +C ICNTL is an INTEGER array of length 30 containing user options +C with integer values (defaults set in MA27I/ID) +C ICNTL(1) (LP) MUST BE SET TO THE STREAM NUMBER FOR ERROR MESSAGES. +C ERROR MESSAGES ARE SUPPRESSED IF ICNTL(1) IS NOT POSITIVE. +C IT IS NOT ALTERED. +C ICNTL(2) (MP) MUST BE SET TO THE STREAM NUMBER FOR DIAGNOSTIC +C MESSAGES. DIAGNOSTIC MESSAGES ARE SUPPRESSED IF ICNTL(2) IS NOT +C POSITIVE. IT IS NOT ALTERED. +C ICNTL(3) (LDIAG) CONTROLS THE LEVEL OF DIAGNOSTIC PRINTING. +C 0 NO PRINTING +C 1 PRINTING OF SCALAR PARAMETERS AND FIRST PARTS OF ARRAYS. +C 2 PRINTING OF SCALAR PARAMETERS AND WHOLE OF ARRAYS. +C ICNTL(4) (IOVFLO) IS THE LARGEST INTEGER SUCH THAT ALL INTEGERS +C I IN THE RANGE -IOVFLO.LE.I.LE.IOVFLO CAN BE HANDLED BY THE +C SHORTEST INTEGER TYPE IN USE. +C ICNT(5) (NEMIN) MUST BE SET TO THE MINIMUM NUMBER OF ELIMINATIONS +C IN A STEP THAT IS AUTOMATICALLY ACCEPTED. IF TWO ADJACENT STEPS +C CAN BE COMBINED AND EACH HAS LESS ELIMINATIONS THEN THEY ARE +C COMBINED. +C ICNTL(IFRLVL+I) I=1,20, (IFRLVL) MUST BE SET TO CONTROL WHETHER +C DIRECT OR INDIRECT ACCESS IS USED BY MA27C/CD. INDIRECT ACCESS +C IS EMPLOYED IN FORWARD AND BACK SUBSTITUTION RESPECTIVELY IF THE +C SIZE OF A BLOCK IS LESS THAN ICNTL(IFRLVL+(MIN(10,NPIV)) AND +C ICNTL(IFRLVL+10+MIN(10,NPIV)) RESPECTIVELY, WHERE NPIV IS THE +C NUMBER OF PIVOTS IN THE BLOCK. +C ICNTL(I) I=26,30 are not used. +C CNTL is an DOUBLE PRECISION array of length 5 containing user options +C with real values (defaults set in MA27I/ID) +C CNTL(1) (U) IS USED TO CONTROL THRESHOLD PIVOTING. IT IS NOT +C ALTERED. +C CNTL(2) (FRATIO) has default value 1.0. If a column of the +C reduced matrix has relative density greater than CNTL(2), it +C is forced into the root. All such columns are taken to have +C sparsity pattern equal to their merged patterns, so the fill +C and operation counts may be overestimated. +C CNTL(3) (PIVTOL) has default value 0.0. An entry with absolute +C value less than CNTL(3) is never accepted as a 1x1 pivot or +C as the off-diagonal of a 2x2 pivot. +C CNTL(I) I=4,5 are not used. +C INFO is an INTEGER array of length 20 which is used to return +C information to the user. +C INFO(1) (IFLAG) is an error return code, zero for success, greater +C than zero for a warning and less than zero for errors, see +C INFO(2). +C INFO(2) (IERROR) HOLDS ADDITIONAL INFORMATION IN THE EVENT OF ERRORS. +C IF INFO(1)=-3 INFO(2) HOLDS A LENGTH THAT MAY SUFFICE FOR IW. +C IF INFO(1)=-4 INFO(2) HOLDS A LENGTH THAT MAY SUFFICE FOR A. +C IF INFO(1)=-5 INFO(2) IS SET TO THE PIVOT STEP AT WHICH SINGULARITY +C WAS DETECTED. +C IF INFO(1)=-6 INFO(2) IS SET TO THE PIVOT STEP AT WHICH A CHANGE OF +C PIVOT SIGN WAS FOUND. +C IF INFO(1)= 1 INFO(2) HOLDS THE NUMBER OF FAULTY ENTRIES. +C IF INFO(1)= 2 INFO(2) IS SET TO THE NUMBER OF SIGNS CHANGES IN +C THE PIVOTS. +C IF INFO(1)=3 INFO(2) IS SET TO THE RANK OF THE MATRIX. +C INFO(3) and INFO(4) (NRLTOT and NIRTOT) REAL AND INTEGER STRORAGE +C RESPECTIVELY REQUIRED FOR THE FACTORIZATION IF NO COMPRESSES ARE +C ALLOWED. +C INFO(5) and INFO(6) (NRLNEC and NIRNEC) REAL AND INTEGER STORAGE +C RESPECTIVELY REQUIRED FOR THE FACTORIZATION IF COMPRESSES ARE +C ALLOWED AND THE MATRIX IS DEFINITE. +C INFO(7) and INFO(8) (NRLADU and NIRADU) REAL AND INTEGER STORAGE +C RESPECTIVELY FOR THE MATRIX FACTORS AS CALCULATED BY MA27A/AD +C FOR THE DEFINITE CASE. +C INFO(9) and INFO(10) (NRLBDU and NIRBDU) REAL AND INTEGER STORAGE +C RESPECTIVELY FOR THE MATRIX FACTORS AS FOUND BY MA27B/BD. +C INFO(11) (NCMPA) ACCUMULATES THE NUMBER OF TIMES THE ARRAY IW IS +C COMPRESSED BY MA27A/AD. +C INFO(12) and INFO(13) (NCMPBR and NCMPBI) ACCUMULATE THE NUMBER +C OF COMPRESSES OF THE REALS AND INTEGERS PERFORMED BY MA27B/BD. +C INFO(14) (NTWO) IS USED BY MA27B/BD TO RECORD THE NUMBER OF 2*2 +C PIVOTS USED. +C INFO(15) (NEIG) IS USED BY ME27B/BD TO RECORD THE NUMBER OF +C NEGATIVE EIGENVALUES OF A. +C INFO(16) to INFO(20) are not used. +C OPS ACCUMULATES THE NO. OF MULTIPLY/ADD PAIRS NEEDED TO CREATE THE +C TRIANGULAR FACTORIZATION, IN THE DEFINITE CASE. +C +C .. Scalar Arguments .. + INTEGER IFLAG,LIW,N,NSTEPS,NZ +C .. +C .. Array Arguments .. + DOUBLE PRECISION CNTL(5),OPS + INTEGER ICNTL(30),INFO(20) + INTEGER ICN(*),IKEEP(N,3),IRN(*),IW(LIW),IW1(N,2) +C .. +C .. Local Scalars .. + INTEGER I,IWFR,K,L1,L2,LLIW +C .. +C .. External Subroutines .. + EXTERNAL MA27GD,MA27HD,MA27JD,MA27KD,MA27LD,MA27MD,MA27UD +C .. +C .. Intrinsic Functions .. + INTRINSIC MIN +C .. +C .. Executable Statements .. + DO 5 I = 1,15 + INFO(I) = 0 + 5 CONTINUE + + IF (ICNTL(3).LE.0 .OR. ICNTL(2).LE.0) GO TO 40 +C PRINT INPUT VARIABLES. + WRITE (ICNTL(2),FMT=10) N,NZ,LIW,IFLAG + + 10 FORMAT(/,/,' ENTERING MA27AD WITH N NZ LIW IFLAG', + + /,21X,I7,I7,I9,I7) + + NSTEPS = 0 + K = MIN(8,NZ) + IF (ICNTL(3).GT.1) K = NZ + IF (K.GT.0) WRITE (ICNTL(2),FMT=20) (IRN(I),ICN(I),I=1,K) + + 20 FORMAT (' MATRIX NON-ZEROS',/,4 (I9,I6),/, + + (I9,I6,I9,I6,I9,I6,I9,I6)) + + K = MIN(10,N) + IF (ICNTL(3).GT.1) K = N + IF (IFLAG.EQ.1 .AND. K.GT.0) THEN + WRITE (ICNTL(2),FMT=30) (IKEEP(I,1),I=1,K) + END IF + + 30 FORMAT (' IKEEP(.,1)=',10I6,/, (12X,10I6)) + + 40 IF (N.LT.1 .OR. N.GT.ICNTL(4)) GO TO 70 + IF (NZ.LT.0) GO TO 100 + LLIW = LIW - 2*N + L1 = LLIW + 1 + L2 = L1 + N + IF (IFLAG.EQ.1) GO TO 50 + IF (LIW.LT.2*NZ+3*N+1) GO TO 130 +C SORT + CALL MA27GD(N,NZ,IRN,ICN,IW,LLIW,IW1,IW1(1,2),IW(L1),IWFR, + + ICNTL,INFO) +C ANALYZE USING MINIMUM DEGREE ORDERING + CALL MA27HD(N,IW1,IW,LLIW,IWFR,IW(L1),IW(L2),IKEEP(1,2), + + IKEEP(1,3),IKEEP,ICNTL(4),INFO(11),CNTL(2)) + GO TO 60 +C SORT USING GIVEN ORDER + 50 IF (LIW.LT.NZ+3*N+1) GO TO 120 + CALL MA27JD(N,NZ,IRN,ICN,IKEEP,IW,LLIW,IW1,IW1(1,2),IW(L1),IWFR, + + ICNTL,INFO) +C ANALYZE USING GIVEN ORDER + CALL MA27KD(N,IW1,IW,LLIW,IWFR,IKEEP,IKEEP(1,2),IW(L1),IW(L2), + + INFO(11)) +C PERFORM DEPTH-FIRST SEARCH OF ASSEMBLY TREE + 60 CALL MA27LD(N,IW1,IW(L1),IKEEP,IKEEP(1,2),IKEEP(1,3),IW(L2), + + NSTEPS,ICNTL(5)) +C EVALUATE STORAGE AND OPERATION COUNT REQUIRED BY MA27B/BD IN THE +C DEFINITE CASE. +C SET IW(1) SO THAT ARRAYS IW AND IRN CAN BE TESTED FOR EQUIVALENCE +C IN MA27M/MD. + IF(NZ.GE.1) IW(1) = IRN(1) + 1 + CALL MA27MD(N,NZ,IRN,ICN,IKEEP,IKEEP(1,3),IKEEP(1,2),IW(L2), + + NSTEPS,IW1,IW1(1,2),IW,INFO,OPS) + GO TO 160 + + 70 INFO(1) = -1 + IF (ICNTL(1).GT.0) WRITE (ICNTL(1),FMT=80) INFO(1) + + 80 FORMAT (' **** ERROR RETURN FROM MA27AD **** INFO(1)=',I3) + + IF (ICNTL(1).GT.0) WRITE (ICNTL(1),FMT=90) N + + 90 FORMAT (' VALUE OF N OUT OF RANGE ... =',I10) + + GO TO 160 + + 100 INFO(1) = -2 + IF (ICNTL(1).GT.0) WRITE (ICNTL(1),FMT=80) INFO(1) + IF (ICNTL(1).GT.0) WRITE (ICNTL(1),FMT=110) NZ + + 110 FORMAT (' VALUE OF NZ OUT OF RANGE .. =',I10) + + GO TO 160 + + 120 INFO(2) = NZ + 3*N + 1 + GO TO 140 + + 130 INFO(2) = 2*NZ + 3*N + 1 + 140 INFO(1) = -3 + IF (ICNTL(1).GT.0) WRITE (ICNTL(1),FMT=80) INFO(1) + IF (ICNTL(1).GT.0) WRITE (ICNTL(1),FMT=150) LIW,INFO(2) + + 150 FORMAT (' LIW TOO SMALL, MUST BE INCREASED FROM',I10, + + ' TO AT LEAST',I10) + + 160 IF (ICNTL(3).LE.0 .OR. ICNTL(2).LE.0 .OR. INFO(1).LT.0) GO TO 200 +C PRINT PARAMETER VALUES ON EXIT. + WRITE (ICNTL(2),FMT=170) NSTEPS,INFO(1),OPS,INFO(2),INFO(3), + + INFO(4),INFO(5),INFO(6),INFO(7),INFO(8),INFO(11) + + 170 FORMAT (/,' LEAVING MA27AD WITH NSTEPS INFO(1) OPS IERROR', + + ' NRLTOT NIRTOT', + + /,20X,2I7,F7.0,3I7, + + /,20X,' NRLNEC NIRNEC NRLADU NIRADU NCMPA', + + /,20X,6I7) + + K = MIN(9,N) + IF (ICNTL(3).GT.1) K = N + IF (K.GT.0) WRITE (ICNTL(2),FMT=30) (IKEEP(I,1),I=1,K) + K = MIN(K,NSTEPS) + IF (K.GT.0) WRITE (ICNTL(2),FMT=180) (IKEEP(I,2),I=1,K) + + 180 FORMAT (' IKEEP(.,2)=',10I6,/, (12X,10I6)) + + IF (K.GT.0) WRITE (ICNTL(2),FMT=190) (IKEEP(I,3),I=1,K) + + 190 FORMAT (' IKEEP(.,3)=',10I6,/, (12X,10I6)) + + 200 CONTINUE + + RETURN + END + + SUBROUTINE MA27BD(N,NZ,IRN,ICN,A,LA,IW,LIW,IKEEP,NSTEPS,MAXFRT, + + IW1,ICNTL,CNTL,INFO) +C THIS SUBROUTINE COMPUTES THE FACTORISATION OF THE MATRIX INPUT IN +C A,IRN,ICN USING INFORMATION (IN IKEEP) FROM MA27A/AD. +C N MUST BE SET TO THE ORDER OF THE MATRIX. IT IS NOT ALTERED. +C NZ MUST BE SET TO THE NUMBER OF NON-ZEROS INPUT. IT IS NOT +C ALTERED. +C IRN,ICN,A. ENTRY K (K=1,NZ) OF IRN,ICN MUST BE SET TO THE ROW +C AND COLUMN INDEX RESPECTIVELY OF THE NON-ZERO IN A. +C IRN AND ICN ARE UNALTERED BY MA27B/BD. +C ON EXIT, ENTRIES 1 TO NRLBDU OF A HOLD REAL INFORMATION +C ON THE FACTORS AND SHOULD BE PASSED UNCHANGED TO MA27C/CD. +C LA LENGTH OF ARRAY A. AN INDICATION OF A SUITABLE VALUE, +C SUFFICIENT FOR FACTORIZATION OF A DEFINITE MATRIX, WILL +C HAVE BEEN PROVIDED IN NRLNEC AND NRLTOT BY MA27A/AD. +C IT IS NOT ALTERED BY MA27B/BD. +C IW NEED NOT BE SET ON ENTRY. USED AS A WORK ARRAY BY MA27B/BD. +C ON EXIT, ENTRIES 1 TO NIRBDU HOLD INTEGER INFORMATION ON THE +C FACTORS AND SHOULD BE PASSED UNCHANGED TO MA27C/CD. +C LIW LENGTH OF ARRAY IW. AN INDICATION OF A SUITABLE VALUE WILL +C HAVE BEEN PROVIDED IN NIRNEC AND NIRTOT BY MA27A/AD. +C IT IS NOT ALTERED BY MA27B/BD. +C IKEEP MUST BE UNCHANGED SINCE THE CALL TO MA27A/AD. +C IT IS NOT ALTERED BY MA27B/BD. +C NSTEPS MUST BE UNCHANGED SINCE THE CALL TO MA27A/AD. +C IT IS NOT ALTERED BY MA27B/BD. +C MAXFRT NEED NOT BE SET AND MUST BE PASSED UNCHANGED TO MA27C/CD. +C IT IS THE MAXIMUM SIZE OF THE FRONTAL MATRIX GENERATED DURING +C THE DECOMPOSITION. +C IW1 USED AS WORKSPACE BY MA27B/BD. +C ICNTL is an INTEGER array of length 30, see MA27A/AD. +C CNTL is a DOUBLE PRECISION array of length 5, see MA27A/AD. +C INFO is an INTEGER array of length 20, see MA27A/AD. +C +C .. Scalar Arguments .. + INTEGER LA,LIW,MAXFRT,N,NSTEPS,NZ +C .. +C .. Array Arguments .. + DOUBLE PRECISION A(LA),CNTL(5) + INTEGER ICN(*),IKEEP(N,3),IRN(*),IW(LIW),IW1(N) + INTEGER ICNTL(30),INFO(20) +C .. +C .. Local Scalars .. + INTEGER I,IAPOS,IBLK,IPOS,IROWS,J1,J2,JJ,K,KBLK,KZ,LEN,NCOLS, + + NROWS,NZ1 +C .. +C .. External Subroutines .. + EXTERNAL MA27ND,MA27OD +C .. +C .. Intrinsic Functions .. + INTRINSIC ABS,MIN +C .. +C .. Executable Statements .. + INFO(1) = 0 + + IF (ICNTL(3).LE.0 .OR. ICNTL(2).LE.0) GO TO 60 +C PRINT INPUT PARAMETERS. + WRITE (ICNTL(2),FMT=10) N,NZ,LA,LIW,NSTEPS,CNTL(1) + + 10 FORMAT (/,/, + + ' ENTERING MA27BD WITH N NZ LA LIW', + + ' NSTEPS U',/,21X,I7,I7,I9,I9,I7,1PD10.2) + + KZ = MIN(6,NZ) + IF (ICNTL(3).GT.1) KZ = NZ + IF (NZ.GT.0) WRITE (ICNTL(2),FMT=20) (A(K),IRN(K),ICN(K),K=1,KZ) + + 20 FORMAT (' MATRIX NON-ZEROS',/,1X,2 (1P,D16.3,2I6),/, + + (1X,1P,D16.3,2I6,1P,D16.3,2I6)) + + K = MIN(9,N) + IF (ICNTL(3).GT.1) K = N + IF (K.GT.0) WRITE (ICNTL(2),FMT=30) (IKEEP(I,1),I=1,K) + + 30 FORMAT (' IKEEP(.,1)=',10I6,/, (12X,10I6)) + + K = MIN(K,NSTEPS) + IF (K.GT.0) WRITE (ICNTL(2),FMT=40) (IKEEP(I,2),I=1,K) + + 40 FORMAT (' IKEEP(.,2)=',10I6,/, (12X,10I6)) + + IF (K.GT.0) WRITE (ICNTL(2),FMT=50) (IKEEP(I,3),I=1,K) + + 50 FORMAT (' IKEEP(.,3)=',10I6,/, (12X,10I6)) + + 60 IF (N.LT.1 .OR. N.GT.ICNTL(4)) GO TO 70 + IF (NZ.LT.0) GO TO 100 + IF (LIW.LT.NZ) GO TO 120 + IF (LA.LT.NZ+N) GO TO 150 + IF (NSTEPS.LT.1 .OR. NSTEPS.GT.N) GO TO 175 +C SORT + CALL MA27ND(N,NZ,NZ1,A,LA,IRN,ICN,IW,LIW,IKEEP,IW1,ICNTL,INFO) + IF (INFO(1).EQ.-3) GO TO 130 + IF (INFO(1).EQ.-4) GO TO 160 +C FACTORIZE + CALL MA27OD(N,NZ1,A,LA,IW,LIW,IKEEP,IKEEP(1,3),NSTEPS,MAXFRT, + + IKEEP(1,2),IW1,ICNTL,CNTL,INFO) + IF (INFO(1).EQ.-3) GO TO 130 + IF (INFO(1).EQ.-4) GO TO 160 + IF (INFO(1).EQ.-5) GO TO 180 + IF (INFO(1).EQ.-6) GO TO 200 +C **** WARNING MESSAGE **** + IF (INFO(1).EQ.3 .AND. ICNTL(2).GT.0) THEN + WRITE (ICNTL(2),FMT=65) INFO(1),INFO(2) + END IF + + 65 FORMAT (' *** WARNING MESSAGE FROM SUBROUTINE MA27BD', + + ' *** INFO(1) =',I2, + + /,5X,'MATRIX IS SINGULAR. RANK=',I5) + + GO TO 220 +C **** ERROR RETURNS **** + 70 INFO(1) = -1 + IF (ICNTL(1).GT.0) WRITE (ICNTL(1),FMT=80) INFO(1) + + 80 FORMAT (' **** ERROR RETURN FROM MA27BD **** INFO(1)=',I3) + + IF (ICNTL(1).GT.0) WRITE (ICNTL(1),FMT=90) N + + 90 FORMAT (' VALUE OF N OUT OF RANGE ... =',I10) + + GO TO 220 + + 100 INFO(1) = -2 + IF (ICNTL(1).GT.0) WRITE (ICNTL(1),FMT=80) INFO(1) + IF (ICNTL(1).GT.0) WRITE (ICNTL(1),FMT=110) NZ + + 110 FORMAT (' VALUE OF NZ OUT OF RANGE .. =',I10) + + GO TO 220 + + 120 INFO(1) = -3 + INFO(2) = NZ + 130 IF (ICNTL(1).GT.0) WRITE (ICNTL(1),FMT=80) INFO(1) + IF (ICNTL(1).GT.0) WRITE (ICNTL(1),FMT=140) LIW,INFO(2) + + 140 FORMAT (' LIW TOO SMALL, MUST BE INCREASED FROM',I10,' TO', + + ' AT LEAST',I10) + + GO TO 220 + + 150 INFO(1) = -4 + INFO(2) = NZ + N + 160 IF (ICNTL(1).GT.0) WRITE (ICNTL(1),FMT=80) INFO(1) + IF (ICNTL(1).GT.0) WRITE (ICNTL(1),FMT=170) LA,INFO(2) + + 170 FORMAT (' LA TOO SMALL, MUST BE INCREASED FROM ',I10,' TO', + + ' AT LEAST',I10) + + GO TO 220 + + 175 INFO(1) = -7 + IF (ICNTL(1).GT.0) WRITE (ICNTL(1),FMT=80) INFO(1) + IF (ICNTL(1).GT.0) THEN + WRITE (ICNTL(1),FMT='(A)') ' NSTEPS is out of range' + END IF + GO TO 220 + + 180 IF (ICNTL(1).GT.0) WRITE (ICNTL(1),FMT=80) INFO(1) + IF (ICNTL(1).GT.0) WRITE (ICNTL(1),FMT=190) INFO(2) + + 190 FORMAT (' ZERO PIVOT AT STAGE',I10, + + ' WHEN INPUT MATRIX DECLARED DEFINITE') + + GO TO 220 + + 200 IF (ICNTL(1).GT.0) WRITE (ICNTL(1),FMT=80) INFO(1) + IF (ICNTL(1).GT.0) WRITE (ICNTL(1),FMT=210) + + 210 FORMAT (' CHANGE IN SIGN OF PIVOT ENCOUNTERED', + + ' WHEN FACTORING ALLEGEDLY DEFINITE MATRIX') + + 220 IF (ICNTL(3).LE.0 .OR. ICNTL(2).LE.0 .OR. INFO(1).LT.0) GO TO 310 +C PRINT OUTPUT PARAMETERS. + WRITE (ICNTL(2),FMT=230) MAXFRT,INFO(1),INFO(9),INFO(10),INFO(12), + + INFO(13),INFO(14),INFO(2) + + 230 FORMAT (/,' LEAVING MA27BD WITH', + + /,10X,' MAXFRT INFO(1) NRLBDU NIRBDU NCMPBR', + + ' NCMPBI NTWO IERROR', + + /,11X,8I7) + + IF (INFO(1).LT.0) GO TO 310 +C PRINT OUT MATRIX FACTORS FROM MA27B/BD. + KBLK = ABS(IW(1)+0) + IF (KBLK.EQ.0) GO TO 310 + IF (ICNTL(3).EQ.1) KBLK = 1 + IPOS = 2 + IAPOS = 1 + DO 300 IBLK = 1,KBLK + NCOLS = IW(IPOS) + NROWS = IW(IPOS+1) + J1 = IPOS + 2 + IF (NCOLS.GT.0) GO TO 240 + NCOLS = -NCOLS + NROWS = 1 + J1 = J1 - 1 + 240 WRITE (ICNTL(2),FMT=250) IBLK,NROWS,NCOLS + + 250 FORMAT (' BLOCK PIVOT =',I8,' NROWS =',I8,' NCOLS =',I8) + + J2 = J1 + NCOLS - 1 + IPOS = J2 + 1 + WRITE (ICNTL(2),FMT=260) (IW(JJ),JJ=J1,J2) + + 260 FORMAT (' COLUMN INDICES =',10I6,/, (17X,10I6)) + + WRITE (ICNTL(2),FMT=270) + + 270 FORMAT (' REAL ENTRIES .. EACH ROW STARTS ON A NEW LINE') + + LEN = NCOLS + DO 290 IROWS = 1,NROWS + J1 = IAPOS + J2 = IAPOS + LEN - 1 + WRITE (ICNTL(2),FMT=280) (A(JJ),JJ=J1,J2) + + 280 FORMAT (1P,5D13.3) + + LEN = LEN - 1 + IAPOS = J2 + 1 + 290 CONTINUE + 300 CONTINUE + 310 RETURN + END + + SUBROUTINE MA27CD(N,A,LA,IW,LIW,W,MAXFRT,RHS,IW1,NSTEPS, + + ICNTL,INFO) +C THIS SUBROUTINE USES THE FACTORISATION OF THE MATRIX IN A,IW TO +C SOLVE A SYSTEM OF EQUATIONS. +C N MUST BE SET TO THE ORDER OF THE MATRIX. IT IS NOT ALTERED. +C A,IW HOLD INFORMATION ON THE FACTORS AND MUST BE UNCHANGED SINCE +C THE CALL TO MA27B/BD. THEY ARE NOT ALTERED BY MA27C/CDD. +C LA,LIW MUST BE SET TO THE LENGTHS OF A,IW RESPECTIVELY. THEY +C ARE NOT ALTERED. +C W USED AS A WORK ARRAY. +C MAXFRT IS THE LENGTH OF W AND MUST BE PASSED UNCHANGED FROM THE +C CALL TO MA27B/BD. IT IS NOT ALTERED. +C RHS MUST BE SET TO THE RIGHT HAND SIDE FOR THE EQUATIONS BEING +C SOLVED. ON EXIT, THIS ARRAY WILL HOLD THE SOLUTION. +C IW1 USED AS A WORK ARRAY. +C NSTEPS IS THE LENGTH OF IW1 WHICH MUST BE AT LEAST THE ABSOLUTE +C VALUE OF IW(1). IT IS NOT ALTERED. +C ICNTL is an INTEGER array of length 30, see MA27A/AD. +C INFO is an INTEGER array of length 20, see MA27A/AD. +C +C .. Scalar Arguments .. + INTEGER LA,LIW,MAXFRT,N,NSTEPS +C .. +C .. Array Arguments .. + DOUBLE PRECISION A(LA),RHS(N),W(MAXFRT) + INTEGER IW(LIW),IW1(NSTEPS),ICNTL(30),INFO(20) +C .. +C .. Local Scalars .. + INTEGER I,IAPOS,IBLK,IPOS,IROWS,J1,J2,JJ,K,KBLK,LATOP,LEN,NBLK, + + NCOLS,NROWS +C .. +C .. External Subroutines .. + EXTERNAL MA27QD,MA27RD +C .. +C .. Intrinsic Functions .. + INTRINSIC ABS,MIN +C .. +C .. Executable Statements .. + INFO(1) = 0 + + IF (ICNTL(3).LE.0 .OR. ICNTL(2).LE.0) GO TO 110 +C PRINT INPUT PARAMETERS. + WRITE (ICNTL(2),FMT=10) N,LA,LIW,MAXFRT,NSTEPS + + 10 FORMAT (/,/,' ENTERING MA27CD WITH N LA LIW MAXFRT', + + ' NSTEPS',/,21X,5I7) +C PRINT OUT MATRIX FACTORS FROM MA27B/BD. + KBLK = ABS(IW(1)+0) + IF (KBLK.EQ.0) GO TO 90 + IF (ICNTL(3).EQ.1) KBLK = 1 + IPOS = 2 + IAPOS = 1 + DO 80 IBLK = 1,KBLK + NCOLS = IW(IPOS) + NROWS = IW(IPOS+1) + J1 = IPOS + 2 + IF (NCOLS.GT.0) GO TO 20 + NCOLS = -NCOLS + NROWS = 1 + J1 = J1 - 1 + 20 WRITE (ICNTL(2),FMT=30) IBLK,NROWS,NCOLS + + 30 FORMAT (' BLOCK PIVOT =',I8,' NROWS =',I8,' NCOLS =',I8) + + J2 = J1 + NCOLS - 1 + IPOS = J2 + 1 + WRITE (ICNTL(2),FMT=40) (IW(JJ),JJ=J1,J2) + + 40 FORMAT (' COLUMN INDICES =',10I6,/, (17X,10I6)) + + WRITE (ICNTL(2),FMT=50) + + 50 FORMAT (' REAL ENTRIES .. EACH ROW STARTS ON A NEW LINE') + + LEN = NCOLS + DO 70 IROWS = 1,NROWS + J1 = IAPOS + J2 = IAPOS + LEN - 1 + WRITE (ICNTL(2),FMT=60) (A(JJ),JJ=J1,J2) + + 60 FORMAT (1P,5D13.3) + + LEN = LEN - 1 + IAPOS = J2 + 1 + 70 CONTINUE + 80 CONTINUE + 90 K = MIN(10,N) + IF (ICNTL(3).GT.1) K = N + IF (N.GT.0) WRITE (ICNTL(2),FMT=100) (RHS(I),I=1,K) + + 100 FORMAT (' RHS',1P,5D13.3,/, (4X,1P,5D13.3)) + + 110 IF (IW(1).LT.0) GO TO 130 + NBLK = IW(1) + IF (NBLK.GT.0) GO TO 140 +C WE HAVE A ZERO MATRIX + DO 120 I = 1,N + RHS(I) = 0.0D0 + 120 CONTINUE + GO TO 150 + + 130 NBLK = -IW(1) +C FORWARD SUBSTITUTION + 140 CALL MA27QD(N,A,LA,IW(2),LIW-1,W,MAXFRT,RHS,IW1,NBLK,LATOP,ICNTL) +C BACK SUBSTITUTION. + CALL MA27RD(N,A,LA,IW(2),LIW-1,W,MAXFRT,RHS,IW1,NBLK,LATOP,ICNTL) + 150 IF (ICNTL(3).LE.0 .OR. ICNTL(2).LE.0) GO TO 170 +C PRINT OUTPUT PARAMETERS. + WRITE (ICNTL(2),FMT=160) + + 160 FORMAT (/,/,' LEAVING MA27CD WITH') + + IF (N.GT.0) WRITE (ICNTL(2),FMT=100) (RHS(I),I=1,K) + 170 CONTINUE + + RETURN + END + SUBROUTINE MA27GD(N,NZ,IRN,ICN,IW,LW,IPE,IQ,FLAG,IWFR, + + ICNTL,INFO) +C +C SORT PRIOR TO CALLING ANALYSIS ROUTINE MA27H/HD. +C +C GIVEN THE POSITIONS OF THE OFF-DIAGONAL NON-ZEROS OF A SYMMETRIC +C MATRIX, CONSTRUCT THE SPARSITY PATTERN OF THE OFF-DIAGONAL +C PART OF THE WHOLE MATRIX (UPPER AND LOWER TRIANGULAR PARTS). +C EITHER ONE OF A PAIR (I,J),(J,I) MAY BE USED TO REPRESENT +C THE PAIR. DIAGONAL ELEMENTS AND DUPLICATES ARE IGNORED. +C +C N MUST BE SET TO THE MATRIX ORDER. IT IS NOT ALTERED. +C NZ MUST BE SET TO THE NUMBER OF NON-ZEROS INPUT. IT IS NOT +C ALTERED. +C IRN(I),I=1,2,...,NZ MUST BE SET TO THE ROW NUMBERS OF THE +C NON-ZEROS ON INPUT. IT IS NOT ALTERED UNLESS IT IS EQUIVALENCED +C TO IW (SEE DESCRIPTION OF IW). +C ICN(I),I=1,2,...,NZ MUST BE SET TO THE COLUMN NUMBERS OF THE +C NON-ZEROS ON INPUT. IT IS NOT ALTERED UNLESS IT IS EQUIVALENCED +C TO IW (SEE DESCRIPTION OF IW). +C IW NEED NOT BE SET ON INPUT. ON OUTPUT IT CONTAINS LISTS OF +C COLUMN INDICES, EACH LIST BEING HEADED BY ITS LENGTH. +C IRN(1) MAY BE EQUIVALENCED TO IW(1) AND ICN(1) MAY BE +C EQUIVALENCED TO IW(K), WHERE K.GT.NZ. +C LW MUST BE SET TO THE LENGTH OF IW. IT MUST BE AT LEAST 2*NZ+N. +C IT IS NOT ALTERED. +C IPE NEED NOT BE SET ON INPUT. ON OUTPUT IPE(I) POINTS TO THE START OF +C THE ENTRY IN IW FOR ROW I, OR IS ZERO IF THERE IS NO ENTRY. +C IQ NEED NOT BE SET. ON OUTPUT IQ(I),I=1,N CONTAINS THE NUMBER OF +C OFF-DIAGONAL N0N-ZEROS IN ROW I INCLUDING DUPLICATES. +C FLAG IS USED FOR WORKSPACE TO HOLD FLAGS TO PERMIT DUPLICATE ENTRIES +C TO BE IDENTIFIED QUICKLY. +C IWFR NEED NOT BE SET ON INPUT. ON OUTPUT IT POINTS TO THE FIRST +C UNUSED LOCATION IN IW. +C ICNTL is an INTEGER array of length 30, see MA27A/AD. +C INFO is an INTEGER array of length 20, see MA27A/AD. +C +C .. Scalar Arguments .. + INTEGER IWFR,LW,N,NZ +C .. +C .. Array Arguments .. + INTEGER FLAG(N),ICN(*),IPE(N),IQ(N),IRN(*),IW(LW) + INTEGER ICNTL(*),INFO(20) +C .. +C .. Local Scalars .. + INTEGER I,ID,J,JN,K,K1,K2,L,LAST,LR,N1,NDUP +C .. +C .. Executable Statements .. +C +C INITIALIZE INFO(2) AND COUNT IN IPE THE +C NUMBERS OF NON-ZEROS IN THE ROWS AND MOVE ROW AND COLUMN +C NUMBERS INTO IW. + INFO(2) = 0 + DO 10 I = 1,N + IPE(I) = 0 + 10 CONTINUE + LR = NZ + IF (NZ.EQ.0) GO TO 120 + DO 110 K = 1,NZ + I = IRN(K) + J = ICN(K) + IF (I.LT.J) THEN + IF (I.GE.1 .AND. J.LE.N) GO TO 90 + ELSE IF (I.GT.J) THEN + IF (J.GE.1 .AND. I.LE.N) GO TO 90 + ELSE + IF (I.GE.1 .AND. I.LE.N) GO TO 80 + END IF + INFO(2) = INFO(2) + 1 + INFO(1) = 1 + IF (INFO(2).LE.1 .AND. ICNTL(2).GT.0) THEN + WRITE (ICNTL(2),FMT=60) INFO(1) + END IF + + 60 FORMAT (' *** WARNING MESSAGE FROM SUBROUTINE MA27AD', + + ' *** INFO(1) =',I2) + + IF (INFO(2).LE.10 .AND. ICNTL(2).GT.0) THEN + WRITE (ICNTL(2),FMT=70) K,I,J + END IF + + 70 FORMAT (I6,'TH NON-ZERO (IN ROW',I6,' AND COLUMN',I6, + + ') IGNORED') + + 80 I = 0 + J = 0 + GO TO 100 + + 90 IPE(I) = IPE(I) + 1 + IPE(J) = IPE(J) + 1 + 100 IW(K) = J + LR = LR + 1 + IW(LR) = I + 110 CONTINUE +C +C ACCUMULATE ROW COUNTS TO GET POINTERS TO ROW STARTS IN BOTH IPE AND IQ +C AND INITIALIZE FLAG + 120 IQ(1) = 1 + N1 = N - 1 + IF (N1.LE.0) GO TO 140 + DO 130 I = 1,N1 + FLAG(I) = 0 + IF (IPE(I).EQ.0) IPE(I) = -1 + IQ(I+1) = IPE(I) + IQ(I) + 1 + IPE(I) = IQ(I) + 130 CONTINUE + 140 LAST = IPE(N) + IQ(N) + FLAG(N) = 0 + IF (LR.GE.LAST) GO TO 160 + K1 = LR + 1 + DO 150 K = K1,LAST + IW(K) = 0 + 150 CONTINUE + 160 IPE(N) = IQ(N) + IWFR = LAST + 1 + IF (NZ.EQ.0) GO TO 230 +C +C RUN THROUGH PUTTING THE MATRIX ELEMENTS IN THE RIGHT PLACE +C BUT WITH SIGNS INVERTED. IQ IS USED FOR HOLDING RUNNING POINTERS +C AND IS LEFT HOLDING POINTERS TO ROW ENDS. + DO 220 K = 1,NZ + J = IW(K) + IF (J.LE.0) GO TO 220 + L = K + IW(K) = 0 + DO 210 ID = 1,NZ + IF (L.GT.NZ) GO TO 170 + L = L + NZ + GO TO 180 + + 170 L = L - NZ + 180 I = IW(L) + IW(L) = 0 + IF (I.LT.J) GO TO 190 + L = IQ(J) + 1 + IQ(J) = L + JN = IW(L) + IW(L) = -I + GO TO 200 + + 190 L = IQ(I) + 1 + IQ(I) = L + JN = IW(L) + IW(L) = -J + 200 J = JN + IF (J.LE.0) GO TO 220 + 210 CONTINUE + 220 CONTINUE +C +C RUN THROUGH RESTORING SIGNS, REMOVING DUPLICATES AND SETTING THE +C MATE OF EACH NON-ZERO. +C NDUP COUNTS THE NUMBER OF DUPLICATE ELEMENTS. + 230 NDUP = 0 + DO 280 I = 1,N + K1 = IPE(I) + 1 + K2 = IQ(I) + IF (K1.LE.K2) GO TO 240 +C ROW IS EMPTY. SET POINTER TO ZERO. + IPE(I) = 0 + IQ(I) = 0 + GO TO 280 +C ON ENTRY TO THIS LOOP FLAG(J).LT.I FOR J=1,2,...,N. DURING THE LOOP +C FLAG(J) IS SET TO I IF A NON-ZERO IN COLUMN J IS FOUND. THIS +C PERMITS DUPLICATES TO BE RECOGNIZED QUICKLY. + 240 DO 260 K = K1,K2 + J = -IW(K) + IF (J.LE.0) GO TO 270 + L = IQ(J) + 1 + IQ(J) = L + IW(L) = I + IW(K) = J + IF (FLAG(J).NE.I) GO TO 250 + NDUP = NDUP + 1 + IW(L) = 0 + IW(K) = 0 + 250 FLAG(J) = I + 260 CONTINUE + 270 IQ(I) = IQ(I) - IPE(I) + IF (NDUP.EQ.0) IW(K1-1) = IQ(I) + 280 CONTINUE + IF (NDUP.EQ.0) GO TO 310 +C +C COMPRESS IW TO REMOVE DUMMY ENTRIES CAUSED BY DUPLICATES. + IWFR = 1 + DO 300 I = 1,N + K1 = IPE(I) + 1 + IF (K1.EQ.1) GO TO 300 + K2 = IQ(I) + IPE(I) + L = IWFR + IPE(I) = IWFR + IWFR = IWFR + 1 + DO 290 K = K1,K2 + IF (IW(K).EQ.0) GO TO 290 + IW(IWFR) = IW(K) + IWFR = IWFR + 1 + 290 CONTINUE + IW(L) = IWFR - L - 1 + 300 CONTINUE + 310 RETURN + + END + SUBROUTINE MA27HD(N,IPE,IW,LW,IWFR,NV,NXT,LST,IPD,FLAG,IOVFLO, + + NCMPA,FRATIO) +C +C ANALYSIS SUBROUTINE +C +C GIVEN REPRESENTATION OF THE WHOLE MATRIX (EXCLUDING DIAGONAL) +C PERFORM MINIMUM DEGREE ORDERING, CONSTRUCTING TREE POINTERS. +C IT WORKS WITH SUPERVARIABLES WHICH ARE COLLECTIONS OF ONE OR MORE +C VARIABLES, STARTING WITH SUPERVARIABLE I CONTAINING VARIABLE I FOR +C I = 1,2,...,N. ALL VARIABLES IN A SUPERVARIABLE ARE ELIMINATED +C TOGETHER. EACH SUPERVARIABLE HAS AS NUMERICAL NAME THAT OF ONE +C OF ITS VARIABLES (ITS PRINCIPAL VARIABLE). +C +C N MUST BE SET TO THE MATRIX ORDER. IT IS NOT ALTERED. +C IPE(I) MUST BE SET TO POINT TO THE POSITION IN IW OF THE +C START OF ROW I OR HAVE THE VALUE ZERO IF ROW I HAS NO OFF- +C DIAGONAL NON-ZEROS. DURING EXECUTION IT IS USED AS FOLLOWS. IF +C SUPERVARIABLE I IS ABSORBED INTO SUPERVARIABLE J THEN IPE(I)=-J. +C IF SUPERVARIABLE I IS ELIMINATED THEN IPE(I) EITHER POINTS TO THE +C LIST OF SUPERVARIABLES FOR CREATED ELEMENT I OR IS ZERO IF +C THE CREATED ELEMENT IS NULL. IF ELEMENT I +C IS ABSORBED INTO ELEMENT J THEN IPE(I)=-J. +C IW MUST BE SET ON ENTRY TO HOLD LISTS OF VARIABLES BY +C ROWS, EACH LIST BEING HEADED BY ITS LENGTH. +C DURING EXECUTION THESE LISTS ARE REVISED AND HOLD +C LISTS OF ELEMENTS AND SUPERVARIABLES. THE ELEMENTS +C ALWAYS HEAD THE LISTS. WHEN A SUPERVARIABLE +C IS ELIMINATED ITS LIST IS REPLACED BY A LIST OF SUPERVARIABLES +C IN THE NEW ELEMENT. +C LW MUST BE SET TO THE LENGTH OF IW. IT IS NOT ALTERED. +C IWFR MUST BE SET TO THE POSITION IN IW OF THE FIRST FREE VARIABLE. +C IT IS REVISED DURING EXECUTION AND CONTINUES TO HAVE THIS MEANING. +C NV(JS) NEED NOT BE SET. DURING EXECUTION IT IS ZERO IF +C JS IS NOT A PRINCIPAL VARIABLE AND IF IT IS IT HOLDS +C THE NUMBER OF VARIABLES IN SUPERVARIABLE JS. FOR ELIMINATED +C VARIABLES IT IS SET TO THE DEGREE AT THE TIME OF ELIMINATION. +C NXT(JS) NEED NOT BE SET. DURING EXECUTION IT IS THE NEXT +C SUPERVARIABLE HAVING THE SAME DEGREE AS JS, OR ZERO +C IF IT IS LAST IN ITS LIST. +C LST(JS) NEED NOT BE SET. DURING EXECUTION IT IS THE +C LAST SUPERVARIABLE HAVING THE SAME DEGREE AS JS OR +C -(ITS DEGREE) IF IT IS FIRST IN ITS LIST. +C IPD(ID) NEED NOT BE SET. DURING EXECUTION IT +C IS THE FIRST SUPERVARIABLE WITH DEGREE ID OR ZERO +C IF THERE ARE NONE. +C FLAG IS USED AS WORKSPACE FOR ELEMENT AND SUPERVARIABLE FLAGS. +C WHILE THE CODE IS FINDING THE DEGREE OF SUPERVARIABLE IS +C FLAG HAS THE FOLLOWING VALUES. +C A) FOR THE CURRENT PIVOT/NEW ELEMENT ME +C FLAG(ME)=-1 +C B) FOR VARIABLES JS +C FLAG(JS)=-1 IF JS IS NOT A PRINCIPAL VARIABLE +C FLAG(JS)=0 IF JS IS A SUPERVARIABLE IN THE NEW ELEMENT +C FLAG(JS)=NFLG IF JS IS A SUPERVARIABLE NOT IN THE NEW +C ELEMENT THAT HAS BEEN COUNTED IN THE DEGREE +C CALCULATION +C FLAG(JS).GT.NFLG IF JS IS A SUPERVARIABLE NOT IN THE NEW +C ELEMENT THAT HAS NOT BEEN COUNTED IN THE DEGREE +C CALCULATION +C C) FOR ELEMENTS IE +C FLAG(IE)=-1 IF ELEMENT IE HAS BEEN MERGED INTO ANOTHER +C FLAG(IE)=-NFLG IF ELEMENT IE HAS BEEN USED IN THE DEGREE +C CALCULATION FOR IS. +C FLAG(IE).LT.-NFLG IF ELEMENT IE HAS NOT BEEN USED IN THE +C DEGREE CALCULATION FOR IS +C IOVFLO see ICNTL(4) in MA27A/AD. +C NCMPA see INFO(11) in MA27A/AD. +C FRATIO see CNTL(2) in MA27A/AD. +C +C .. Scalar Arguments .. + DOUBLE PRECISION FRATIO + INTEGER IWFR,LW,N,IOVFLO,NCMPA +C .. +C .. Array Arguments .. + INTEGER FLAG(N),IPD(N),IPE(N),IW(LW),LST(N),NV(N),NXT(N) +C .. +C .. Local Scalars .. + INTEGER I,ID,IDL,IDN,IE,IP,IS,JP,JP1,JP2,JS,K,K1,K2,KE,KP,KP0,KP1, + + KP2,KS,L,LEN,LIMIT,LN,LS,LWFR,MD,ME,ML,MS,NEL,NFLG,NP, + + NP0,NS,NVPIV,NVROOT,ROOT +C LIMIT Limit on number of variables for putting node in root. +C NVROOT Number of variables in the root node +C ROOT Index of the root node (N+1 if none chosen yet). +C .. +C .. External Subroutines .. + EXTERNAL MA27UD +C .. +C .. Intrinsic Functions .. + INTRINSIC ABS,MIN +C .. +C If a column of the reduced matrix has relative density greater than +C CNTL(2), it is forced into the root. All such columns are taken to +C have sparsity pattern equal to their merged patterns, so the fill +C and operation counts may be overestimated. +C +C IS,JS,KS,LS,MS,NS ARE USED TO REFER TO SUPERVARIABLES. +C IE,JE,KE ARE USED TO REFER TO ELEMENTS. +C IP,JP,KP,K,NP ARE USED TO POINT TO LISTS OF ELEMENTS. +C OR SUPERVARIABLES. +C ID IS USED FOR THE DEGREE OF A SUPERVARIABLE. +C MD IS USED FOR THE CURRENT MINIMUM DEGREE. +C IDN IS USED FOR THE NO. OF VARIABLES IN A NEWLY CREATED ELEMENT +C NEL IS USED TO HOLD THE NO. OF VARIABLES THAT HAVE BEEN +C ELIMINATED. +C ME=MS IS THE NAME OF THE SUPERVARIABLE ELIMINATED AND +C OF THE ELEMENT CREATED IN THE MAIN LOOP. +C NFLG IS USED FOR THE CURRENT FLAG VALUE IN ARRAY FLAG. IT STARTS +C WITH THE VALUE IOVFLO AND IS REDUCED BY 1 EACH TIME IT IS USED +C UNTIL IT HAS THE VALUE 2 WHEN IT IS RESET TO THE VALUE IOVFLO. +C +C .. Executable Statements .. +C INITIALIZATIONS + DO 10 I = 1,N + IPD(I) = 0 + NV(I) = 1 + FLAG(I) = IOVFLO + 10 CONTINUE + MD = 1 + NCMPA = 0 + NFLG = IOVFLO + NEL = 0 + ROOT = N+1 + NVROOT = 0 +C +C LINK TOGETHER VARIABLES HAVING SAME DEGREE + DO 30 IS = 1,N + K = IPE(IS) + IF (K.LE.0) GO TO 20 + ID = IW(K) + 1 + NS = IPD(ID) + IF (NS.GT.0) LST(NS) = IS + NXT(IS) = NS + IPD(ID) = IS + LST(IS) = -ID + GO TO 30 +C WE HAVE A VARIABLE THAT CAN BE ELIMINATED AT ONCE BECAUSE THERE IS +C NO OFF-DIAGONAL NON-ZERO IN ITS ROW. + 20 NEL = NEL + 1 + FLAG(IS) = -1 + NXT(IS) = 0 + LST(IS) = 0 + 30 CONTINUE +C +C START OF MAIN LOOP +C + DO 340 ML = 1,N +C LEAVE LOOP IF ALL VARIABLES HAVE BEEN ELIMINATED. + IF (NEL+NVROOT+1.GE.N) GO TO 350 +C +C FIND NEXT SUPERVARIABLE FOR ELIMINATION. + DO 40 ID = MD,N + MS = IPD(ID) + IF (MS.GT.0) GO TO 50 + 40 CONTINUE + 50 MD = ID +C NVPIV HOLDS THE NUMBER OF VARIABLES IN THE PIVOT. + NVPIV = NV(MS) +C +C REMOVE CHOSEN VARIABLE FROM LINKED LIST + NS = NXT(MS) + NXT(MS) = 0 + LST(MS) = 0 + IF (NS.GT.0) LST(NS) = -ID + IPD(ID) = NS + ME = MS + NEL = NEL + NVPIV +C IDN HOLDS THE DEGREE OF THE NEW ELEMENT. + IDN = 0 +C +C RUN THROUGH THE LIST OF THE PIVOTAL SUPERVARIABLE, SETTING TREE +C POINTERS AND CONSTRUCTING NEW LIST OF SUPERVARIABLES. +C KP IS A POINTER TO THE CURRENT POSITION IN THE OLD LIST. + KP = IPE(ME) + FLAG(MS) = -1 +C IP POINTS TO THE START OF THE NEW LIST. + IP = IWFR +C LEN HOLDS THE LENGTH OF THE LIST ASSOCIATED WITH THE PIVOT. + LEN = IW(KP) + DO 140 KP1 = 1,LEN + KP = KP + 1 + KE = IW(KP) +C JUMP IF KE IS AN ELEMENT THAT HAS NOT BEEN MERGED INTO ANOTHER. + IF (FLAG(KE).LE.-2) GO TO 60 +C JUMP IF KE IS AN ELEMENT THAT HAS BEEN MERGED INTO ANOTHER OR IS +C A SUPERVARIABLE THAT HAS BEEN ELIMINATED. + IF (FLAG(KE).LE.0) THEN + IF (IPE(KE).NE.-ROOT) GO TO 140 +C KE has been merged into the root + KE = ROOT + IF (FLAG(KE).LE.0) GO TO 140 + END IF +C WE HAVE A SUPERVARIABLE. PREPARE TO SEARCH REST OF LIST. + JP = KP - 1 + LN = LEN - KP1 + 1 + IE = MS + GO TO 70 +C SEARCH VARIABLE LIST OF ELEMENT KE, USING JP AS A POINTER TO IT. + 60 IE = KE + JP = IPE(IE) + LN = IW(JP) +C +C SEARCH FOR DIFFERENT SUPERVARIABLES AND ADD THEM TO THE NEW LIST, +C COMPRESSING WHEN NECESSARY. THIS LOOP IS EXECUTED ONCE FOR +C EACH ELEMENT IN THE LIST AND ONCE FOR ALL THE SUPERVARIABLES +C IN THE LIST. + 70 DO 130 JP1 = 1,LN + JP = JP + 1 + IS = IW(JP) +C JUMP IF IS IS NOT A PRINCIPAL VARIABLE OR HAS ALREADY BEEN COUNTED. + IF (FLAG(IS).LE.0) THEN + IF (IPE(IS).EQ.-ROOT) THEN +C IS has been merged into the root + IS = ROOT + IW(JP) = ROOT + IF (FLAG(IS).LE.0) GO TO 130 + ELSE + GO TO 130 + END IF + END IF + FLAG(IS) = 0 + IF (IWFR.LT.LW) GO TO 100 +C PREPARE FOR COMPRESSING IW BY ADJUSTING POINTERS AND +C LENGTHS SO THAT THE LISTS BEING SEARCHED IN THE INNER AND OUTER +C LOOPS CONTAIN ONLY THE REMAINING ENTRIES. + IPE(MS) = KP + IW(KP) = LEN - KP1 + IPE(IE) = JP + IW(JP) = LN - JP1 +C COMPRESS IW + CALL MA27UD(N,IPE,IW,IP-1,LWFR,NCMPA) +C COPY NEW LIST FORWARD + JP2 = IWFR - 1 + IWFR = LWFR + IF (IP.GT.JP2) GO TO 90 + DO 80 JP = IP,JP2 + IW(IWFR) = IW(JP) + IWFR = IWFR + 1 + 80 CONTINUE +C ADJUST POINTERS FOR THE NEW LIST AND THE LISTS BEING SEARCHED. + 90 IP = LWFR + JP = IPE(IE) + KP = IPE(ME) +C STORE IS IN NEW LIST. + 100 IW(IWFR) = IS + IDN = IDN + NV(IS) + IWFR = IWFR + 1 +C REMOVE IS FROM DEGREE LINKED LIST + LS = LST(IS) + LST(IS) = 0 + NS = NXT(IS) + NXT(IS) = 0 + IF (NS.GT.0) LST(NS) = LS + IF (LS.LT.0) THEN + LS = -LS + IPD(LS) = NS + ELSE IF (LS.GT.0) THEN + NXT(LS) = NS + END IF + 130 CONTINUE +C JUMP IF WE HAVE JUST BEEN SEARCHING THE VARIABLES AT THE END OF +C THE LIST OF THE PIVOT. + IF (IE.EQ.MS) GO TO 150 +C SET TREE POINTER AND FLAG TO INDICATE ELEMENT IE IS ABSORBED INTO +C NEW ELEMENT ME. + IPE(IE) = -ME + FLAG(IE) = -1 + 140 CONTINUE + +C STORE THE DEGREE OF THE PIVOT. + 150 NV(MS) = IDN + NVPIV +C JUMP IF NEW ELEMENT IS NULL. + IF (IWFR.EQ.IP) GO TO 330 + K1 = IP + K2 = IWFR - 1 +C +C RUN THROUGH NEW LIST OF SUPERVARIABLES REVISING EACH ASSOCIATED LIST, +C RECALCULATING DEGREES AND REMOVING DUPLICATES. + LIMIT = NINT(FRATIO*(N-NEL)) + DO 310 K = K1,K2 + IS = IW(K) + IF (IS.EQ.ROOT) GO TO 310 + IF (NFLG.GT.2) GO TO 170 +C RESET FLAG VALUES TO +/-IOVFLO. + DO 160 I = 1,N + IF (FLAG(I).GT.0) FLAG(I) = IOVFLO + IF (FLAG(I).LE.-2) FLAG(I) = -IOVFLO + 160 CONTINUE + NFLG = IOVFLO +C REDUCE NFLG BY ONE TO CATER FOR THIS SUPERVARIABLE. + 170 NFLG = NFLG - 1 +C BEGIN WITH THE DEGREE OF THE NEW ELEMENT. ITS VARIABLES MUST ALWAYS +C BE COUNTED DURING THE DEGREE CALCULATION AND THEY ARE ALREADY +C FLAGGED WITH THE VALUE 0. + ID = IDN +C RUN THROUGH THE LIST ASSOCIATED WITH SUPERVARIABLE IS + KP1 = IPE(IS) + 1 +C NP POINTS TO THE NEXT ENTRY IN THE REVISED LIST. + NP = KP1 + KP2 = IW(KP1-1) + KP1 - 1 + DO 220 KP = KP1,KP2 + KE = IW(KP) +C TEST WHETHER KE IS AN ELEMENT, A REDUNDANT ENTRY OR A SUPERVARIABLE. + IF (FLAG(KE).EQ.-1) THEN + IF (IPE(KE).NE.-ROOT) GO TO 220 +C KE has been merged into the root + KE = ROOT + IW(KP) = ROOT + IF (FLAG(KE).EQ.-1) GO TO 220 + END IF + IF (FLAG(KE).GE.0) GO TO 230 +C SEARCH LIST OF ELEMENT KE, REVISING THE DEGREE WHEN NEW VARIABLES +C FOUND. + JP1 = IPE(KE) + 1 + JP2 = IW(JP1-1) + JP1 - 1 + IDL = ID + DO 190 JP = JP1,JP2 + JS = IW(JP) +C JUMP IF JS HAS ALREADY BEEN COUNTED. + IF (FLAG(JS).LE.NFLG) GO TO 190 + ID = ID + NV(JS) + FLAG(JS) = NFLG + 190 CONTINUE +C JUMP IF ONE OR MORE NEW SUPERVARIABLES WERE FOUND. + IF (ID.GT.IDL) GO TO 210 +C CHECK WHETHER EVERY VARIABLE OF ELEMENT KE IS IN NEW ELEMENT ME. + DO 200 JP = JP1,JP2 + JS = IW(JP) + IF (FLAG(JS).NE.0) GO TO 210 + 200 CONTINUE +C SET TREE POINTER AND FLAG TO INDICATE THAT ELEMENT KE IS ABSORBED +C INTO NEW ELEMENT ME. + IPE(KE) = -ME + FLAG(KE) = -1 + GO TO 220 +C STORE ELEMENT KE IN THE REVISED LIST FOR SUPERVARIABLE IS AND FLAG IT. + 210 IW(NP) = KE + FLAG(KE) = -NFLG + NP = NP + 1 + 220 CONTINUE + NP0 = NP + GO TO 250 +C TREAT THE REST OF THE LIST ASSOCIATED WITH SUPERVARIABLE IS. IT +C CONSISTS ENTIRELY OF SUPERVARIABLES. + 230 KP0 = KP + NP0 = NP + DO 240 KP = KP0,KP2 + KS = IW(KP) + IF (FLAG(KS).LE.NFLG) THEN + IF (IPE(KS).EQ.-ROOT) THEN + KS = ROOT + IW(KP) = ROOT + IF (FLAG(KS).LE.NFLG) GO TO 240 + ELSE + GO TO 240 + END IF + END IF +C ADD TO DEGREE, FLAG SUPERVARIABLE KS AND ADD IT TO NEW LIST. + ID = ID + NV(KS) + FLAG(KS) = NFLG + IW(NP) = KS + NP = NP + 1 + 240 CONTINUE +C MOVE FIRST SUPERVARIABLE TO END OF LIST, MOVE FIRST ELEMENT TO END +C OF ELEMENT PART OF LIST AND ADD NEW ELEMENT TO FRONT OF LIST. + 250 IF (ID.GE.LIMIT) GO TO 295 + IW(NP) = IW(NP0) + IW(NP0) = IW(KP1) + IW(KP1) = ME +C STORE THE NEW LENGTH OF THE LIST. + IW(KP1-1) = NP - KP1 + 1 +C +C CHECK WHETHER ROW IS IS IDENTICAL TO ANOTHER BY LOOKING IN LINKED +C LIST OF SUPERVARIABLES WITH DEGREE ID AT THOSE WHOSE LISTS HAVE +C FIRST ENTRY ME. NOTE THAT THOSE CONTAINING ME COME FIRST SO THE +C SEARCH CAN BE TERMINATED WHEN A LIST NOT STARTING WITH ME IS +C FOUND. + JS = IPD(ID) + DO 280 L = 1,N + IF (JS.LE.0) GO TO 300 + KP1 = IPE(JS) + 1 + IF (IW(KP1).NE.ME) GO TO 300 +C JS HAS SAME DEGREE AND IS ACTIVE. CHECK IF IDENTICAL TO IS. + KP2 = KP1 - 1 + IW(KP1-1) + DO 260 KP = KP1,KP2 + IE = IW(KP) +C JUMP IF IE IS A SUPERVARIABLE OR AN ELEMENT NOT IN THE LIST OF IS. + IF (ABS(FLAG(IE)+0).GT.NFLG) GO TO 270 + 260 CONTINUE + GO TO 290 + + 270 JS = NXT(JS) + 280 CONTINUE +C SUPERVARIABLE AMALGAMATION. ROW IS IS IDENTICAL TO ROW JS. +C REGARD ALL VARIABLES IN THE TWO SUPERVARIABLES AS BEING IN IS. SET +C TREE POINTER, FLAG AND NV ENTRIES. + 290 IPE(JS) = -IS + NV(IS) = NV(IS) + NV(JS) + NV(JS) = 0 + FLAG(JS) = -1 +C REPLACE JS BY IS IN LINKED LIST. + NS = NXT(JS) + LS = LST(JS) + IF (NS.GT.0) LST(NS) = IS + IF (LS.GT.0) NXT(LS) = IS + LST(IS) = LS + NXT(IS) = NS + LST(JS) = 0 + NXT(JS) = 0 + IF (IPD(ID).EQ.JS) IPD(ID) = IS + GO TO 310 +C Treat IS as full. Merge it into the root node. + 295 IF (NVROOT.EQ.0) THEN + ROOT = IS + IPE(IS) = 0 + ELSE + IW(K) = ROOT + IPE(IS) = -ROOT + NV(ROOT) = NV(ROOT) + NV(IS) + NV(IS) = 0 + FLAG(IS) = -1 + END IF + NVROOT = NV(ROOT) + GO TO 310 +C INSERT IS INTO LINKED LIST OF SUPERVARIABLES OF SAME DEGREE. + 300 NS = IPD(ID) + IF (NS.GT.0) LST(NS) = IS + NXT(IS) = NS + IPD(ID) = IS + LST(IS) = -ID + MD = MIN(MD,ID) + 310 CONTINUE +C +C RESET FLAGS FOR SUPERVARIABLES IN NEWLY CREATED ELEMENT AND +C REMOVE THOSE ABSORBED INTO OTHERS. + DO 320 K = K1,K2 + IS = IW(K) + IF (NV(IS).EQ.0) GO TO 320 + FLAG(IS) = NFLG + IW(IP) = IS + IP = IP + 1 + 320 CONTINUE + IWFR = K1 + FLAG(ME) = -NFLG +C MOVE FIRST ENTRY TO END TO MAKE ROOM FOR LENGTH. + IW(IP) = IW(K1) + IW(K1) = IP - K1 +C SET POINTER FOR NEW ELEMENT AND RESET IWFR. + IPE(ME) = K1 + IWFR = IP + 1 + GO TO 335 + + 330 IPE(ME) = 0 +C + 335 CONTINUE + 340 CONTINUE +C + +C Absorb any remaining variables into the root + 350 DO 360 IS = 1,N + IF(NXT(IS).NE.0 .OR. LST(IS).NE.0) THEN + IF (NVROOT.EQ.0) THEN + ROOT = IS + IPE(IS) = 0 + ELSE + IPE(IS) = -ROOT + END IF + NVROOT = NVROOT + NV(IS) + NV(IS) = 0 + END IF + 360 CONTINUE +C Link any remaining elements to the root + DO 370 IE = 1,N + IF (IPE(IE).GT.0) IPE(IE) = -ROOT + 370 CONTINUE + IF(NVROOT.GT.0)NV(ROOT)=NVROOT + END + + SUBROUTINE MA27UD(N,IPE,IW,LW,IWFR,NCMPA) +C COMPRESS LISTS HELD BY MA27H/HD AND MA27K/KD IN IW AND ADJUST POINTERS +C IN IPE TO CORRESPOND. +C N IS THE MATRIX ORDER. IT IS NOT ALTERED. +C IPE(I) POINTS TO THE POSITION IN IW OF THE START OF LIST I OR IS +C ZERO IF THERE IS NO LIST I. ON EXIT IT POINTS TO THE NEW POSITION. +C IW HOLDS THE LISTS, EACH HEADED BY ITS LENGTH. ON OUTPUT THE SAME +C LISTS ARE HELD, BUT THEY ARE NOW COMPRESSED TOGETHER. +C LW HOLDS THE LENGTH OF IW. IT IS NOT ALTERED. +C IWFR NEED NOT BE SET ON ENTRY. ON EXIT IT POINTS TO THE FIRST FREE +C LOCATION IN IW. +C ON RETURN IT IS SET TO THE FIRST FREE LOCATION IN IW. +C NCMPA see INFO(11) in MA27A/AD. +C +C .. Scalar Arguments .. + INTEGER IWFR,LW,N,NCMPA +C .. +C .. Array Arguments .. + INTEGER IPE(N),IW(LW) +C .. +C .. Local Scalars .. + INTEGER I,IR,K,K1,K2,LWFR +C .. +C .. Executable Statements .. + NCMPA = NCMPA + 1 +C PREPARE FOR COMPRESSING BY STORING THE LENGTHS OF THE +C LISTS IN IPE AND SETTING THE FIRST ENTRY OF EACH LIST TO +C -(LIST NUMBER). + DO 10 I = 1,N + K1 = IPE(I) + IF (K1.LE.0) GO TO 10 + IPE(I) = IW(K1) + IW(K1) = -I + 10 CONTINUE +C +C COMPRESS +C IWFR POINTS JUST BEYOND THE END OF THE COMPRESSED FILE. +C LWFR POINTS JUST BEYOND THE END OF THE UNCOMPRESSED FILE. + IWFR = 1 + LWFR = IWFR + DO 60 IR = 1,N + IF (LWFR.GT.LW) GO TO 70 +C SEARCH FOR THE NEXT NEGATIVE ENTRY. + DO 20 K = LWFR,LW + IF (IW(K).LT.0) GO TO 30 + 20 CONTINUE + GO TO 70 +C PICK UP ENTRY NUMBER, STORE LENGTH IN NEW POSITION, SET NEW POINTER +C AND PREPARE TO COPY LIST. + 30 I = -IW(K) + IW(IWFR) = IPE(I) + IPE(I) = IWFR + K1 = K + 1 + K2 = K + IW(IWFR) + IWFR = IWFR + 1 + IF (K1.GT.K2) GO TO 50 +C COPY LIST TO NEW POSITION. + DO 40 K = K1,K2 + IW(IWFR) = IW(K) + IWFR = IWFR + 1 + 40 CONTINUE + 50 LWFR = K2 + 1 + 60 CONTINUE + 70 RETURN + + END + SUBROUTINE MA27JD(N,NZ,IRN,ICN,PERM,IW,LW,IPE,IQ,FLAG,IWFR, + + ICNTL,INFO) +C +C SORT PRIOR TO CALLING ANALYSIS ROUTINE MA27K/KD. +C +C GIVEN THE POSITIONS OF THE OFF-DIAGONAL NON-ZEROS OF A SYMMETRIC +C MATRIX AND A PERMUTATION, CONSTRUCT THE SPARSITY PATTERN +C OF THE STRICTLY UPPER TRIANGULAR PART OF THE PERMUTED MATRIX. +C EITHER ONE OF A PAIR (I,J),(J,I) MAY BE USED TO REPRESENT +C THE PAIR. DIAGONAL ELEMENTS ARE IGNORED. NO CHECK IS MADE +C FOR DUPLICATE ELEMENTS UNLESS ANY ROW HAS MORE THAN ICNTL(4) +C NON-ZEROS, IN WHICH CASE DUPLICATES ARE REMOVED. +C +C N MUST BE SET TO THE MATRIX ORDER. IT IS NOT ALTERED. +C NZ MUST BE SET TO THE NUMBER OF NON-ZEROS INPUT. IT IS NOT +C ALTERED. +C IRN(I),I=1,2,...,NZ MUST BE SET TO THE ROW INDICES OF THE +C NON-ZEROS ON INPUT. IT IS NOT ALTERED UNLESS EQUIVALENCED WITH IW. +C IRN(1) MAY BE EQUIVALENCED WITH IW(1). +C ICN(I),I=1,2,...,NZ MUST BE SET TO THE COLUMN INDICES OF THE +C NON-ZEROS ON INPUT. IT IS NOT ALTERED UNLESS EQUIVALENCED +C WITH IW.ICN(1) MAY BE EQUIVELENCED WITH IW(K),K.GT.NZ. +C PERM(I) MUST BE SET TO HOLD THE POSITION OF VARIABLE I IN THE +C PERMUTED ORDER. IT IS NOT ALTERED. +C IW NEED NOT BE SET ON INPUT. ON OUTPUT IT CONTAINS LISTS OF +C COLUMN NUMBERS, EACH LIST BEING HEADED BY ITS LENGTH. +C LW MUST BE SET TO THE LENGTH OF IW. IT MUST BE AT LEAST +C MAX(NZ,N+(NO. OF OFF-DIAGONAL NON-ZEROS)). IT IS NOT ALTERED. +C IPE NEED NOT BE SET ON INPUT. ON OUTPUT IPE(I) POINTS TO THE START OF +C THE ENTRY IN IW FOR ROW I, OR IS ZERO IF THERE IS NO ENTRY. +C IQ NEED NOT BE SET. ON OUTPUT IQ(I) CONTAINS THE NUMBER OF +C OFF-DIAGONAL NON-ZEROS IN ROW I, INCLUDING DUPLICATES. +C FLAG IS USED FOR WORKSPACE TO HOLD FLAGS TO PERMIT DUPLICATE +C ENTRIES TO BE IDENTIFIED QUICKLY. +C IWFR NEED NOT BE SET ON INPUT. ON OUTPUT IT POINTS TO THE FIRST +C UNUSED LOCATION IN IW. +C ICNTL is an INTEGER array of length 30, see MA27A/AD. +C INFO is an INTEGER array of length 20, see MA27A/AD. +C +C .. Scalar Arguments .. + INTEGER IWFR,LW,N,NZ +C .. +C .. Array Arguments .. + INTEGER FLAG(N),ICN(*),IPE(N),IQ(N),IRN(*),IW(LW),PERM(N) + INTEGER ICNTL(30),INFO(20) +C .. +C .. Local Scalars .. + INTEGER I,ID,IN,J,JDUMMY,K,K1,K2,L,LBIG,LEN +C .. +C .. Intrinsic Functions .. + INTRINSIC MAX +C .. +C .. Executable Statements .. +C +C INITIALIZE INFO(1), INFO(2) AND IQ + INFO(1) = 0 + INFO(2) = 0 + DO 10 I = 1,N + IQ(I) = 0 + 10 CONTINUE +C +C COUNT THE NUMBERS OF NON-ZEROS IN THE ROWS, PRINT WARNINGS ABOUT +C OUT-OF-RANGE INDICES AND TRANSFER GENUINE ROW NUMBERS +C (NEGATED) INTO IW. + IF (NZ.EQ.0) GO TO 110 + DO 100 K = 1,NZ + I = IRN(K) + J = ICN(K) + IW(K) = -I + IF(I.LT.J) THEN + IF (I.GE.1 .AND. J.LE.N) GO TO 80 + ELSE IF(I.GT.J) THEN + IF (J.GE.1 .AND. I.LE.N) GO TO 80 + ELSE + IW(K) = 0 + IF (I.GE.1 .AND. I.LE.N) GO TO 100 + END IF + INFO(2) = INFO(2) + 1 + INFO(1) = 1 + IW(K) = 0 + IF (INFO(2).LE.1 .AND. ICNTL(2).GT.0) THEN + WRITE (ICNTL(2),FMT=60) INFO(1) + END IF + + 60 FORMAT (' *** WARNING MESSAGE FROM SUBROUTINE MA27AD', + + ' *** INFO(1) =',I2) + + IF (INFO(2).LE.10 .AND. ICNTL(2).GT.0) THEN + WRITE (ICNTL(2),FMT=70) K,I,J + END IF + + 70 FORMAT (I6,'TH NON-ZERO (IN ROW',I6,' AND COLUMN',I6, + + ') IGNORED') + + GO TO 100 + + 80 IF (PERM(J).GT.PERM(I)) GO TO 90 + IQ(J) = IQ(J) + 1 + GO TO 100 + + 90 IQ(I) = IQ(I) + 1 + 100 CONTINUE +C +C ACCUMULATE ROW COUNTS TO GET POINTERS TO ROW ENDS +C IN IPE. + 110 IWFR = 1 + LBIG = 0 + DO 120 I = 1,N + L = IQ(I) + LBIG = MAX(L,LBIG) + IWFR = IWFR + L + IPE(I) = IWFR - 1 + 120 CONTINUE +C +C PERFORM IN-PLACE SORT + IF (NZ.EQ.0) GO TO 250 + DO 160 K = 1,NZ + I = -IW(K) + IF (I.LE.0) GO TO 160 + L = K + IW(K) = 0 + DO 150 ID = 1,NZ + J = ICN(L) + IF (PERM(I).LT.PERM(J)) GO TO 130 + L = IPE(J) + IPE(J) = L - 1 + IN = IW(L) + IW(L) = I + GO TO 140 + + 130 L = IPE(I) + IPE(I) = L - 1 + IN = IW(L) + IW(L) = J + 140 I = -IN + IF (I.LE.0) GO TO 160 + 150 CONTINUE + 160 CONTINUE +C +C MAKE ROOM IN IW FOR ROW LENGTHS AND INITIALIZE FLAG. + K = IWFR - 1 + L = K + N + IWFR = L + 1 + DO 190 I = 1,N + FLAG(I) = 0 + J = N + 1 - I + LEN = IQ(J) + IF (LEN.LE.0) GO TO 180 + DO 170 JDUMMY = 1,LEN + IW(L) = IW(K) + K = K - 1 + L = L - 1 + 170 CONTINUE + 180 IPE(J) = L + L = L - 1 + 190 CONTINUE + IF (LBIG.GE.ICNTL(4)) GO TO 210 +C +C PLACE ROW LENGTHS IN IW + DO 200 I = 1,N + K = IPE(I) + IW(K) = IQ(I) + IF (IQ(I).EQ.0) IPE(I) = 0 + 200 CONTINUE + GO TO 250 +C +C +C REMOVE DUPLICATE ENTRIES + 210 IWFR = 1 + DO 240 I = 1,N + K1 = IPE(I) + 1 + K2 = IPE(I) + IQ(I) + IF (K1.LE.K2) GO TO 220 + IPE(I) = 0 + GO TO 240 + + 220 IPE(I) = IWFR + IWFR = IWFR + 1 + DO 230 K = K1,K2 + J = IW(K) + IF (FLAG(J).EQ.I) GO TO 230 + IW(IWFR) = J + IWFR = IWFR + 1 + FLAG(J) = I + 230 CONTINUE + K = IPE(I) + IW(K) = IWFR - K - 1 + 240 CONTINUE + 250 RETURN + + END + SUBROUTINE MA27KD(N,IPE,IW,LW,IWFR,IPS,IPV,NV,FLAG,NCMPA) +C +C USING A GIVEN PIVOTAL SEQUENCE AND A REPRESENTATION OF THE MATRIX THAT +C INCLUDES ONLY NON-ZEROS OF THE STRICTLY UPPER-TRIANGULAR PART +C OF THE PERMUTED MATRIX, CONSTRUCT TREE POINTERS. +C +C N MUST BE SET TO THE MATRIX ORDER. IT IS NOT ALTERED. +C IPE(I) MUST BE SET TO POINT TO THE POSITION IN IW OF THE +C START OF ROW I OR HAVE THE VALUE ZERO IF ROW I HAS NO OFF- +C DIAGONAL NON-ZEROS. DURING EXECUTION IT IS USED AS FOLLOWS. +C IF VARIABLE I IS ELIMINATED THEN IPE(I) POINTS TO THE LIST +C OF VARIABLES FOR CREATED ELEMENT I. IF ELEMENT I IS +C ABSORBED INTO NEWLY CREATED ELEMENT J THEN IPE(I)=-J. +C IW MUST BE SET ON ENTRY TO HOLD LISTS OF VARIABLES BY +C ROWS, EACH LIST BEING HEADED BY ITS LENGTH. WHEN A VARIABLE +C IS ELIMINATED ITS LIST IS REPLACED BY A LIST OF VARIABLES +C IN THE NEW ELEMENT. +C LW MUST BE SET TO THE LENGTH OF IW. IT IS NOT ALTERED. +C IWFR MUST BE SET TO THE POSITION IN IW OF THE FIRST FREE VARIABLE. +C IT IS REVISED DURING EXECUTION, CONTINUING TO HAVE THIS MEANING. +C IPS(I) MUST BE SET TO THE POSITION OF VARIABLE I IN THE REQUIRED +C ORDERING. IT IS NOT ALTERED. +C IPV NEED NOT BE SET. IPV(K) IS SET TO HOLD THE K TH VARIABLE +C IN PIVOT ORDER. +C NV NEED NOT BE SET. IF VARIABLE J HAS NOT BEEN ELIMINATED THEN +C THE LAST ELEMENT WHOSE LEADING VARIABLE (VARIABLE EARLIEST +C IN THE PIVOT SEQUENCE) IS J IS ELEMENT NV(J). IF ELEMENT J +C EXISTS THEN THE LAST ELEMENT HAVING THE SAME LEADING +C VARIABLE IS NV(J). IN BOTH CASES NV(J)=0 IF THERE IS NO SUCH +C ELEMENT. IF ELEMENT J HAS BEEN MERGED INTO A LATER ELEMENT +C THEN NV(J) IS THE DEGREE AT THE TIME OF ELIMINATION. +C FLAG IS USED AS WORKSPACE FOR VARIABLE FLAGS. +C FLAG(JS)=ME IF JS HAS BEEN INCLUDED IN THE LIST FOR ME. +C NCMPA see INFO(11) in MA27A/AD. +C +C .. Scalar Arguments .. + INTEGER IWFR,LW,N,NCMPA +C .. +C .. Array Arguments .. + INTEGER FLAG(N),IPE(N),IPS(N),IPV(N),IW(LW),NV(N) +C .. +C .. Local Scalars .. + INTEGER I,IE,IP,J,JE,JP,JP1,JP2,JS,KDUMMY,LN,LWFR,ME,MINJS,ML,MS +C .. +C .. External Subroutines .. + EXTERNAL MA27UD +C .. +C .. Intrinsic Functions .. + INTRINSIC MIN +C .. +C .. Executable Statements .. +C +C INITIALIZATIONS + DO 10 I = 1,N + FLAG(I) = 0 + NV(I) = 0 + J = IPS(I) + IPV(J) = I + 10 CONTINUE + NCMPA = 0 +C +C START OF MAIN LOOP +C + DO 100 ML = 1,N +C ME=MS IS THE NAME OF THE VARIABLE ELIMINATED AND +C OF THE ELEMENT CREATED IN THE MAIN LOOP. + MS = IPV(ML) + ME = MS + FLAG(MS) = ME +C +C MERGE ROW MS WITH ALL THE ELEMENTS HAVING MS AS LEADING VARIABLE. +C IP POINTS TO THE START OF THE NEW LIST. + IP = IWFR +C MINJS IS SET TO THE POSITION IN THE ORDER OF THE LEADING VARIABLE +C IN THE NEW LIST. + MINJS = N + IE = ME + DO 70 KDUMMY = 1,N +C SEARCH VARIABLE LIST OF ELEMENT IE. +C JP POINTS TO THE CURRENT POSITION IN THE LIST BEING SEARCHED. + JP = IPE(IE) +C LN IS THE LENGTH OF THE LIST BEING SEARCHED. + LN = 0 + IF (JP.LE.0) GO TO 60 + LN = IW(JP) +C +C SEARCH FOR DIFFERENT VARIABLES AND ADD THEM TO LIST, +C COMPRESSING WHEN NECESSARY + DO 50 JP1 = 1,LN + JP = JP + 1 +C PLACE NEXT VARIABLE IN JS. + JS = IW(JP) +C JUMP IF VARIABLE HAS ALREADY BEEN INCLUDED. + IF (FLAG(JS).EQ.ME) GO TO 50 + FLAG(JS) = ME + IF (IWFR.LT.LW) GO TO 40 +C PREPARE FOR COMPRESSING IW BY ADJUSTING POINTER TO AND LENGTH OF +C THE LIST FOR IE TO REFER TO THE REMAINING ENTRIES. + IPE(IE) = JP + IW(JP) = LN - JP1 +C COMPRESS IW. + CALL MA27UD(N,IPE,IW,IP-1,LWFR,NCMPA) +C COPY NEW LIST FORWARD + JP2 = IWFR - 1 + IWFR = LWFR + IF (IP.GT.JP2) GO TO 30 + DO 20 JP = IP,JP2 + IW(IWFR) = IW(JP) + IWFR = IWFR + 1 + 20 CONTINUE + 30 IP = LWFR + JP = IPE(IE) +C ADD VARIABLE JS TO NEW LIST. + 40 IW(IWFR) = JS + MINJS = MIN(MINJS,IPS(JS)+0) + IWFR = IWFR + 1 + 50 CONTINUE +C RECORD ABSORPTION OF ELEMENT IE INTO NEW ELEMENT. + 60 IPE(IE) = -ME +C PICK UP NEXT ELEMENT WITH LEADING VARIABLE MS. + JE = NV(IE) +C STORE DEGREE OF IE. + NV(IE) = LN + 1 + IE = JE +C LEAVE LOOP IF THERE ARE NO MORE ELEMENTS. + IF (IE.EQ.0) GO TO 80 + 70 CONTINUE + 80 IF (IWFR.GT.IP) GO TO 90 +C DEAL WITH NULL NEW ELEMENT. + IPE(ME) = 0 + NV(ME) = 1 + GO TO 100 +C LINK NEW ELEMENT WITH OTHERS HAVING SAME LEADING VARIABLE. + 90 MINJS = IPV(MINJS) + NV(ME) = NV(MINJS) + NV(MINJS) = ME +C MOVE FIRST ENTRY IN NEW LIST TO END TO ALLOW ROOM FOR LENGTH AT +C FRONT. SET POINTER TO FRONT. + IW(IWFR) = IW(IP) + IW(IP) = IWFR - IP + IPE(ME) = IP + IWFR = IWFR + 1 + 100 CONTINUE + RETURN + + END + SUBROUTINE MA27LD(N,IPE,NV,IPS,NE,NA,ND,NSTEPS,NEMIN) +C +C TREE SEARCH +C +C GIVEN SON TO FATHER TREE POINTERS, PERFORM DEPTH-FIRST +C SEARCH TO FIND PIVOT ORDER AND NUMBER OF ELIMINATIONS +C AND ASSEMBLIES AT EACH STAGE. +C N MUST BE SET TO THE MATRIX ORDER. IT IS NOT ALTERED. +C IPE(I) MUST BE SET EQUAL TO -(FATHER OF NODE I) OR ZERO IF +C NODE IS A ROOT. IT IS ALTERED TO POINT TO ITS NEXT +C YOUNGER BROTHER IF IT HAS ONE, BUT OTHERWISE IS NOT +C CHANGED. +C NV(I) MUST BE SET TO ZERO IF NO VARIABLES ARE ELIMINATED AT NODE +C I AND TO THE DEGREE OTHERWISE. ONLY LEAF NODES CAN HAVE +C ZERO VALUES OF NV(I). NV IS NOT ALTERED. +C IPS(I) NEED NOT BE SET. IT IS USED TEMPORARILY TO HOLD +C -(ELDEST SON OF NODE I) IF IT HAS ONE AND 0 OTHERWISE. IT IS +C EVENTUALLY SET TO HOLD THE POSITION OF NODE I IN THE ORDER. +C NE(IS) NEED NOT BE SET. IT IS SET TO THE NUMBER OF VARIABLES +C ELIMINATED AT STAGE IS OF THE ELIMINATION. +C NA(IS) NEED NOT BE SET. IT IS SET TO THE NUMBER OF ELEMENTS +C ASSEMBLED AT STAGE IS OF THE ELIMINATION. +C ND(IS) NEED NOT BE SET. IT IS SET TO THE DEGREE AT STAGE IS OF +C THE ELIMINATION. +C NSTEPS NEED NOT BE SET. IT IS SET TO THE NUMBER OF ELIMINATION +C STEPS. +C NEMIN see ICNTL(5) in MA27A/AD. +C +C .. Scalar Arguments .. + INTEGER N,NSTEPS,NEMIN +C .. +C .. Array Arguments .. + INTEGER IPE(N),IPS(N),NA(N),ND(N),NE(N),NV(N) +C .. +C .. Local Scalars .. + INTEGER I,IB,IF,IL,IS,ISON,K,L,NR +C .. +C .. Executable Statements .. +C INITIALIZE IPS AND NE. + DO 10 I = 1,N + IPS(I) = 0 + NE(I) = 0 + 10 CONTINUE +C +C SET IPS(I) TO -(ELDEST SON OF NODE I) AND IPE(I) TO NEXT YOUNGER +C BROTHER OF NODE I IF IT HAS ONE. +C FIRST PASS IS FOR NODES WITHOUT ELIMINATIONS. + DO 20 I = 1,N + IF (NV(I).GT.0) GO TO 20 + IF = -IPE(I) + IS = -IPS(IF) + IF (IS.GT.0) IPE(I) = IS + IPS(IF) = -I + 20 CONTINUE +C NR IS DECREMENTED FOR EACH ROOT NODE. THESE ARE STORED IN +C NE(I),I=NR,N. + NR = N + 1 +C SECOND PASS TO ADD NODES WITH ELIMINATIONS. + DO 50 I = 1,N + IF (NV(I).LE.0) GO TO 50 +C NODE IF IS THE FATHER OF NODE I. + IF = -IPE(I) + IF (IF.EQ.0) GO TO 40 + IS = -IPS(IF) +C JUMP IF NODE IF HAS NO SONS YET. + IF (IS.LE.0) GO TO 30 +C SET POINTER TO NEXT BROTHER + IPE(I) = IS +C NODE I IS ELDEST SON OF NODE IF. + 30 IPS(IF) = -I + GO TO 50 +C WE HAVE A ROOT + 40 NR = NR - 1 + NE(NR) = I + 50 CONTINUE +C +C DEPTH-FIRST SEARCH. +C IL HOLDS THE CURRENT TREE LEVEL. ROOTS ARE AT LEVEL N, THEIR SONS +C ARE AT LEVEL N-1, ETC. +C IS HOLDS THE CURRENT ELIMINATION STAGE. WE ACCUMULATE THE NUMBER +C OF ELIMINATIONS AT STAGE IS DIRECTLY IN NE(IS). THE NUMBER OF +C ASSEMBLIES IS ACCUMULATED TEMPORARILY IN NA(IL), FOR TREE +C LEVEL IL, AND IS TRANSFERED TO NA(IS) WHEN WE REACH THE +C APPROPRIATE STAGE IS. + IS = 1 +C I IS THE CURRENT NODE. + I = 0 + DO 160 K = 1,N + IF (I.GT.0) GO TO 60 +C PICK UP NEXT ROOT. + I = NE(NR) + NE(NR) = 0 + NR = NR + 1 + IL = N + NA(N) = 0 +C GO TO SON FOR AS LONG AS POSSIBLE, CLEARING FATHER-SON POINTERS +C IN IPS AS EACH IS USED AND SETTING NA(IL)=0 FOR ALL LEVELS +C REACHED. + 60 DO 70 L = 1,N + IF (IPS(I).GE.0) GO TO 80 + ISON = -IPS(I) + IPS(I) = 0 + I = ISON + IL = IL - 1 + NA(IL) = 0 + 70 CONTINUE +C RECORD POSITION OF NODE I IN THE ORDER. + 80 IPS(I) = K + NE(IS) = NE(IS) + 1 +C JUMP IF NODE HAS NO ELIMINATIONS. + IF (NV(I).LE.0) GO TO 120 + IF (IL.LT.N) NA(IL+1) = NA(IL+1) + 1 + NA(IS) = NA(IL) + ND(IS) = NV(I) +C CHECK FOR STATIC CONDENSATION + IF (NA(IS).NE.1) GO TO 90 + IF (ND(IS-1)-NE(IS-1).EQ.ND(IS)) GO TO 100 +C CHECK FOR SMALL NUMBERS OF ELIMINATIONS IN BOTH LAST TWO STEPS. + 90 IF (NE(IS).GE.NEMIN) GO TO 110 + IF (NA(IS).EQ.0) GO TO 110 + IF (NE(IS-1).GE.NEMIN) GO TO 110 +C COMBINE THE LAST TWO STEPS + 100 NA(IS-1) = NA(IS-1) + NA(IS) - 1 + ND(IS-1) = ND(IS) + NE(IS-1) + NE(IS-1) = NE(IS) + NE(IS-1) + NE(IS) = 0 + GO TO 120 + + 110 IS = IS + 1 + 120 IB = IPE(I) + IF (IB.GE.0) THEN +C NODE I HAS A BROTHER OR IS A ROOT + IF (IB.GT.0) NA(IL) = 0 + I = IB + ELSE +C GO TO FATHER OF NODE I + I = -IB + IL = IL + 1 + END IF + 160 CONTINUE + NSTEPS = IS - 1 + RETURN + + END + SUBROUTINE MA27MD(N,NZ,IRN,ICN,PERM,NA,NE,ND,NSTEPS,LSTKI,LSTKR, + + IW,INFO,OPS) +C +C STORAGE AND OPERATION COUNT EVALUATION. +C +C EVALUATE NUMBER OF OPERATIONS AND SPACE REQUIRED BY FACTORIZATION +C USING MA27B/BD. THE VALUES GIVEN ARE EXACT ONLY IF NO NUMERICAL +C PIVOTING IS PERFORMED AND THEN ONLY IF IRN(1) WAS NOT +C EQUIVALENCED TO IW(1) BY THE USER BEFORE CALLING MA27A/AD. IF +C THE EQUIVALENCE HAS BEEN MADE ONLY AN UPPER BOUND FOR NIRNEC +C AND NRLNEC CAN BE CALCULATED ALTHOUGH THE OTHER COUNTS WILL +C STILL BE EXACT. +C +C N MUST BE SET TO THE MATRIX ORDER. IT IS NOT ALTERED. +C NZ MUST BE SET TO THE NUMBER OF NON-ZEROS INPUT. IT IS NOT ALTERED. +C IRN,ICN. UNLESS IRN(1) HAS BEEN EQUIVALENCED TO IW(1) +C IRN,ICN MUST BE SET TO THE ROW AND COLUMN INDICES OF THE +C NON-ZEROS ON INPUT. THEY ARE NOT ALTERED BY MA27M/MD. +C PERM MUST BE SET TO THE POSITION IN THE PIVOT ORDER OF EACH ROW. +C IT IS NOT ALTERED. +C NA,NE,ND MUST BE SET TO HOLD, FOR EACH TREE NODE, THE NUMBER OF STACK +C ELEMENTS ASSEMBLED, THE NUMBER OF ELIMINATIONS AND THE SIZE OF +C THE ASSEMBLED FRONT MATRIX RESPECTIVELY. THEY ARE NOT ALTERED. +C NSTEPS MUST BE SET TO HOLD THE NUMBER OF TREE NODES. IT IS NOT +C ALTERED. +C LSTKI IS USED AS A WORK ARRAY BY MA27M/MD. +C LSTKR. IF IRN(1) IS EQUIVALENCED TO IW(1) THEN LSTKR(I) +C MUST HOLD THE TOTAL NUMBER OF OFF-DIAGONAL ENTRIES (INCLUDING +C DUPLICATES) IN ROW I (I=1,..,N) OF THE ORIGINAL MATRIX. IT +C IS USED AS WORKSPACE BY MA27M/MD. +C IW IS A WORKSPACE ARRAY USED BY OTHER SUBROUTINES AND PASSED TO THIS +C SUBROUTINE ONLY SO THAT A TEST FOR EQUIVALENCE WITH IRN CAN BE +C MADE. +C +C COUNTS FOR OPERATIONS AND STORAGE ARE ACCUMULATED IN VARIABLES +C OPS,NRLTOT,NIRTOT,NRLNEC,NIRNEC,NRLADU,NRLNEC,NIRNEC. +C OPS NUMBER OF MULTIPLICATIONS AND ADDITIONS DURING FACTORIZATION. +C NRLADU,NIRADU REAL AND INTEGER STORAGE RESPECTIVELY FOR THE +C MATRIX FACTORS. +C NRLTOT,NIRTOT REAL AND INTEGER STRORAGE RESPECTIVELY REQUIRED +C FOR THE FACTORIZATION IF NO COMPRESSES ARE ALLOWED. +C NRLNEC,NIRNEC REAL AND INTEGER STORAGE RESPECTIVELY REQUIRED FOR +C THE FACTORIZATION IF COMPRESSES ARE ALLOWED. +C INFO is an INTEGER array of length 20, see MA27A/AD. +C OPS ACCUMULATES THE NO. OF MULTIPLY/ADD PAIRS NEEDED TO CREATE THE +C TRIANGULAR FACTORIZATION, IN THE DEFINITE CASE. +C +C .. Scalar Arguments .. + DOUBLE PRECISION OPS + INTEGER N,NSTEPS,NZ +C .. +C .. Array Arguments .. + INTEGER ICN(*),IRN(*),IW(*),LSTKI(N),LSTKR(N),NA(NSTEPS), + + ND(NSTEPS),NE(NSTEPS),PERM(N),INFO(20) +C .. +C .. Local Scalars .. + INTEGER I,INEW,IOLD,IORG,IROW,ISTKI,ISTKR,ITOP,ITREE,JOLD,JORG,K, + + LSTK,NASSR,NELIM,NFR,NSTK,NUMORG,NZ1,NZ2 + DOUBLE PRECISION DELIM + INTEGER NRLADU,NIRADU,NIRTOT,NRLTOT,NIRNEC,NRLNEC +C .. +C .. Intrinsic Functions .. + INTRINSIC MAX,MIN +C .. +C .. Executable Statements .. +C + IF (NZ.EQ.0) GO TO 20 +C JUMP IF IW AND IRN HAVE NOT BEEN EQUIVALENCED. + IF (IRN(1).NE.IW(1)) GO TO 20 +C RESET IRN(1). + IRN(1) = IW(1) - 1 +C THE TOTAL NUMBER OF OFF-DIAGONAL ENTRIES IS ACCUMULATED IN NZ2. +C LSTKI IS SET TO HOLD THE TOTAL NUMBER OF ENTRIES (INCUDING +C THE DIAGONAL) IN EACH ROW IN PERMUTED ORDER. + NZ2 = 0 + DO 10 IOLD = 1,N + INEW = PERM(IOLD) + LSTKI(INEW) = LSTKR(IOLD) + 1 + NZ2 = NZ2 + LSTKR(IOLD) + 10 CONTINUE +C NZ1 IS THE NUMBER OF ENTRIES IN ONE TRIANGLE INCLUDING THE DIAGONAL. +C NZ2 IS THE TOTAL NUMBER OF ENTRIES INCLUDING THE DIAGONAL. + NZ1 = NZ2/2 + N + NZ2 = NZ2 + N + GO TO 60 +C COUNT (IN LSTKI) NON-ZEROS IN ORIGINAL MATRIX BY PERMUTED ROW (UPPER +C TRIANGLE ONLY). INITIALIZE COUNTS. + 20 DO 30 I = 1,N + LSTKI(I) = 1 + 30 CONTINUE +C ACCUMULATE NUMBER OF NON-ZEROS WITH INDICES IN RANGE IN NZ1 +C DUPLICATES ON THE DIAGONAL ARE IGNORED BUT NZ1 INCLUDES ANY +C DIAGONALS NOT PRESENT ON INPUT. +C ACCUMULATE ROW COUNTS IN LSTKI. + NZ1 = N + IF (NZ.EQ.0) GO TO 50 + DO 40 I = 1,NZ + IOLD = IRN(I) + JOLD = ICN(I) +C JUMP IF INDEX IS OUT OF RANGE. + IF (IOLD.LT.1 .OR. IOLD.GT.N) GO TO 40 + IF (JOLD.LT.1 .OR. JOLD.GT.N) GO TO 40 + IF (IOLD.EQ.JOLD) GO TO 40 + NZ1 = NZ1 + 1 + IROW = MIN(PERM(IOLD)+0,PERM(JOLD)+0) + LSTKI(IROW) = LSTKI(IROW) + 1 + 40 CONTINUE + 50 NZ2 = NZ1 +C ISTKR,ISTKI CURRENT NUMBER OF STACK ENTRIES IN +C REAL AND INTEGER STORAGE RESPECTIVELY. +C OPS,NRLADU,NIRADU,NIRTOT,NRLTOT,NIRNEC,NRLNEC,NZ2 ARE DEFINED ABOVE. +C NZ2 CURRENT NUMBER OF ORIGINAL MATRIX ENTRIES NOT YET PROCESSED. +C NUMORG CURRENT TOTAL NUMBER OF ROWS ELIMINATED. +C ITOP CURRENT NUMBER OF ELEMENTS ON THE STACK. + 60 ISTKI = 0 + ISTKR = 0 + OPS = 0.0D0 + NRLADU = 0 +C ONE LOCATION IS NEEDED TO RECORD THE NUMBER OF BLOCKS +C ACTUALLY USED. + NIRADU = 1 + NIRTOT = NZ1 + NRLTOT = NZ1 + NIRNEC = NZ2 + NRLNEC = NZ2 + NUMORG = 0 + ITOP = 0 +C +C EACH PASS THROUGH THIS LOOP PROCESSES A NODE OF THE TREE. + DO 100 ITREE = 1,NSTEPS + NELIM = NE(ITREE) + DELIM = NELIM + NFR = ND(ITREE) + NSTK = NA(ITREE) +C ADJUST STORAGE COUNTS ON ASSEMBLY OF CURRENT FRONTAL MATRIX. + NASSR = NFR* (NFR+1)/2 + IF (NSTK.NE.0) NASSR = NASSR - LSTKR(ITOP) + 1 + NRLTOT = MAX(NRLTOT,NRLADU+NASSR+ISTKR+NZ1) + NIRTOT = MAX(NIRTOT,NIRADU+NFR+2+ISTKI+NZ1) + NRLNEC = MAX(NRLNEC,NRLADU+NASSR+ISTKR+NZ2) + NIRNEC = MAX(NIRNEC,NIRADU+NFR+2+ISTKI+NZ2) +C DECREASE NZ2 BY THE NUMBER OF ENTRIES IN ROWS BEING ELIMINATED AT +C THIS STAGE. + DO 70 IORG = 1,NELIM + JORG = NUMORG + IORG + NZ2 = NZ2 - LSTKI(JORG) + 70 CONTINUE + NUMORG = NUMORG + NELIM +C JUMP IF THERE ARE NO STACK ASSEMBLIES AT THIS NODE. + IF (NSTK.LE.0) GO TO 90 +C REMOVE ELEMENTS FROM THE STACK. THERE ARE ITOP ELEMENTS ON THE +C STACK WITH THE APPROPRIATE ENTRIES IN LSTKR,LSTKI GIVING +C THE REAL AND INTEGER STORAGE RESPECTIVELY FOR EACH STACK +C ELEMENT. + DO 80 K = 1,NSTK + LSTK = LSTKR(ITOP) + ISTKR = ISTKR - LSTK + LSTK = LSTKI(ITOP) + ISTKI = ISTKI - LSTK + ITOP = ITOP - 1 + 80 CONTINUE +C ACCUMULATE NON-ZEROS IN FACTORS AND NUMBER OF OPERATIONS. + 90 NRLADU = NRLADU + (NELIM* (2*NFR-NELIM+1))/2 + NIRADU = NIRADU + 2 + NFR + IF (NELIM.EQ.1) NIRADU = NIRADU - 1 + OPS = OPS + ((NFR*DELIM*(NFR+1)-(2*NFR+1)*DELIM*(DELIM+1)/2+ + + DELIM* (DELIM+1)* (2*DELIM+1)/6)/2) + IF (ITREE.EQ.NSTEPS) GO TO 100 +C JUMP IF ALL OF FRONTAL MATRIX HAS BEEN ELIMINATED. + IF (NFR.EQ.NELIM) GO TO 100 +C STACK REMAINDER OF ELEMENT. + ITOP = ITOP + 1 + LSTKR(ITOP) = (NFR-NELIM)* (NFR-NELIM+1)/2 + LSTKI(ITOP) = NFR - NELIM + 1 + ISTKI = ISTKI + LSTKI(ITOP) + ISTKR = ISTKR + LSTKR(ITOP) +C WE DO NOT NEED TO ADJUST THE COUNTS FOR THE REAL STORAGE BECAUSE +C THE REMAINDER OF THE FRONTAL MATRIX IS SIMPLY MOVED IN THE +C STORAGE FROM FACTORS TO STACK AND NO EXTRA STORAGE IS REQUIRED. + NIRTOT = MAX(NIRTOT,NIRADU+ISTKI+NZ1) + NIRNEC = MAX(NIRNEC,NIRADU+ISTKI+NZ2) + 100 CONTINUE +C +C ADJUST THE STORAGE COUNTS TO ALLOW FOR THE USE OF THE REAL AND +C INTEGER STORAGE FOR PURPOSES OTHER THAN PURELY THE +C FACTORIZATION ITSELF. +C THE SECOND TWO TERMS ARE THE MINUMUM AMOUNT REQUIRED BY MA27N/ND. + NRLNEC = MAX(NRLNEC,N+MAX(NZ,NZ1)) + NRLTOT = MAX(NRLTOT,N+MAX(NZ,NZ1)) + NRLNEC = MIN(NRLNEC,NRLTOT) + NIRNEC = MAX(NZ,NIRNEC) + NIRTOT = MAX(NZ,NIRTOT) + NIRNEC = MIN(NIRNEC,NIRTOT) + + INFO(3) = NRLTOT + INFO(4) = NIRTOT + INFO(5) = NRLNEC + INFO(6) = NIRNEC + INFO(7) = NRLADU + INFO(8) = NIRADU + RETURN + + END + SUBROUTINE MA27ND(N,NZ,NZ1,A,LA,IRN,ICN,IW,LIW,PERM,IW2,ICNTL, + + INFO) +C +C SORT PRIOR TO FACTORIZATION USING MA27O/OD. +C +C THIS SUBROUTINE REORDERS THE USER'S INPUT SO THAT THE UPPER TRIANGLE +C OF THE PERMUTED MATRIX, INCLUDING THE DIAGONAL, IS +C HELD ORDERED BY ROWS AT THE END OF THE STORAGE FOR A AND IW. +C IT IGNORES ENTRIES WITH ONE OR BOTH INDICES OUT OF RANGE AND +C ACCUMULATES DIAGONAL ENTRIES. +C IT ADDS EXPLICIT ZEROS ON THE DIAGONAL WHERE NECESSARY. +C N - MUST BE SET TO THE ORDER OF THE MATRIX. +C IT IS NOT ALTERED BY MA27N/ND. +C NZ - ON ENTRY NZ MUST BE SET TO THE NUMBER +C OF NON-ZEROS INPUT. NOT ALTERED BY MA27N/ND. +C NZ1 - ON EXIT NZ1 WILL BE EQUAL TO THE NUMBER OF ENTRIES IN THE +C SORTED MATRIX. +C A - ON ENTRY A(I) MUST +C HOLD THE VALUE OF THE ORIGINAL MATRIX ELEMENT IN POSITION +C (IRN(I),ICN(I)),I=1,NZ. ON EXIT A(LA-NZ1+I),I=1,NZ1 HOLDS +C THE UPPER TRIANGLE OF THE PERMUTED MATRIX BY ROWS WITH +C THE DIAGONAL ENTRY FIRST ALTHOUGH THERE IS NO FURTHER +C ORDERING WITHIN THE ROWS THEMSELVES. +C LA - LENGTH OF ARRAY A. MUST BE AT LEAST N+MAX(NZ,NZ1). +C IT IS NOT ALTERED BY MA27N/ND. +C IRN - IRN(I) MUST BE SET TO +C HOLD THE ROW INDEX OF ENTRY A(I),I=1,NZ. IRN WILL BE +C UNALTERED BY MA27N/ND, UNLESS IT IS EQUIVALENCED WITH IW. +C ICN - ICN(I) MUST BE SET TO +C HOLD THE COLUMN INDEX OF ENTRY A(I),I=1,NZ. ICN WILL BE +C UNALTERED BY MA27N/ND, UNLESS IT IS EQUIVALENCED WITH IW. +C IW - USED AS WORKSPACE AND ON +C EXIT, ENTRIES IW(LIW-NZ1+I),I=1,NZ1 HOLD THE COLUMN INDICES +C (THE ORIGINAL UNPERMUTED INDICES) OF THE CORRESPONDING ENTRY +C OF A WITH THE FIRST ENTRY FOR EACH ROW FLAGGED NEGATIVE. +C IRN(1) MAY BE EQUIVALENCED WITH IW(1) AND ICN(1) MAY BE +C EQUIVALENCED WITH IW(K) WHERE K.GT.NZ. +C LIW - LENGTH OF ARRAY IW. MUST BE AT LEAST AS +C GREAT AS THE MAXIMUM OF NZ AND NZ1. +C NOT ALTERED BY MA27N/ND. +C PERM - PERM(I) HOLDS THE +C POSITION IN THE TENTATIVE PIVOT ORDER OF ROW I IN THE +C ORIGINAL MATRIX,I=1,N. NOT ALTERED BY MA27N/ND. +C IW2 - USED AS WORKSPACE. +C SEE COMMENTS IN CODE IMMEDIATELY PRIOR TO +C EACH USE. +C ICNTL is an INTEGER array of length 30, see MA27A/AD. +C INFO is an INTEGER array of length 20, see MA27A/AD. +C INFO(1) - ON EXIT FROM MA27N/ND, A ZERO VALUE OF +C INFO(1) INDICATES THAT NO ERROR HAS BEEN DETECTED. +C POSSIBLE NON-ZERO VALUES ARE .. +C +1 WARNING. INDICES OUT OF RANGE. THESE ARE IGNORED, +C THEIR NUMBER IS RECORDED IN INFO(2) OF MA27E/ED AND +C MESSAGES IDENTIFYING THE FIRST TEN ARE OUTPUT ON UNIT +C ICNTL(2). +C -3 INTEGER ARRAY IW IS TOO SMALL. +C -4 DOUBLE PRECISION ARRAY A IS TOO SMALL. +C +C .. Parameters .. + DOUBLE PRECISION ZERO + PARAMETER (ZERO=0.0D0) +C .. +C .. Scalar Arguments .. + INTEGER LA,LIW,N,NZ,NZ1 +C .. +C .. Array Arguments .. + DOUBLE PRECISION A(LA) + INTEGER ICN(*),IRN(*),IW(LIW),IW2(N),PERM(N),ICNTL(30),INFO(20) +C .. +C .. Local Scalars .. + DOUBLE PRECISION ANEXT,ANOW + INTEGER I,IA,ICH,II,IIW,INEW,IOLD,IPOS,J1,J2,JJ,JNEW,JOLD,JPOS,K +C .. +C .. Intrinsic Functions .. + INTRINSIC MIN +C .. +C .. Executable Statements .. + INFO(1) = 0 +C INITIALIZE WORK ARRAY (IW2) IN PREPARATION FOR +C COUNTING NUMBERS OF NON-ZEROS IN THE ROWS AND INITIALIZE +C LAST N ENTRIES IN A WHICH WILL HOLD THE DIAGONAL ENTRIES + IA = LA + DO 10 IOLD = 1,N + IW2(IOLD) = 1 + A(IA) = ZERO + IA = IA - 1 + 10 CONTINUE +C SCAN INPUT COPYING ROW INDICES FROM IRN TO THE FIRST NZ POSITIONS +C IN IW. THE NEGATIVE OF THE INDEX IS HELD TO FLAG ENTRIES FOR +C THE IN-PLACE SORT. ENTRIES IN IW CORRESPONDING TO DIAGONALS AND +C ENTRIES WITH OUT-OF-RANGE INDICES ARE SET TO ZERO. +C FOR DIAGONAL ENTRIES, REALS ARE ACCUMULATED IN THE LAST N +C LOCATIONS OF A. +C THE NUMBER OF ENTRIES IN EACH ROW OF THE PERMUTED MATRIX IS +C ACCUMULATED IN IW2. +C INDICES OUT OF RANGE ARE IGNORED AFTER BEING COUNTED AND +C AFTER APPROPRIATE MESSAGES HAVE BEEN PRINTED. + INFO(2) = 0 +C NZ1 IS THE NUMBER OF NON-ZEROS HELD AFTER INDICES OUT OF RANGE HAVE +C BEEN IGNORED AND DIAGONAL ENTRIES ACCUMULATED. + NZ1 = N + IF (NZ.EQ.0) GO TO 80 + DO 70 K = 1,NZ + IOLD = IRN(K) + IF (IOLD.GT.N .OR. IOLD.LE.0) GO TO 30 + JOLD = ICN(K) + IF (JOLD.GT.N .OR. JOLD.LE.0) GO TO 30 + INEW = PERM(IOLD) + JNEW = PERM(JOLD) + IF (INEW.NE.JNEW) GO TO 20 + IA = LA - N + IOLD + A(IA) = A(IA) + A(K) + GO TO 60 + + 20 INEW = MIN(INEW,JNEW) +C INCREMENT NUMBER OF ENTRIES IN ROW INEW. + IW2(INEW) = IW2(INEW) + 1 + IW(K) = -IOLD + NZ1 = NZ1 + 1 + GO TO 70 +C ENTRY OUT OF RANGE. IT WILL BE IGNORED AND A FLAG SET. + 30 INFO(1) = 1 + INFO(2) = INFO(2) + 1 + IF (INFO(2).LE.1 .AND. ICNTL(2).GT.0) THEN + WRITE (ICNTL(2),FMT=40) INFO(1) + ENDIF + + 40 FORMAT (' *** WARNING MESSAGE FROM SUBROUTINE MA27BD', + + ' *** INFO(1) =',I2) + + IF (INFO(2).LE.10 .AND. ICNTL(2).GT.0) THEN + WRITE (ICNTL(2),FMT=50) K,IRN(K),ICN(K) + END IF + + 50 FORMAT (I6,'TH NON-ZERO (IN ROW',I6,' AND COLUMN',I6, + + ') IGNORED') + + 60 IW(K) = 0 + 70 CONTINUE +C CALCULATE POINTERS (IN IW2) TO THE POSITION IMMEDIATELY AFTER THE END +C OF EACH ROW. + 80 IF (NZ.LT.NZ1 .AND. NZ1.NE.N) GO TO 100 +C ROOM IS INCLUDED FOR THE DIAGONALS. + K = 1 + DO 90 I = 1,N + K = K + IW2(I) + IW2(I) = K + 90 CONTINUE + GO TO 120 +C ROOM IS NOT INCLUDED FOR THE DIAGONALS. + 100 K = 1 + DO 110 I = 1,N + K = K + IW2(I) - 1 + IW2(I) = K + 110 CONTINUE +C FAIL IF INSUFFICIENT SPACE IN ARRAYS A OR IW. + 120 IF (NZ1.GT.LIW) GO TO 210 + IF (NZ1+N.GT.LA) GO TO 220 +C NOW RUN THROUGH NON-ZEROS IN ORDER PLACING THEM IN THEIR NEW +C POSITION AND DECREMENTING APPROPRIATE IW2 ENTRY. IF WE ARE +C ABOUT TO OVERWRITE AN ENTRY NOT YET MOVED, WE MUST DEAL WITH +C THIS AT THIS TIME. + IF (NZ1.EQ.N) GO TO 180 + DO 140 K = 1,NZ + IOLD = -IW(K) + IF (IOLD.LE.0) GO TO 140 + JOLD = ICN(K) + ANOW = A(K) + IW(K) = 0 + DO 130 ICH = 1,NZ + INEW = PERM(IOLD) + JNEW = PERM(JOLD) + INEW = MIN(INEW,JNEW) + IF (INEW.EQ.PERM(JOLD)) JOLD = IOLD + JPOS = IW2(INEW) - 1 + IOLD = -IW(JPOS) + ANEXT = A(JPOS) + A(JPOS) = ANOW + IW(JPOS) = JOLD + IW2(INEW) = JPOS + IF (IOLD.EQ.0) GO TO 140 + ANOW = ANEXT + JOLD = ICN(JPOS) + 130 CONTINUE + 140 CONTINUE + IF (NZ.GE.NZ1) GO TO 180 +C MOVE UP ENTRIES TO ALLOW FOR DIAGONALS. + IPOS = NZ1 + JPOS = NZ1 - N + DO 170 II = 1,N + I = N - II + 1 + J1 = IW2(I) + J2 = JPOS + IF (J1.GT.JPOS) GO TO 160 + DO 150 JJ = J1,J2 + IW(IPOS) = IW(JPOS) + A(IPOS) = A(JPOS) + IPOS = IPOS - 1 + JPOS = JPOS - 1 + 150 CONTINUE + 160 IW2(I) = IPOS + 1 + IPOS = IPOS - 1 + 170 CONTINUE +C RUN THROUGH ROWS INSERTING DIAGONAL ENTRIES AND FLAGGING BEGINNING +C OF EACH ROW BY NEGATING FIRST COLUMN INDEX. + 180 DO 190 IOLD = 1,N + INEW = PERM(IOLD) + JPOS = IW2(INEW) - 1 + IA = LA - N + IOLD + A(JPOS) = A(IA) + IW(JPOS) = -IOLD + 190 CONTINUE +C MOVE SORTED MATRIX TO THE END OF THE ARRAYS. + IPOS = NZ1 + IA = LA + IIW = LIW + DO 200 I = 1,NZ1 + A(IA) = A(IPOS) + IW(IIW) = IW(IPOS) + IPOS = IPOS - 1 + IA = IA - 1 + IIW = IIW - 1 + 200 CONTINUE + GO TO 230 +C **** ERROR RETURN **** + 210 INFO(1) = -3 + INFO(2) = NZ1 + GO TO 230 + + 220 INFO(1) = -4 + INFO(2) = NZ1 + N +C + 230 RETURN + + END + SUBROUTINE MA27OD(N,NZ,A,LA,IW,LIW,PERM,NSTK,NSTEPS,MAXFRT,NELIM, + + IW2,ICNTL,CNTL,INFO) +C +C FACTORIZATION SUBROUTINE +C +C THIS SUBROUTINE OPERATES ON THE INPUT MATRIX ORDERED BY MA27N/ND AND +C PRODUCES THE FACTORS OF U AND D ('A'=UTRANSPOSE*D*U) FOR USE IN +C SUBSEQUENT SOLUTIONS. GAUSSIAN ELIMINATION IS USED WITH PIVOTS +C CHOSEN FROM THE DIAGONAL. TO ENSURE STABILITY, BLOCK PIVOTS OF +C ORDER 2 WILL BE USED IF THE DIAGONAL ENTRY IS NOT LARGE ENOUGH. +C +C N - MUST BE SET TO THE ORDER OF THE MATRIX. IT IS NOT ALTERED. +C NZ - MUST BE SET TO THE NUMBER OF NON-ZEROS IN UPPER TRIANGLE OF +C PERMUTED MATRIX. NOT ALTERED BY MA27O/OD. +C A - MUST BE SET ON INPUT TO MATRIX HELD BY ROWS REORDERED BY +C PERMUTATION FROM MA27A/AD IN A(LA-NZ+I),I=1,NZ. ON +C EXIT FROM MA27O/OD, THE FACTORS OF U AND D ARE HELD IN +C POSITIONS 1 TO POSFAC-1. +C LA - LENGTH OF ARRAY A. A VALUE FOR LA +C SUFFICIENT FOR DEFINITE SYSTEMS +C WILL HAVE BEEN PROVIDED BY MA27A/AD. NOT ALTERED BY MA27O/OD. +C IW - MUST BE SET SO THAT,ON INPUT, IW(LIW-NZ+I),I=1,NZ +C HOLDS THE COLUMN INDEX OF THE ENTRY IN A(LA-NZ+I). ON EXIT, +C IW HOLDS INTEGER INDEXING INFORMATION ON THE FACTORS. +C THE ABSOLUTE VALUE OF THE FIRST ENTRY IN IW WILL BE SET TO +C THE NUMBER OF BLOCK PIVOTS ACTUALLY USED. THIS MAY BE +C DIFFERENT FROM NSTEPS SINCE NUMERICAL CONSIDERATIONS +C MAY PREVENT US CHOOSING A PIVOT AT EACH STAGE. IF THIS ENTRY +C IN IW IS NEGATIVE, THEN AT LEAST ONE TWO BY TWO +C PIVOT HAS BEEN USED DURING THE DECOMPOSITION. +C INTEGER INFORMATION ON EACH BLOCK PIVOT ROW FOLLOWS. FOR +C EACH BLOCK PIVOT ROW THE COLUMN INDICES ARE PRECEDED BY A +C COUNT OF THE NUMBER OF ROWS AND COLUMNS IN THE BLOCK PIVOT +C WHERE, IF ONLY ONE ROW IS PRESENT, ONLY THE NUMBER OF +C COLUMNS TOGETHER WITH A NEGATIVE FLAG IS HELD. THE FIRST +C COLUMN INDEX FOR A TWO BY TWO PIVOT IS FLAGGED NEGATIVE. +C LIW - LENGTH OF ARRAY IW. A VALUE FOR LIW SUFFICIENT FOR +C DEFINITE SYSTEMS +C WILL HAVE BEEN PROVIDED BY MA27A/AD. NOT ALTERED BY MA27O/OD +C PERM - PERM(I) MUST BE SET TO POSITION OF ROW/COLUMN I IN THE +C TENTATIVE PIVOT ORDER GENERATED BY MA27A/AD. +C IT IS NOT ALTERED BY MA27O/OD. +C NSTK - MUST BE LEFT UNCHANGED SINCE OUTPUT FROM MA27A/AD. NSTK(I) +C GIVES THE NUMBER OF GENERATED STACK ELEMENTS ASSEMBLED AT +C STAGE I. IT IS NOT ALTERED BY MA27O/OD. +C NSTEPS - LENGTH OF ARRAYS NSTK AND NELIM. VALUE IS GIVEN ON OUTPUT +C FROM MA27A/AD (WILL NEVER EXCEED N). IT IS NOT ALTERED BY +C MA27O/OD. +C MAXFRT - NEED NOT BE SET ON INPUT. ON OUTPUT +C MAXFRT WILL BE SET TO THE MAXIMUM FRONT SIZE ENCOUNTERED +C DURING THE DECOMPOSITION. +C NELIM - MUST BE UNCHANGED SINCE OUTPUT FROM MA27A/AD. NELIM(I) +C GIVES THE NUMBER OF ORIGINAL ROWS ASSEMBLED AT STAGE I. +C IT IS NOT ALTERED BY MA27O/OD. +C IW2 - INTEGER ARRAY OF LENGTH N. USED AS WORKSPACE BY MA27O/OD. +C ALTHOUGH WE COULD HAVE USED A SHORT WORD INTEGER IN THE IBM +C VERSION, WE HAVE NOT DONE SO BECAUSE THERE IS A SPARE +C FULL INTEGER ARRAY (USED IN THE SORT BEFORE MA27O/OD) +C AVAILABLE WHEN MA27O/OD IS CALLED FROM MA27B/BD. +C ICNTL is an INTEGER array of length 30, see MA27A/AD. +C CNTL is a DOUBLE PRECISION array of length 5, see MA27A/AD. +C INFO is an INTEGER array of length 20, see MA27A/AD. +C INFO(1) - INTEGER VARIABLE. DIAGNOSTIC FLAG. A ZERO VALUE ON EXIT +C INDICATES SUCCESS. POSSIBLE NEGATIVE VALUES ARE ... +C -3 INSUFFICIENT STORAGE FOR IW. +C -4 INSUFFICIENT STORAGE FOR A. +C -5 ZERO PIVOT FOUND IN FACTORIZATION OF DEFINITE MATRIX. +C +C .. Parameters .. + DOUBLE PRECISION ZERO,HALF,ONE + PARAMETER (ZERO=0.0D0,HALF=0.5D0,ONE=1.0D0) +C .. +C .. Scalar Arguments .. + INTEGER LA,LIW,MAXFRT,N,NSTEPS,NZ +C .. +C .. Array Arguments .. + DOUBLE PRECISION A(LA),CNTL(5) + INTEGER IW(LIW),IW2(N),NELIM(NSTEPS),NSTK(NSTEPS),PERM(N) + INTEGER ICNTL(30),INFO(20) +C .. +C .. Local Scalars .. + DOUBLE PRECISION AMAX,AMULT,AMULT1,AMULT2,DETPIV,RMAX,SWOP, + + THRESH,TMAX,UU + INTEGER AINPUT,APOS,APOS1,APOS2,APOS3,ASTK,ASTK2,AZERO,I,IASS, + + IBEG,IDUMMY,IELL,IEND,IEXCH,IFR,IINPUT,IOLDPS,IORG,IPIV, + + IPMNP,IPOS,IROW,ISNPIV,ISTK,ISTK2,ISWOP,IWPOS,IX,IY,J,J1, + + J2,JCOL,JDUMMY,JFIRST,JJ,JJ1,JJJ,JLAST,JMAX,JMXMIP,JNEW, + + JNEXT,JPIV,JPOS,K,K1,K2,KDUMMY,KK,KMAX,KROW,LAELL,LAPOS2, + + LIELL,LNASS,LNPIV,LT,LTOPST,NASS,NBLK,NEWEL,NFRONT,NPIV, + + NPIVP1,NTOTPV,NUMASS,NUMORG,NUMSTK,PIVSIZ,POSFAC,POSPV1, + + POSPV2 + INTEGER NTWO,NEIG,NCMPBI,NCMPBR,NRLBDU,NIRBDU +C .. +C .. External Subroutines .. + EXTERNAL MA27PD +C .. +C .. Intrinsic Functions .. + INTRINSIC ABS,MAX,MIN +C .. +C .. Statement Functions .. + INTEGER IDIAG +C .. +C .. Statement Function definitions .. +C THE FOLLOWING ARITHMETIC FUNCTION GIVES THE DISPLACEMENT FROM +C THE START OF THE ASSEMBLED MATRIX(OF ORDER IX) OF THE DIAGONAL +C ENTRY IN ITS ROW IY. + IDIAG(IX,IY) = ((IY-1)* (2*IX-IY+2))/2 +C .. +C .. Executable Statements .. +C INITIALIZATION. +C NBLK IS THE NUMBER OF BLOCK PIVOTS USED. + NBLK = 0 + NTWO = 0 + NEIG = 0 + NCMPBI = 0 + NCMPBR = 0 + MAXFRT = 0 + NRLBDU = 0 + NIRBDU = 0 +C A PRIVATE VARIABLE UU IS SET TO CNTL(1), SO THAT CNTL(1) WILL REMAIN +C UNALTERED. + UU = MIN(CNTL(1),HALF) + UU = MAX(UU,-HALF) + DO 10 I = 1,N + IW2(I) = 0 + 10 CONTINUE +C IWPOS IS POINTER TO FIRST FREE POSITION FOR FACTORS IN IW. +C POSFAC IS POINTER FOR FACTORS IN A. AT EACH PASS THROUGH THE +C MAJOR LOOP POSFAC INITIALLY POINTS TO THE FIRST FREE LOCATION +C IN A AND THEN IS SET TO THE POSITION OF THE CURRENT PIVOT IN A. +C ISTK IS POINTER TO TOP OF STACK IN IW. +C ISTK2 IS POINTER TO BOTTOM OF STACK IN IW (NEEDED BY COMPRESS). +C ASTK IS POINTER TO TOP OF STACK IN A. +C ASTK2 IS POINTER TO BOTTOM OF STACK IN A (NEEDED BY COMPRESS). +C IINPUT IS POINTER TO CURRENT POSITION IN ORIGINAL ROWS IN IW. +C AINPUT IS POINTER TO CURRENT POSITION IN ORIGINAL ROWS IN A. +C AZERO IS POINTER TO LAST POSITION ZEROED IN A. +C NTOTPV IS THE TOTAL NUMBER OF PIVOTS SELECTED. THIS IS USED +C TO DETERMINE WHETHER THE MATRIX IS SINGULAR. + IWPOS = 2 + POSFAC = 1 + ISTK = LIW - NZ + 1 + ISTK2 = ISTK - 1 + ASTK = LA - NZ + 1 + ASTK2 = ASTK - 1 + IINPUT = ISTK + AINPUT = ASTK + AZERO = 0 + NTOTPV = 0 +C NUMASS IS THE ACCUMULATED NUMBER OF ROWS ASSEMBLED SO FAR. + NUMASS = 0 +C +C EACH PASS THROUGH THIS MAIN LOOP PERFORMS ALL THE OPERATIONS +C ASSOCIATED WITH ONE SET OF ASSEMBLY/ELIMINATIONS. + DO 760 IASS = 1,NSTEPS +C NASS WILL BE SET TO THE NUMBER OF FULLY ASSEMBLED VARIABLES IN +C CURRENT NEWLY CREATED ELEMENT. + NASS = NELIM(IASS) +C NEWEL IS A POINTER INTO IW TO CONTROL OUTPUT OF INTEGER INFORMATION +C FOR NEWLY CREATED ELEMENT. + NEWEL = IWPOS + 1 +C SYMBOLICALLY ASSEMBLE INCOMING ROWS AND GENERATED STACK ELEMENTS +C ORDERING THE RESULTANT ELEMENT ACCORDING TO PERMUTATION PERM. WE +C ASSEMBLE THE STACK ELEMENTS FIRST BECAUSE THESE WILL ALREADY BE +C ORDERED. +C SET HEADER POINTER FOR MERGE OF INDEX LISTS. + JFIRST = N + 1 +C INITIALIZE NUMBER OF VARIABLES IN CURRENT FRONT. + NFRONT = 0 + NUMSTK = NSTK(IASS) + LTOPST = 1 + LNASS = 0 +C JUMP IF NO STACK ELEMENTS ARE BEING ASSEMBLED AT THIS STAGE. + IF (NUMSTK.EQ.0) GO TO 80 + J2 = ISTK - 1 + LNASS = NASS + LTOPST = ((IW(ISTK)+1)*IW(ISTK))/2 + DO 70 IELL = 1,NUMSTK +C ASSEMBLE ELEMENT IELL PLACING +C THE INDICES INTO A LINKED LIST IN IW2 ORDERED +C ACCORDING TO PERM. + JNEXT = JFIRST + JLAST = N + 1 + J1 = J2 + 2 + J2 = J1 - 1 + IW(J1-1) +C RUN THROUGH INDEX LIST OF STACK ELEMENT IELL. + DO 60 JJ = J1,J2 + J = IW(JJ) +C JUMP IF ALREADY ASSEMBLED + IF (IW2(J).GT.0) GO TO 60 + JNEW = PERM(J) +C IF VARIABLE WAS PREVIOUSLY FULLY SUMMED BUT WAS NOT PIVOTED ON +C EARLIER BECAUSE OF NUMERICAL TEST, INCREMENT NUMBER OF FULLY +C SUMMED ROWS/COLUMNS IN FRONT. + IF (JNEW.LE.NUMASS) NASS = NASS + 1 +C FIND POSITION IN LINKED LIST FOR NEW VARIABLE. NOTE THAT WE START +C FROM WHERE WE LEFT OFF AFTER ASSEMBLY OF PREVIOUS VARIABLE. + DO 20 IDUMMY = 1,N + IF (JNEXT.EQ.N+1) GO TO 30 + IF (PERM(JNEXT).GT.JNEW) GO TO 30 + JLAST = JNEXT + JNEXT = IW2(JLAST) + 20 CONTINUE + 30 IF (JLAST.NE.N+1) GO TO 40 + JFIRST = J + GO TO 50 + + 40 IW2(JLAST) = J + 50 IW2(J) = JNEXT + JLAST = J +C INCREMENT NUMBER OF VARIABLES IN THE FRONT. + NFRONT = NFRONT + 1 + 60 CONTINUE + 70 CONTINUE + LNASS = NASS - LNASS +C NOW INCORPORATE ORIGINAL ROWS. NOTE THAT THE COLUMNS IN THESE ROWS +C NEED NOT BE IN ORDER. WE ALSO PERFORM +C A SWOP SO THAT THE DIAGONAL ENTRY IS THE FIRST IN ITS +C ROW. THIS ALLOWS US TO AVOID STORING THE INVERSE OF ARRAY PERM. + 80 NUMORG = NELIM(IASS) + J1 = IINPUT + DO 150 IORG = 1,NUMORG + J = -IW(J1) + DO 140 IDUMMY = 1,LIW + JNEW = PERM(J) +C JUMP IF VARIABLE ALREADY INCLUDED. + IF (IW2(J).GT.0) GO TO 130 +C HERE WE MUST ALWAYS START OUR SEARCH AT THE BEGINNING. + JLAST = N + 1 + JNEXT = JFIRST + DO 90 JDUMMY = 1,N + IF (JNEXT.EQ.N+1) GO TO 100 + IF (PERM(JNEXT).GT.JNEW) GO TO 100 + JLAST = JNEXT + JNEXT = IW2(JLAST) + 90 CONTINUE + 100 IF (JLAST.NE.N+1) GO TO 110 + JFIRST = J + GO TO 120 + + 110 IW2(JLAST) = J + 120 IW2(J) = JNEXT +C INCREMENT NUMBER OF VARIABLES IN FRONT. + NFRONT = NFRONT + 1 + 130 J1 = J1 + 1 + IF (J1.GT.LIW) GO TO 150 + J = IW(J1) + IF (J.LT.0) GO TO 150 + 140 CONTINUE + 150 CONTINUE +C NOW RUN THROUGH LINKED LIST IW2 PUTTING INDICES OF VARIABLES IN NEW +C ELEMENT INTO IW AND SETTING IW2 ENTRY TO POINT TO THE RELATIVE +C POSITION OF THE VARIABLE IN THE NEW ELEMENT. + IF (NEWEL+NFRONT.LT.ISTK) GO TO 160 +C COMPRESS IW. + CALL MA27PD(A,IW,ISTK,ISTK2,IINPUT,2,NCMPBR,NCMPBI) + IF (NEWEL+NFRONT.LT.ISTK) GO TO 160 + INFO(2) = LIW + 1 + NEWEL + NFRONT - ISTK + GO TO 770 + + 160 J = JFIRST + DO 170 IFR = 1,NFRONT + NEWEL = NEWEL + 1 + IW(NEWEL) = J + JNEXT = IW2(J) + IW2(J) = NEWEL - (IWPOS+1) + J = JNEXT + 170 CONTINUE +C +C ASSEMBLE REALS INTO FRONTAL MATRIX. + MAXFRT = MAX(MAXFRT,NFRONT) + IW(IWPOS) = NFRONT +C FIRST ZERO OUT FRONTAL MATRIX AS APPROPRIATE FIRST CHECKING TO SEE +C IF THERE IS SUFFICIENT SPACE. + LAELL = ((NFRONT+1)*NFRONT)/2 + APOS2 = POSFAC + LAELL - 1 + IF (NUMSTK.NE.0) LNASS = LNASS* (2*NFRONT-LNASS+1)/2 + IF (POSFAC+LNASS-1.GE.ASTK) GO TO 180 + IF (APOS2.LT.ASTK+LTOPST-1) GO TO 190 +C COMPRESS A. + 180 CALL MA27PD(A,IW,ASTK,ASTK2,AINPUT,1,NCMPBR,NCMPBI) + IF (POSFAC+LNASS-1.GE.ASTK) GO TO 780 + IF (APOS2.GE.ASTK+LTOPST-1) GO TO 780 + 190 IF (APOS2.LE.AZERO) GO TO 220 + APOS = AZERO + 1 + LAPOS2 = MIN(APOS2,ASTK-1) + IF (LAPOS2.LT.APOS) GO TO 210 + DO 200 K = APOS,LAPOS2 + A(K) = ZERO + 200 CONTINUE + 210 AZERO = APOS2 +C JUMP IF THERE ARE NO STACK ELEMENTS TO ASSEMBLE. + 220 IF (NUMSTK.EQ.0) GO TO 260 +C PLACE REALS CORRESPONDING TO STACK ELEMENTS IN CORRECT POSITIONS IN A. + DO 250 IELL = 1,NUMSTK + J1 = ISTK + 1 + J2 = ISTK + IW(ISTK) + DO 240 JJ = J1,J2 + IROW = IW(JJ) + IROW = IW2(IROW) + APOS = POSFAC + IDIAG(NFRONT,IROW) + DO 230 JJJ = JJ,J2 + J = IW(JJJ) + APOS2 = APOS + IW2(J) - IROW + A(APOS2) = A(APOS2) + A(ASTK) + A(ASTK) = ZERO + ASTK = ASTK + 1 + 230 CONTINUE + 240 CONTINUE +C INCREMENT STACK POINTER. + ISTK = J2 + 1 + 250 CONTINUE +C INCORPORATE REALS FROM ORIGINAL ROWS. + 260 DO 280 IORG = 1,NUMORG + J = -IW(IINPUT) +C WE CAN DO THIS BECAUSE THE DIAGONAL IS NOW THE FIRST ENTRY. + IROW = IW2(J) + APOS = POSFAC + IDIAG(NFRONT,IROW) +C THE FOLLOWING LOOP GOES FROM 1 TO NZ BECAUSE THERE MAY BE DUPLICATES. + DO 270 IDUMMY = 1,NZ + APOS2 = APOS + IW2(J) - IROW + A(APOS2) = A(APOS2) + A(AINPUT) + AINPUT = AINPUT + 1 + IINPUT = IINPUT + 1 + IF (IINPUT.GT.LIW) GO TO 280 + J = IW(IINPUT) + IF (J.LT.0) GO TO 280 + 270 CONTINUE + 280 CONTINUE +C RESET IW2 AND NUMASS. + NUMASS = NUMASS + NUMORG + J1 = IWPOS + 2 + J2 = IWPOS + NFRONT + 1 + DO 290 K = J1,J2 + J = IW(K) + IW2(J) = 0 + 290 CONTINUE +C PERFORM PIVOTING ON ASSEMBLED ELEMENT. +C NPIV IS THE NUMBER OF PIVOTS SO FAR SELECTED. +C LNPIV IS THE NUMBER OF PIVOTS SELECTED AFTER THE LAST PASS THROUGH +C THE THE FOLLOWING LOOP. + LNPIV = -1 + NPIV = 0 + DO 650 KDUMMY = 1,NASS + IF (NPIV.EQ.NASS) GO TO 660 + IF (NPIV.EQ.LNPIV) GO TO 660 + LNPIV = NPIV + NPIVP1 = NPIV + 1 +C JPIV IS USED AS A FLAG TO INDICATE WHEN 2 BY 2 PIVOTING HAS OCCURRED +C SO THAT IPIV IS INCREMENTED CORRECTLY. + JPIV = 1 +C NASS IS MAXIMUM POSSIBLE NUMBER OF PIVOTS. +C WE EITHER TAKE THE DIAGONAL ENTRY OR THE 2 BY 2 PIVOT WITH THE +C LARGEST OFF-DIAGONAL AT EACH STAGE. +C EACH PASS THROUGH THIS LOOP TRIES TO CHOOSE ONE PIVOT. + DO 640 IPIV = NPIVP1,NASS + JPIV = JPIV - 1 +C JUMP IF WE HAVE JUST PROCESSED A 2 BY 2 PIVOT. + IF (JPIV.EQ.1) GO TO 640 + APOS = POSFAC + IDIAG(NFRONT-NPIV,IPIV-NPIV) +C IF THE USER HAS INDICATED THAT THE MATRIX IS DEFINITE, WE +C DO NOT NEED TO TEST FOR STABILITY BUT WE DO CHECK TO SEE IF THE +C PIVOT IS NON-ZERO OR HAS CHANGED SIGN. +C IF IT IS ZERO, WE EXIT WITH AN ERROR. IF IT HAS CHANGED SIGN +C AND U WAS SET NEGATIVE, THEN WE AGAIN EXIT IMMEDIATELY. IF THE +C PIVOT CHANGES SIGN AND U WAS ZERO, WE CONTINUE WITH THE +C FACTORIZATION BUT PRINT A WARNING MESSAGE ON UNIT ICNTL(2). +C ISNPIV HOLDS A FLAG FOR THE SIGN OF THE PIVOTS TO DATE SO THAT +C A SIGN CHANGE WHEN DECOMPOSING AN ALLEGEDLY DEFINITE MATRIX CAN +C BE DETECTED. + IF (UU.GT.ZERO) GO TO 320 + IF (ABS(A(APOS)).LE.CNTL(3)) GO TO 790 +C JUMP IF THIS IS NOT THE FIRST PIVOT TO BE SELECTED. + IF (NTOTPV.GT.0) GO TO 300 +C SET ISNPIV. + IF (A(APOS).GT.ZERO) ISNPIV = 1 + IF (A(APOS).LT.ZERO) ISNPIV = -1 + 300 IF (A(APOS).GT.ZERO .AND. ISNPIV.EQ.1) GO TO 560 + IF (A(APOS).LT.ZERO .AND. ISNPIV.EQ.-1) GO TO 560 + IF (INFO(1).NE.2) INFO(2) = 0 + INFO(2) = INFO(2) + 1 + INFO(1) = 2 + I = NTOTPV + 1 + IF (ICNTL(2).GT.0 .AND. INFO(2).LE.10) THEN + WRITE (ICNTL(2),FMT=310) INFO(1),I + END IF + + 310 FORMAT (' *** WARNING MESSAGE FROM SUBROUTINE MA27BD', + + ' *** INFO(1) =',I2,/,' PIVOT',I6, + + ' HAS DIFFERENT SIGN FROM THE PREVIOUS ONE') + + ISNPIV = -ISNPIV + IF (UU.EQ.ZERO) GO TO 560 + GO TO 800 + + 320 AMAX = ZERO + TMAX = AMAX +C FIND LARGEST ENTRY TO RIGHT OF DIAGONAL IN ROW OF PROSPECTIVE PIVOT +C IN THE FULLY-SUMMED PART. ALSO RECORD COLUMN OF THIS LARGEST +C ENTRY. + J1 = APOS + 1 + J2 = APOS + NASS - IPIV + IF (J2.LT.J1) GO TO 340 + DO 330 JJ = J1,J2 + IF (ABS(A(JJ)).LE.AMAX) GO TO 330 + JMAX = IPIV + JJ - J1 + 1 + AMAX = ABS(A(JJ)) + 330 CONTINUE +C DO SAME AS ABOVE FOR NON-FULLY-SUMMED PART ONLY HERE WE DO NOT NEED +C TO RECORD COLUMN SO LOOP IS SIMPLER. + 340 J1 = J2 + 1 + J2 = APOS + NFRONT - IPIV + IF (J2.LT.J1) GO TO 360 + DO 350 JJ = J1,J2 + TMAX = MAX(ABS(A(JJ)),TMAX) + 350 CONTINUE +C NOW CALCULATE LARGEST ENTRY IN OTHER PART OF ROW. + 360 RMAX = MAX(TMAX,AMAX) + APOS1 = APOS + KK = NFRONT - IPIV + LT = IPIV - (NPIV+1) + IF (LT.EQ.0) GO TO 380 + DO 370 K = 1,LT + KK = KK + 1 + APOS1 = APOS1 - KK + RMAX = MAX(RMAX,ABS(A(APOS1))) + 370 CONTINUE +C JUMP IF STABILITY TEST SATISFIED. + 380 IF (ABS(A(APOS)).GT.MAX(CNTL(3),UU*RMAX)) GO TO 450 +C CHECK BLOCK PIVOT OF ORDER 2 FOR STABILITY. + IF (ABS(AMAX).LE.CNTL(3)) GO TO 640 + APOS2 = POSFAC + IDIAG(NFRONT-NPIV,JMAX-NPIV) + DETPIV = A(APOS)*A(APOS2) - AMAX*AMAX + THRESH = ABS(DETPIV) +C SET THRESH TO U TIMES THE RECIPROCAL OF THE MAX-NORM OF THE INVERSE +C OF THE PROSPECTIVE BLOCK. + THRESH = THRESH/ (UU*MAX(ABS(A(APOS))+AMAX, + + ABS(A(APOS2))+AMAX)) +C CHECK 2 BY 2 PIVOT FOR STABILITY. +C FIRST CHECK AGAINST ROW IPIV. + IF (THRESH.LE.RMAX) GO TO 640 +C FIND LARGEST ENTRY IN ROW JMAX. +C FIND MAXIMUM TO THE RIGHT OF THE DIAGONAL. + RMAX = ZERO + J1 = APOS2 + 1 + J2 = APOS2 + NFRONT - JMAX + IF (J2.LT.J1) GO TO 400 + DO 390 JJ = J1,J2 + RMAX = MAX(RMAX,ABS(A(JJ))) + 390 CONTINUE +C NOW CHECK TO THE LEFT OF THE DIAGONAL. +C WE USE TWO LOOPS TO AVOID TESTING FOR ROW IPIV INSIDE THE LOOP. + 400 KK = NFRONT - JMAX + 1 + APOS3 = APOS2 + JMXMIP = JMAX - IPIV - 1 + IF (JMXMIP.EQ.0) GO TO 420 + DO 410 K = 1,JMXMIP + APOS2 = APOS2 - KK + KK = KK + 1 + RMAX = MAX(RMAX,ABS(A(APOS2))) + 410 CONTINUE + 420 IPMNP = IPIV - NPIV - 1 + IF (IPMNP.EQ.0) GO TO 440 + APOS2 = APOS2 - KK + KK = KK + 1 + DO 430 K = 1,IPMNP + APOS2 = APOS2 - KK + KK = KK + 1 + RMAX = MAX(RMAX,ABS(A(APOS2))) + 430 CONTINUE + 440 IF (THRESH.LE.RMAX) GO TO 640 + PIVSIZ = 2 + GO TO 460 + + 450 PIVSIZ = 1 + 460 IROW = IPIV - NPIV +C +C PIVOT HAS BEEN CHOSEN. IF BLOCK PIVOT OF ORDER 2, PIVSIZ IS EQUAL TO +C TWO OTHERWISE PIVSIZ EQUALS ONE.. +C THE FOLLOWING LOOP MOVES THE PIVOT BLOCK TO THE TOP LEFT HAND CORNER +C OF THE FRONTAL MATRIX. + DO 550 KROW = 1,PIVSIZ +C WE JUMP IF SWOP IS NOT NECESSARY. + IF (IROW.EQ.1) GO TO 530 + J1 = POSFAC + IROW + J2 = POSFAC + NFRONT - (NPIV+1) + IF (J2.LT.J1) GO TO 480 + APOS2 = APOS + 1 +C SWOP PORTION OF ROWS WHOSE COLUMN INDICES ARE GREATER THAN LATER ROW. + DO 470 JJ = J1,J2 + SWOP = A(APOS2) + A(APOS2) = A(JJ) + A(JJ) = SWOP + APOS2 = APOS2 + 1 + 470 CONTINUE + 480 J1 = POSFAC + 1 + J2 = POSFAC + IROW - 2 + APOS2 = APOS + KK = NFRONT - (IROW+NPIV) + IF (J2.LT.J1) GO TO 500 +C SWOP PORTION OF ROWS/COLUMNS WHOSE INDICES LIE BETWEEN THE TWO ROWS. + DO 490 JJJ = J1,J2 + JJ = J2 - JJJ + J1 + KK = KK + 1 + APOS2 = APOS2 - KK + SWOP = A(APOS2) + A(APOS2) = A(JJ) + A(JJ) = SWOP + 490 CONTINUE + 500 IF (NPIV.EQ.0) GO TO 520 + APOS1 = POSFAC + KK = KK + 1 + APOS2 = APOS2 - KK +C SWOP PORTION OF COLUMNS WHOSE INDICES ARE LESS THAN EARLIER ROW. + DO 510 JJ = 1,NPIV + KK = KK + 1 + APOS1 = APOS1 - KK + APOS2 = APOS2 - KK + SWOP = A(APOS2) + A(APOS2) = A(APOS1) + A(APOS1) = SWOP + 510 CONTINUE +C SWOP DIAGONALS AND INTEGER INDEXING INFORMATION + 520 SWOP = A(APOS) + A(APOS) = A(POSFAC) + A(POSFAC) = SWOP + IPOS = IWPOS + NPIV + 2 + IEXCH = IWPOS + IROW + NPIV + 1 + ISWOP = IW(IPOS) + IW(IPOS) = IW(IEXCH) + IW(IEXCH) = ISWOP + 530 IF (PIVSIZ.EQ.1) GO TO 550 +C SET VARIABLES FOR THE SWOP OF SECOND ROW OF BLOCK PIVOT. + IF (KROW.EQ.2) GO TO 540 + IROW = JMAX - (NPIV+1) + JPOS = POSFAC + POSFAC = POSFAC + NFRONT - NPIV + NPIV = NPIV + 1 + APOS = APOS3 + GO TO 550 +C RESET VARIABLES PREVIOUSLY SET FOR SECOND PASS. + 540 NPIV = NPIV - 1 + POSFAC = JPOS + 550 CONTINUE +C + IF (PIVSIZ.EQ.2) GO TO 600 +C PERFORM THE ELIMINATION USING ENTRY (IPIV,IPIV) AS PIVOT. +C WE STORE U AND DINVERSE. + 560 A(POSFAC) = ONE/A(POSFAC) + IF (A(POSFAC).LT.ZERO) NEIG = NEIG + 1 + J1 = POSFAC + 1 + J2 = POSFAC + NFRONT - (NPIV+1) + IF (J2.LT.J1) GO TO 590 + IBEG = J2 + 1 + DO 580 JJ = J1,J2 + AMULT = -A(JJ)*A(POSFAC) + IEND = IBEG + NFRONT - (NPIV+JJ-J1+2) +C THE FOLLOWING SPECIAL COMMENT FORCES VECTORIZATION ON THE CRAY-1. +CDIR$ IVDEP + DO 570 IROW = IBEG,IEND + JCOL = JJ + IROW - IBEG + A(IROW) = A(IROW) + AMULT*A(JCOL) + 570 CONTINUE + IBEG = IEND + 1 + A(JJ) = AMULT + 580 CONTINUE + 590 NPIV = NPIV + 1 + NTOTPV = NTOTPV + 1 + JPIV = 1 + POSFAC = POSFAC + NFRONT - NPIV + 1 + GO TO 640 +C PERFORM ELIMINATION USING BLOCK PIVOT OF ORDER TWO. +C REPLACE BLOCK PIVOT BY ITS INVERSE. +C SET FLAG TO INDICATE USE OF 2 BY 2 PIVOT IN IW. + 600 IPOS = IWPOS + NPIV + 2 + NTWO = NTWO + 1 + IW(IPOS) = -IW(IPOS) + POSPV1 = POSFAC + POSPV2 = POSFAC + NFRONT - NPIV + SWOP = A(POSPV2) + IF (DETPIV.LT.ZERO) NEIG = NEIG + 1 + IF (DETPIV.GT.ZERO .AND. SWOP.LT.ZERO) NEIG = NEIG + 2 + A(POSPV2) = A(POSPV1)/DETPIV + A(POSPV1) = SWOP/DETPIV + A(POSPV1+1) = -A(POSPV1+1)/DETPIV + J1 = POSPV1 + 2 + J2 = POSPV1 + NFRONT - (NPIV+1) + IF (J2.LT.J1) GO TO 630 + JJ1 = POSPV2 + IBEG = POSPV2 + NFRONT - (NPIV+1) + DO 620 JJ = J1,J2 + JJ1 = JJ1 + 1 + AMULT1 = - (A(POSPV1)*A(JJ)+A(POSPV1+1)*A(JJ1)) + AMULT2 = - (A(POSPV1+1)*A(JJ)+A(POSPV2)*A(JJ1)) + IEND = IBEG + NFRONT - (NPIV+JJ-J1+3) +C THE FOLLOWING SPECIAL COMMENT FORCES VECTORIZATION ON THE CRAY-1. +CDIR$ IVDEP + DO 610 IROW = IBEG,IEND + K1 = JJ + IROW - IBEG + K2 = JJ1 + IROW - IBEG + A(IROW) = A(IROW) + AMULT1*A(K1) + AMULT2*A(K2) + 610 CONTINUE + IBEG = IEND + 1 + A(JJ) = AMULT1 + A(JJ1) = AMULT2 + 620 CONTINUE + 630 NPIV = NPIV + 2 + NTOTPV = NTOTPV + 2 + JPIV = 2 + POSFAC = POSPV2 + NFRONT - NPIV + 1 + 640 CONTINUE + 650 CONTINUE +C END OF MAIN ELIMINATION LOOP. +C + 660 IF (NPIV.NE.0) NBLK = NBLK + 1 + IOLDPS = IWPOS + IWPOS = IWPOS + NFRONT + 2 + IF (NPIV.EQ.0) GO TO 690 + IF (NPIV.GT.1) GO TO 680 + IW(IOLDPS) = -IW(IOLDPS) + DO 670 K = 1,NFRONT + J1 = IOLDPS + K + IW(J1) = IW(J1+1) + 670 CONTINUE + IWPOS = IWPOS - 1 + GO TO 690 + + 680 IW(IOLDPS+1) = NPIV +C COPY REMAINDER OF ELEMENT TO TOP OF STACK + 690 LIELL = NFRONT - NPIV + IF (LIELL.EQ.0 .OR. IASS.EQ.NSTEPS) GO TO 750 + IF (IWPOS+LIELL.LT.ISTK) GO TO 700 + CALL MA27PD(A,IW,ISTK,ISTK2,IINPUT,2,NCMPBR,NCMPBI) + 700 ISTK = ISTK - LIELL - 1 + IW(ISTK) = LIELL + J1 = ISTK + KK = IWPOS - LIELL - 1 +C THE FOLLOWING SPECIAL COMMENT FORCES VECTORIZATION ON THE CRAY-1. +CDIR$ IVDEP + DO 710 K = 1,LIELL + J1 = J1 + 1 + KK = KK + 1 + IW(J1) = IW(KK) + 710 CONTINUE +C WE COPY IN REVERSE DIRECTION TO AVOID OVERWRITE PROBLEMS. + LAELL = ((LIELL+1)*LIELL)/2 + KK = POSFAC + LAELL + IF (KK.NE.ASTK) GO TO 720 + ASTK = ASTK - LAELL + GO TO 740 +C THE MOVE AND ZEROING OF ARRAY A IS PERFORMED WITH TWO LOOPS SO +C THAT THE CRAY-1 WILL VECTORIZE THEM SAFELY. + 720 KMAX = KK - 1 +C THE FOLLOWING SPECIAL COMMENT FORCES VECTORIZATION ON THE CRAY-1. +CDIR$ IVDEP + DO 730 K = 1,LAELL + KK = KK - 1 + ASTK = ASTK - 1 + A(ASTK) = A(KK) + 730 CONTINUE + KMAX = MIN(KMAX,ASTK-1) + DO 735 K = KK,KMAX + A(K) = ZERO + 735 CONTINUE + 740 AZERO = MIN(AZERO,ASTK-1) + 750 IF (NPIV.EQ.0) IWPOS = IOLDPS + 760 CONTINUE +C +C END OF LOOP ON TREE NODES. +C + IW(1) = NBLK + IF (NTWO.GT.0) IW(1) = -NBLK + NRLBDU = POSFAC - 1 + NIRBDU = IWPOS - 1 + IF (NTOTPV.EQ.N) GO TO 810 + INFO(1) = 3 + INFO(2) = NTOTPV + GO TO 810 +C **** ERROR RETURNS **** + 770 INFO(1) = -3 + GO TO 810 + + 780 INFO(1) = -4 + INFO(2) = LA + MAX(POSFAC+LNASS,APOS2-LTOPST+2) - ASTK + GO TO 810 + + 790 INFO(1) = -5 + INFO(2) = NTOTPV + 1 + GO TO 810 + + 800 INFO(1) = -6 + INFO(2) = NTOTPV + 1 + 810 CONTINUE + INFO(9) = NRLBDU + INFO(10) = NIRBDU + INFO(12) = NCMPBR + INFO(13) = NCMPBI + INFO(14) = NTWO + INFO(15) = NEIG + + RETURN + END + SUBROUTINE MA27PD(A,IW,J1,J2,ITOP,IREAL,NCMPBR,NCMPBI) +C THIS SUBROUTINE PERFORMS A VERY SIMPLE COMPRESS (BLOCK MOVE). +C ENTRIES J1 TO J2 (INCL.) IN A OR IW AS APPROPRIATE ARE MOVED TO +C OCCUPY THE POSITIONS IMMEDIATELY PRIOR TO POSITION ITOP. +C A/IW HOLD THE ARRAY BEING COMPRESSED. +C J1/J2 DEFINE THE ENTRIES BEING MOVED. +C ITOP DEFINES THE POSITION IMMEDIATELY AFTER THE POSITIONS TO WHICH +C J1 TO J2 ARE MOVED. +C IREAL MUST BE SET BY THE USER TO 2 IF THE MOVE IS ON ARRAY IW, +C ANY OTHER VALUE WILL PERFORM THE MOVE ON A. +C NCMPBR and NCMPBI, see INFO(12) and INFO(13) in MA27A/AD (ACCUMULATE +C THE NUMBER OF COMPRESSES OF THE REALS AND INTEGERS PERFORMED BY +C MA27B/BD. +C +C .. Scalar Arguments .. + INTEGER IREAL,ITOP,J1,J2,NCMPBR,NCMPBI +C .. +C .. Array Arguments .. + DOUBLE PRECISION A(*) + INTEGER IW(*) +C .. +C .. Local Scalars .. + INTEGER IPOS,JJ,JJJ +C .. +C .. Executable Statements .. + IPOS = ITOP - 1 + IF (J2.EQ.IPOS) GO TO 50 + IF (IREAL.EQ.2) GO TO 20 + NCMPBR = NCMPBR + 1 + IF (J1.GT.J2) GO TO 40 + DO 10 JJJ = J1,J2 + JJ = J2 - JJJ + J1 + A(IPOS) = A(JJ) + IPOS = IPOS - 1 + 10 CONTINUE + GO TO 40 + + 20 NCMPBI = NCMPBI + 1 + IF (J1.GT.J2) GO TO 40 + DO 30 JJJ = J1,J2 + JJ = J2 - JJJ + J1 + IW(IPOS) = IW(JJ) + IPOS = IPOS - 1 + 30 CONTINUE + 40 J2 = ITOP - 1 + J1 = IPOS + 1 + 50 RETURN + + END + SUBROUTINE MA27QD(N,A,LA,IW,LIW,W,MAXFNT,RHS,IW2,NBLK,LATOP,ICNTL) +C THIS SUBROUTINE PERFORMS FORWARD ELIMINATION +C USING THE FACTOR U TRANSPOSE STORED IN A/IA AFTER MA27B/BD. +C +C N - MUST BE SET TO THE ORDER OF THE MATRIX. NOT ALTERED +C BY MA27Q/QD. +C A - MUST BE SET TO HOLD THE REAL VALUES +C CORRESPONDING TO THE FACTORS OF DINVERSE AND U. THIS MUST BE +C UNCHANGED SINCE THE PRECEDING CALL TO MA27B/BD. NOT ALTERED +C BY MA27Q/QD. +C LA - LENGTH OF ARRAY A. NOT ALTERED BY MA27Q/QD. +C IW - HOLDS THE INTEGER INDEXING +C INFORMATION FOR THE MATRIX FACTORS IN A. THIS MUST BE +C UNCHANGED SINCE THE PRECEDING CALL TO MA27B/BD. NOT ALTERED +C BY MA27Q/QD. +C LIW - LENGTH OF ARRAY IW. NOT ALTERED BY MA27Q/QD. +C W - USED +C AS WORKSPACE BY MA27Q/QD TO HOLD THE COMPONENTS OF THE RIGHT +C HAND SIDES CORRESPONDING TO CURRENT BLOCK PIVOTAL ROWS. +C MAXFNT - MUST BE SET TO THE LARGEST NUMBER OF +C VARIABLES IN ANY BLOCK PIVOT ROW. THIS VALUE WILL HAVE +C BEEN OUTPUT BY MA27B/BD. NOT ALTERED BY MA27Q/QD. +C RHS - ON INPUT, +C MUST BE SET TO HOLD THE RIGHT HAND SIDES FOR THE EQUATIONS +C WHICH THE USER DESIRES TO SOLVE. ON OUTPUT, RHS WILL HOLD +C THE MODIFIED VECTORS CORRESPONDING TO PERFORMING FORWARD +C ELIMINATION ON THE RIGHT HAND SIDES. +C IW2 - NEED NOT BE SET ON ENTRY. ON EXIT IW2(I) (I = 1,NBLK) +C WILL HOLD POINTERS TO THE +C BEGINNING OF EACH BLOCK PIVOT IN ARRAY IW. +C NBLK - NUMBER OF BLOCK PIVOT ROWS. NOT ALTERED BY MA27Q/QD. +C LATOP - NEED NOT BE SET ON ENTRY. ON EXIT, IT IS THE POSITION IN +C A OF THE LAST ENTRY IN THE FACTORS. IT MUST BE PASSED +C UNCHANGED TO MA27R/RD. +C ICNTL is an INTEGER array of length 30, see MA27A/AD. +C ICNTL(IFRLVL+I) I=1,20 IS USED TO CONTROL WHETHER DIRECT OR INDIRECT +C ACCESS IS USED BY MA27C/CD. INDIRECT ACCESS IS EMPLOYED +C IN FORWARD AND BACK SUBSTITUTION RESPECTIVELY IF THE SIZE OF +C A BLOCK IS LESS THAN ICNTL(IFRLVL+MIN(10,NPIV)) AND +C ICNTL(IFRLVL+10+MIN(10,NPIV)) RESPECTIVELY, WHERE NPIV IS THE +C NUMBER OF PIVOTS IN THE BLOCK. +C + INTEGER IFRLVL + PARAMETER ( IFRLVL=5 ) +C .. Scalar Arguments .. + INTEGER LA,LATOP,LIW,MAXFNT,N,NBLK +C .. +C .. Array Arguments .. + DOUBLE PRECISION A(LA),RHS(N),W(MAXFNT) + INTEGER IW(LIW),IW2(NBLK),ICNTL(30) +C .. +C .. Local Scalars .. + DOUBLE PRECISION W1,W2 + INTEGER APOS,IBLK,IFR,ILVL,IPIV,IPOS,IRHS,IROW,IST,J,J1,J2,J3,JJ, + + JPIV,K,K1,K2,K3,LIELL,NPIV +C .. +C .. Intrinsic Functions .. + INTRINSIC ABS,MIN +C .. +C .. Executable Statements .. +C APOS. RUNNING POINTER TO CURRENT PIVOT POSITION IN ARRAY A. +C IPOS. RUNNING POINTER TO BEGINNING OF BLOCK PIVOT ROW IN IW. + APOS = 1 + IPOS = 1 + J2 = 0 + IBLK = 0 + NPIV = 0 + DO 140 IROW = 1,N + IF (NPIV.GT.0) GO TO 90 + IBLK = IBLK + 1 + IF (IBLK.GT.NBLK) GO TO 150 + IPOS = J2 + 1 +C SET UP POINTER IN PREPARATION FOR BACK SUBSTITUTION. + IW2(IBLK) = IPOS +C ABS(LIELL) IS NUMBER OF VARIABLES (COLUMNS) IN BLOCK PIVOT ROW. + LIELL = -IW(IPOS) +C NPIV IS NUMBER OF PIVOTS (ROWS) IN BLOCK PIVOT. + NPIV = 1 + IF (LIELL.GT.0) GO TO 10 + LIELL = -LIELL + IPOS = IPOS + 1 + NPIV = IW(IPOS) + 10 J1 = IPOS + 1 + J2 = IPOS + LIELL + ILVL = MIN(NPIV,10) + IF (LIELL.LT.ICNTL(IFRLVL+ILVL)) GO TO 90 +C +C PERFORM OPERATIONS USING DIRECT ADDRESSING. +C +C LOAD APPROPRIATE COMPONENTS OF RIGHT HAND SIDES INTO ARRAY W. + IFR = 0 + DO 20 JJ = J1,J2 + J = ABS(IW(JJ)+0) + IFR = IFR + 1 + W(IFR) = RHS(J) + 20 CONTINUE +C JPIV IS USED AS A FLAG SO THAT IPIV IS INCREMENTED CORRECTLY AFTER +C THE USE OF A 2 BY 2 PIVOT. + JPIV = 1 + J3 = J1 +C PERFORM OPERATIONS. + DO 70 IPIV = 1,NPIV + JPIV = JPIV - 1 + IF (JPIV.EQ.1) GO TO 70 +C JUMP IF WE HAVE A 2 BY 2 PIVOT. + IF (IW(J3).LT.0) GO TO 40 +C PERFORM FORWARD SUBSTITUTION USING 1 BY 1 PIVOT. + JPIV = 1 + J3 = J3 + 1 + APOS = APOS + 1 + IST = IPIV + 1 + IF (LIELL.LT.IST) GO TO 70 + W1 = W(IPIV) + K = APOS + DO 30 J = IST,LIELL + W(J) = W(J) + A(K)*W1 + K = K + 1 + 30 CONTINUE + APOS = APOS + LIELL - IST + 1 + GO TO 70 +C PERFORM OPERATIONS WITH 2 BY 2 PIVOT. + 40 JPIV = 2 + J3 = J3 + 2 + APOS = APOS + 2 + IST = IPIV + 2 + IF (LIELL.LT.IST) GO TO 60 + W1 = W(IPIV) + W2 = W(IPIV+1) + K1 = APOS + K2 = APOS + LIELL - IPIV + DO 50 J = IST,LIELL + W(J) = W(J) + W1*A(K1) + W2*A(K2) + K1 = K1 + 1 + K2 = K2 + 1 + 50 CONTINUE + 60 APOS = APOS + 2* (LIELL-IST+1) + 1 + 70 CONTINUE +C RELOAD W BACK INTO RHS. + IFR = 0 + DO 80 JJ = J1,J2 + J = ABS(IW(JJ)+0) + IFR = IFR + 1 + RHS(J) = W(IFR) + 80 CONTINUE + NPIV = 0 + GO TO 140 +C +C PERFORM OPERATIONS USING INDIRECT ADDRESSING. +C +C JUMP IF WE HAVE A 2 BY 2 PIVOT. + 90 IF (IW(J1).LT.0) GO TO 110 +C PERFORM FORWARD SUBSTITUTION USING 1 BY 1 PIVOT. + NPIV = NPIV - 1 + APOS = APOS + 1 + J1 = J1 + 1 + IF (J1.GT.J2) GO TO 140 + IRHS = IW(J1-1) + W1 = RHS(IRHS) + K = APOS + DO 100 J = J1,J2 + IRHS = ABS(IW(J)+0) + RHS(IRHS) = RHS(IRHS) + A(K)*W1 + K = K + 1 + 100 CONTINUE + APOS = APOS + J2 - J1 + 1 + GO TO 140 +C PERFORM OPERATIONS WITH 2 BY 2 PIVOT + 110 NPIV = NPIV - 2 + J1 = J1 + 2 + APOS = APOS + 2 + IF (J1.GT.J2) GO TO 130 + IRHS = -IW(J1-2) + W1 = RHS(IRHS) + IRHS = IW(J1-1) + W2 = RHS(IRHS) + K1 = APOS + K3 = APOS + J2 - J1 + 2 + DO 120 J = J1,J2 + IRHS = ABS(IW(J)+0) + RHS(IRHS) = RHS(IRHS) + W1*A(K1) + W2*A(K3) + K1 = K1 + 1 + K3 = K3 + 1 + 120 CONTINUE + 130 APOS = APOS + 2* (J2-J1+1) + 1 + 140 CONTINUE + 150 LATOP = APOS - 1 + RETURN + + END + SUBROUTINE MA27RD(N,A,LA,IW,LIW,W,MAXFNT,RHS,IW2,NBLK,LATOP,ICNTL) +C THIS SUBROUTINE PERFORMS BACKWARD ELIMINATION OPERATIONS +C USING THE FACTORS DINVERSE AND U +C STORED IN A/IW AFTER MA27B/BD. +C +C N - MUST BE SET TO THE ORDER OF THE MATRIX. NOT ALTERED +C BY MA27R/RD. +C A - MUST BE SET TO HOLD THE REAL VALUES CORRESPONDING +C TO THE FACTORS OF DINVERSE AND U. THIS MUST BE +C UNCHANGED SINCE THE PRECEDING CALL TO MA27B/BD. NOT ALTERED +C BY MA27R/RD. +C LA - LENGTH OF ARRAY A. NOT ALTERED BY MA27R/RD. +C IW - HOLDS THE INTEGER INDEXING +C INFORMATION FOR THE MATRIX FACTORS IN A. THIS MUST BE +C UNCHANGED SINCE THE PRECEDING CALL TO MA27B/BD. NOT ALTERED +C BY MA27R/RD. +C LIW - LENGTH OF ARRAY IW. NOT ALTERED BY MA27R/RD. +C W - USED +C AS WORKSPACE BY MA27R/RD TO HOLD THE COMPONENTS OF THE RIGHT +C HAND SIDES CORRESPONDING TO CURRENT BLOCK PIVOTAL ROWS. +C MAXFNT - INTEGER VARIABLE. MUST BE SET TO THE LARGEST NUMBER OF +C VARIABLES IN ANY BLOCK PIVOT ROW. THIS VALUE WAS GIVEN +C ON OUTPUT FROM MA27B/BD. NOT ALTERED BY MA27R/RD. +C RHS - ON INPUT, +C MUST BE SET TO HOLD THE RIGHT HAND SIDE MODIFIED BY THE +C FORWARD SUBSTITUTION OPERATIONS. ON OUTPUT, RHS WILL HOLD +C THE SOLUTION VECTOR. +C IW2 - ON ENTRY IW2(I) (I = 1,NBLK) +C MUST HOLD POINTERS TO THE +C BEGINNING OF EACH BLOCK PIVOT IN ARRAY IW, AS SET BY +C MA27Q/QD. +C NBLK - NUMBER OF BLOCK PIVOT ROWS. NOT ALTERED BY MA27R/RD. +C LATOP - IT IS THE POSITION IN +C A OF THE LAST ENTRY IN THE FACTORS. IT MUST BE UNCHANGED +C SINCE THE CALL TO MA27Q/QD. IT IS NOT ALTERED BY MA27R/RD. +C ICNTL is an INTEGER array of length 30, see MA27A/AD. +C ICNTL(IFRLVL+I) I=1,20 IS USED TO CONTROL WHETHER DIRECT OR INDIRECT +C ACCESS IS USED BY MA27C/CD. INDIRECT ACCESS IS EMPLOYED +C IN FORWARD AND BACK SUBSTITUTION RESPECTIVELY IF THE SIZE OF +C A BLOCK IS LESS THAN ICNTL(IFRLVL+MIN(10,NPIV)) AND +C ICNTL(IFRLVL+10+MIN(10,NPIV)) RESPECTIVELY, WHERE NPIV IS THE +C NUMBER OF PIVOTS IN THE BLOCK. +C + INTEGER IFRLVL + PARAMETER ( IFRLVL=5 ) +C +C .. Scalar Arguments .. + INTEGER LA,LATOP,LIW,MAXFNT,N,NBLK +C .. +C .. Array Arguments .. + DOUBLE PRECISION A(LA),RHS(N),W(MAXFNT) + INTEGER IW(LIW),IW2(NBLK),ICNTL(30) +C .. +C .. Local Scalars .. + DOUBLE PRECISION W1,W2 + INTEGER APOS,APOS2,I1RHS,I2RHS,IBLK,IFR,IIPIV,IIRHS,ILVL,IPIV, + + IPOS,IRHS,IST,J,J1,J2,JJ,JJ1,JJ2,JPIV,JPOS,K,LIELL,LOOP, + + NPIV +C .. +C .. Intrinsic Functions .. + INTRINSIC ABS,MIN +C .. +C .. Executable Statements .. +C APOS. RUNNING POINTER TO CURRENT PIVOT POSITION IN ARRAY A. +C IPOS. RUNNING POINTER TO BEGINNING OF CURRENT BLOCK PIVOT ROW. + APOS = LATOP + 1 + NPIV = 0 + IBLK = NBLK + 1 +C RUN THROUGH BLOCK PIVOT ROWS IN THE REVERSE ORDER. + DO 180 LOOP = 1,N + IF (NPIV.GT.0) GO TO 110 + IBLK = IBLK - 1 + IF (IBLK.LT.1) GO TO 190 + IPOS = IW2(IBLK) +C ABS(LIELL) IS NUMBER OF VARIABLES (COLUMNS) IN BLOCK PIVOT ROW. + LIELL = -IW(IPOS) +C NPIV IS NUMBER OF PIVOTS (ROWS) IN BLOCK PIVOT. + NPIV = 1 + IF (LIELL.GT.0) GO TO 10 + LIELL = -LIELL + IPOS = IPOS + 1 + NPIV = IW(IPOS) + 10 JPOS = IPOS + NPIV + J2 = IPOS + LIELL + ILVL = MIN(10,NPIV) + 10 + IF (LIELL.LT.ICNTL(IFRLVL+ILVL)) GO TO 110 +C +C PERFORM OPERATIONS USING DIRECT ADDRESSING. +C + J1 = IPOS + 1 +C LOAD APPROPRIATE COMPONENTS OF RHS INTO W. + IFR = 0 + DO 20 JJ = J1,J2 + J = ABS(IW(JJ)+0) + IFR = IFR + 1 + W(IFR) = RHS(J) + 20 CONTINUE +C JPIV IS USED AS A FLAG SO THAT IPIV IS INCREMENTED CORRECTLY AFTER +C THE USE OF A 2 BY 2 PIVOT. + JPIV = 1 +C PERFORM ELIMINATIONS. + DO 90 IIPIV = 1,NPIV + JPIV = JPIV - 1 + IF (JPIV.EQ.1) GO TO 90 + IPIV = NPIV - IIPIV + 1 + IF (IPIV.EQ.1) GO TO 30 +C JUMP IF WE HAVE A 2 BY 2 PIVOT. + IF (IW(JPOS-1).LT.0) GO TO 60 +C PERFORM BACK-SUBSTITUTION USING 1 BY 1 PIVOT. + 30 JPIV = 1 + APOS = APOS - (LIELL+1-IPIV) + IST = IPIV + 1 + W1 = W(IPIV)*A(APOS) + IF (LIELL.LT.IST) GO TO 50 + JJ1 = APOS + 1 + DO 40 J = IST,LIELL + W1 = W1 + A(JJ1)*W(J) + JJ1 = JJ1 + 1 + 40 CONTINUE + 50 W(IPIV) = W1 + JPOS = JPOS - 1 + GO TO 90 +C PERFORM BACK-SUBSTITUTION OPERATIONS WITH 2 BY 2 PIVOT + 60 JPIV = 2 + APOS2 = APOS - (LIELL+1-IPIV) + APOS = APOS2 - (LIELL+2-IPIV) + IST = IPIV + 1 + W1 = W(IPIV-1)*A(APOS) + W(IPIV)*A(APOS+1) + W2 = W(IPIV-1)*A(APOS+1) + W(IPIV)*A(APOS2) + IF (LIELL.LT.IST) GO TO 80 + JJ1 = APOS + 2 + JJ2 = APOS2 + 1 + DO 70 J = IST,LIELL + W1 = W1 + W(J)*A(JJ1) + W2 = W2 + W(J)*A(JJ2) + JJ1 = JJ1 + 1 + JJ2 = JJ2 + 1 + 70 CONTINUE + 80 W(IPIV-1) = W1 + W(IPIV) = W2 + JPOS = JPOS - 2 + 90 CONTINUE +C RELOAD WORKING VECTOR INTO SOLUTION VECTOR. + IFR = 0 + DO 100 JJ = J1,J2 + J = ABS(IW(JJ)+0) + IFR = IFR + 1 + RHS(J) = W(IFR) + 100 CONTINUE + NPIV = 0 + GO TO 180 +C +C PERFORM OPERATIONS USING INDIRECT ADDRESSING. +C + 110 IF (NPIV.EQ.1) GO TO 120 +C JUMP IF WE HAVE A 2 BY 2 PIVOT. + IF (IW(JPOS-1).LT.0) GO TO 150 +C PERFORM BACK-SUBSTITUTION USING 1 BY 1 PIVOT. + 120 NPIV = NPIV - 1 + APOS = APOS - (J2-JPOS+1) + IIRHS = IW(JPOS) + W1 = RHS(IIRHS)*A(APOS) + J1 = JPOS + 1 + IF (J1.GT.J2) GO TO 140 + K = APOS + 1 + DO 130 J = J1,J2 + IRHS = ABS(IW(J)+0) + W1 = W1 + A(K)*RHS(IRHS) + K = K + 1 + 130 CONTINUE + 140 RHS(IIRHS) = W1 + JPOS = JPOS - 1 + GO TO 180 +C PERFORM OPERATIONS WITH 2 BY 2 PIVOT + 150 NPIV = NPIV - 2 + APOS2 = APOS - (J2-JPOS+1) + APOS = APOS2 - (J2-JPOS+2) + I1RHS = -IW(JPOS-1) + I2RHS = IW(JPOS) + W1 = RHS(I1RHS)*A(APOS) + RHS(I2RHS)*A(APOS+1) + W2 = RHS(I1RHS)*A(APOS+1) + RHS(I2RHS)*A(APOS2) + J1 = JPOS + 1 + IF (J1.GT.J2) GO TO 170 + JJ1 = APOS + 2 + JJ2 = APOS2 + 1 + DO 160 J = J1,J2 + IRHS = ABS(IW(J)+0) + W1 = W1 + RHS(IRHS)*A(JJ1) + W2 = W2 + RHS(IRHS)*A(JJ2) + JJ1 = JJ1 + 1 + JJ2 = JJ2 + 1 + 160 CONTINUE + 170 RHS(I1RHS) = W1 + RHS(I2RHS) = W2 + JPOS = JPOS - 2 + 180 CONTINUE + 190 RETURN + + END diff --git a/coinhsl/ma27/ma27d.lo b/coinhsl/ma27/ma27d.lo new file mode 100644 index 0000000..b079c4a --- /dev/null +++ b/coinhsl/ma27/ma27d.lo @@ -0,0 +1,12 @@ +# coinhsl/ma27/ma27d.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4.6 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/ma27d.o' + +# Name of the non-PIC object +non_pic_object=none + diff --git a/coinhsl/ma28/.deps/.dirstamp b/coinhsl/ma28/.deps/.dirstamp new file mode 100644 index 0000000..e69de29 diff --git a/coinhsl/ma28/.dirstamp b/coinhsl/ma28/.dirstamp new file mode 100644 index 0000000..e69de29 diff --git a/coinhsl/ma28/.libs/ma28d.o b/coinhsl/ma28/.libs/ma28d.o new file mode 100644 index 0000000000000000000000000000000000000000..cc774109e9ee2a435f9872cd568a1f0218458cb7 GIT binary patch literal 18584 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 z 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 Errors and warnings and all information +C on input and output parameters printed. +C +C ICNTL(6) has default value 5 and must be set by the user to 1 +C if the pivot order in KEEP is to be used by MA57AD. For any +C other value of ICNTL(6), a suitable pivot order will be chosen +C automatically. The choices available so far are: +C ICNTL(6) = 0 AMD using MC47 (with dense row detection disabled) +C ICNTL(6) = 2 AMD using MC47 (this was previously the MC50 option) +C ICNTL(6) = 3 MA27 minimum degree ordering +C ICNTL(6) = 4 METIS_NODEND ordering from MeTiS package. +C ICNTL(6) = 5 Ordering chosen depending on matrix characteristics. +C At the moment choices are MC47 or METIS. +C INFO(36) is set to ordering used. +C ICNTL(6) > 5 At the moment this is treated as 5 (the default). +C +C ICNTL(7) is used by MA57BD to control numerical pivoting. It +C has default value 1. Values out of range cause an error return +C with INFO(1) equal to -10. +C Possible values are: +C +C 1 Numerical pivoting is performed using the threshold value in +C CNTL(1). +C +C 2 No pivoting will be performed and an error exit will occur +C immediately a sign change or a zero is detected among the pivots. +C This is suitable for cases when A is thought to be definite +C and is likely to decrease the factorization time while still +C providing a stable decomposition. +C +C 3 No pivoting will be performed and an error exit will occur if a +C zero pivot is detected. This is likely to decrease the +C factorization time, but may be unstable if there is a sign +C change among the pivots. +C +C 4 No pivoting will be performed but the matrix will be altered +C so that all pivots are of the same sign. +C +C ICNTL(8) has default value 0. If MA57BD is called with ICNTL(8) NE 0, +C then the factorization will discard factors and try +C to continue the factorization to determine the amount of space +C needed for a successful factorization. In this case, a +C factorization will not have been produced. If the default value +C of 0 is used and the factorization stops because of lack of +C space, the user should reallocate the real or integer space for +C FACT or IFACT, respectively and reset LFACT or LIFACT +C appropriately, using MA57ED before recalling MA57BD. +C +C ICNTL(9) has default value 10. It corresponds to the maximum number +C of steps of iterative refinement. +C +C ICNTL(10) has default value 0. A positive value will return the +c infinity norm of the input matrix, the computed solution, and +C the scaled residual in RINFO(5) to RINFO(7), respectively, +C a backward error estimate in RINFO(8) and RINFO(9), and an +C estimate of the forward error in RINFO(10). If ICNTL(10) is +C negative or zero no estimates are returned. +C +C ICNTL(11) The block size to be used by the Level 3 BLAS. +C +C ICNTL(12) Two nodes of the assembly tree are merged only if both +C involve less than ICNTL(12) eliminations. +C +C ICNTL(13) Threshold on number of rows in a block for using BLAS2 in +C MA57CD. +C +C ICNTL(14) Threshold on number of entries in a row for declaring row +C full on a call to MA57H/HD. Set as percentage of N. +C So 100 means row must be full. +C +C ICNTL(15) should be set to 1 (the default) if MC64 scaling is +C requested. +C +C ICNTL(16) should be set to 1 if "small" entries are to be removed +C removed from the frontal matrices. The default is 0. +C +C ICNTL(17) to ICNTL(20) are set to zero by MA57ID but are not +C currently used by MA57. +C +C Local variables + INTEGER I + DOUBLE PRECISION ZERO + PARAMETER (ZERO=0.0D0) +C=============================================== +C Default values for variables in control arrays +C=============================================== +C Threshold value for pivoting + CNTL(1) = 0.01D0 +C Test for zero pivot + CNTL(2) = 1.0D-20 +C Iterative refinement convergence + CNTL(3) = 0.5D0 +C Static pivoting control + CNTL(4) = ZERO +C Control to allow some delayed pivots + CNTL(5) = ZERO +C Printing control + ICNTL(1) = 6 + ICNTL(2) = 6 + ICNTL(3) = 6 + ICNTL(4) = -1 + ICNTL(5) = 2 +C Provide pivot order (1=NO) +C Set to make automatic choice between METIS and MC47 + ICNTL(6) = 5 +C Pivoting control + ICNTL(7) = 1 +C Restart facility + ICNTL(8) = 0 +C IR steps + ICNTL(9) = 10 +C Error estimates + ICNTL(10) = 0 +C Blocking for Level 3 BLAS + ICNTL(11) = 16 +C Node amalgamation parameter (NEMIN) + ICNTL(12) = 16 +C Switch for use of Level 2 BLAS in solve + ICNTL(13) = 10 +C Flag to indicate threshold will be set to N + ICNTL(14) = 100 +C Flag to invoke MC64 scaling (0 off, 1 on) + ICNTL(15) = 1 +C Flag to invoke dropping small entries from front +C Default is not to drop (set to 1 to drop) + ICNTL(16) = 0 + +C Set unused parameters + DO 110 I=17,20 + ICNTL(I) = 0 + 110 CONTINUE + + RETURN + END + + + SUBROUTINE MA57AD(N,NE,IRN,JCN,LKEEP,KEEP,IWORK,ICNTL,INFO,RINFO) +C This subroutine is a user-callable driver for the analysis phase of +C MA57. It performs an ordering, a symbolic factorization and +C computes information for the numerical factorization by MA57B/BD. + INTEGER N,NE,IRN(NE),JCN(NE),IWORK(5*N),LKEEP,KEEP(LKEEP), + * ICNTL(20),INFO(40) + DOUBLE PRECISION RINFO(20) +C +C N is an INTEGER variable which must be set by the user to the +C order n of the matrix A. It is not altered by the subroutine. +C Restriction: N > 0. +C +C NE is an INTEGER variable which must be set by the user to the +C number of entries being input. It is not altered by the +C subroutine. Restriction: NE >= 0. +C +C IRN and JCN are INTEGER arrays of length NE. The user +C must set them so that each off-diagonal nonzero $a_{ij}$ is +C represented by IRN(k)=i and JCN(k)=j or by IRN(k)=j +C and JCN(k)=i. Multiple entries are allowed and any with +C IRN(k) or JCN(k) out of range are ignored. These arrays will +C be unaltered by the subroutine. +C +C IWORK is an INTEGER array of length 5*N. This need not be set +C by the user and is used as workspace by MA57AD. +C +C LKEEP is an INTEGER that must be set to length of array KEEP. +C Restriction: LKEEP >= 5*N+NE+MAX(N,NE)+42 +C +C KEEP is an INTEGER array of length LKEEP. It need not be set +C by the user and must be preserved between a call to MA57AD +C and subsequent calls to MA57BD and MA57CD. +C If the user wishes to input +C the pivot sequence, the position of variable {i} in the pivot +C order should be placed in KEEP(i), i = 1, 2,..., n and ICNTL(6) +C should be set to 1. The subroutine may replace the given order +C by another that gives the same fill-in pattern and +C virtually identical numerical results. +C +C ICNTL is an INTEGER array of length 10 +C that contains control parameters and must be set by the user. +C Default values for the components may be set by a call to +C MA57I/ID. Details of the control parameters are given in MA57I/ID. +C +C INFO is an INTEGER array of length 40 that need not be set by the +C user. On return from MA57AD, a value of zero for INFO(1) +C indicates that the subroutine has performed successfully. + +C RINFO is a REAL (DOUBLE_PRECISION in the D version) array of length 20 +C that need not be set by the +C user. This array supplies information on the execution of MA57AD. +C +C**** Still to be updated +C INFO(1): +C 0 Successful entry. +C -1 N < 1 +C -2 NE < 0. +C -9 Invalid permutation supplied in KEEP. +C -15 LKEEP < 5*N+NE+MAX(N,NE)+42 +C +1 One or more indices out of range. +C +2 One or more duplicate entries found. +C +3. Combination of warnings +1 and +2. +C INFO(2): +C if INFO(1) = -1, the value input for N. +C if INFO(1) = -2, the value input for NE. +C if INFO(1) = -9, index at which error first detected. +C if INFO(1) = -15, the value input for LKEEP. +C INFO(3) Number of entries with out-of-range indices. +C INFO(4) Number of off-diagonal duplicate entries. +C INFO(5) Forecast number of reals to hold the factorization. +C INFO(6) Forecast number of integers to hold the factorization. +C INFO(7) Forecast maximum front size. +C INFO(8) Number of nodes in the assembly tree. +C INFO(9) Minimum size for LA of MA57BD (without compress). +C INFO(10) Minimum size for LIFACT of MA57BD (without compress). +C INFO(11) Minimum size for LA of MA57BD (with compress). +C INFO(12) Minimum size for LIFACT of MA57BD (with compress). +C INFO(13) Number of compresses. +C INFO(14:40) Not used. + +C Procedures + INTRINSIC MIN + EXTERNAL MA57GD,MC47ID,MC47BD,MA57VD,MA57HD,MA57JD,MA57KD, + * MA57LD,MA57MD,MA57ND +C MA57GD Expand representation to whole matrix and sort. +C MC47BD Approximate Minimum Degree avoiding problems with dense rows. +C MA57VD Is same as MA27GD. Sort for using MA27HD/MA57HD. +C MA57HD Is same as MA27HD. Minimum degree ordering from MA27. +C MA57JD Sort to upper triangular form (pivot sequence given). +C MA57KD Construct tree pointers given output from MA57JD. +C MA57LD Depth-first search of tree. +C MA57MD Construct map. +C MA57ND Calculate storage and operation counts. + +C Local variables + INTEGER I,IL,IN,IPE,IRNPRM,COUNT,FILS,FRERE,HOLD,IFCT,INVP,IPS, + + IW,IWFR,K,LDIAG,LP,LW,LROW,MAP,EXPNE, + + MP,NCMPA,NEMIN,NODE,NST,NSTEPS,NV,PERM, + + IW1,IW2,IW3,IW4,IW5,NSTK,ND,NELIM,NZE,ALENB, + + J,JJ,J1,J2,SIZE22,OXO +C Local variables for MA27 ordering call + INTEGER IF27H +C Local variables for MeTiS call + INTEGER METOPT(8),METFTN,ICNTL6,INF47(10),ICNT47(10) + DOUBLE PRECISION ZERO,THRESH,AVNUM,MC47FI,RINF47(10) + PARAMETER (ZERO=0.0D0) + +C I Temporary DO index. +C IPE Displacement in array KEEP for array IPE of MA57GD, +C MA57HD, MA57JD, and MA57KD. +C COUNT Displacement in array KEEP for array COUNT of MA57GD, +C MA57HD, MA57JD, MA57KD, MA57LD, and MA57ND. +C IWFR First unused location in IFCT(1:LW). +C K Temporary variable. +C LDIAG Control for amount of information output. +C LP Stream number for error messages. +C LW Length of IFACT when four arrays of length N+1 are excluded. +C LROW Subscript in array KEEP for array LAST of MA57KD and +C MA57LD and LROW of MA57MD. +C MAP Subscript in array KEEP for MAP array. +C MP Stream number for monitoring. +C NODE Subscript in array KEEP for array FLAG of MA57KD, and +C NODE of MA57LD. +C NSTEPS Number of nodes in the assembly tree. +C NV Displacement in array IFACT for array NV of MA57GD and +C MA57HD, PERM of MA57JD, IPR of MA57KD, and NE of MA57LD. +C PERM Subscript in array KEEP for array PERM of MA57LD/ND. +C SP Stream number for statistics. +C SIZES subscript in array KEEP. On exit, +C KEEP(SIZES) is number of faulty entries. +C KEEP(SIZES+1) is the number of nodes in the assembly tree. + + +C Set local print variables + LP = ICNTL(1) + MP = ICNTL(3) + LDIAG = ICNTL(5) + +C Initialize information array. + DO 10 I = 1,40 + INFO(I) = 0 + 10 CONTINUE + DO 11 I = 1,20 + RINFO(I) = ZERO + 11 CONTINUE + +C Check N, NE, and LKEEP for obvious errors + IF (N.LT.1) GO TO 20 + IF (NE.LT.0) GO TO 30 + IF (LKEEP.LT.5*N+NE+MAX(N,NE)+42) GO TO 40 + + IF (ICNTL(6).EQ.1) THEN +C Check permutation array + DO 12 I = 1,N + IWORK(I) = 0 + 12 CONTINUE + DO 14 I=1,N + K = KEEP(I) + IF (K.LE.0 .OR. K.GT.N) GO TO 80 + IF (IWORK(K).NE.0) GO TO 80 + IWORK(K) = I + 14 CONTINUE + ENDIF + +C If requested, print input variables. + IF (LDIAG.GE.3 .AND. MP.GE.0) THEN + WRITE(MP,99980) N,NE,(ICNTL(I),I=1,7),ICNTL(12),ICNTL(15) +99980 FORMAT (//'Entering analysis phase (MA57AD) with ...'/ + 1 'N Order of matrix =',I12/ + 2 'NE Number of entries =',I12/ + 6 'ICNTL(1) Stream for errors =',I12/ + 7 ' --- (2) Stream for warnings =',I12/ + 8 ' --- (3) Stream for monitoring =',I12/ + 9 ' --- (4) Stream for statistics =',I12/ + 1 ' --- (5) Level of diagnostic printing =',I12/ + 2 ' --- (6) Flag for input pivot order =',I12/ + 2 ' --- (7) Numerical pivoting control (st est) =',I12/ + 2 ' --- (12) Node amalgamation parameter =',I12/ + 2 ' --- (15) Scaling control (storage estimate) =',I12) + K = MIN(10,NE) + IF (LDIAG.GE.4) K = NE + WRITE (MP,'(/A/(3(I6,A,2I8,A)))') ' Matrix entries:', + + (I,': (',IRN(I),JCN(I),')',I=1,K) + IF (K.LT.NE) WRITE (MP,'(A)') ' . . .' + + IF (ICNTL(6).EQ.1) THEN +C Print out permutation array. + K = MIN(10,N) + IF (LDIAG.GE.4) K = N + WRITE (MP,'(A,10I6:/(7X,10I6))') ' KEEP =', (KEEP(I),I=1,K) + IF (K.LT.N) WRITE (MP,'(7X,A)') ' . . .' + END IF + + END IF + +C Partition IWORK + IW1 = 1 + IW2 = IW1 + N + IW3 = IW2 + N + IW4 = IW3 + N + IW5 = IW4 + N + FILS = IW1 + FRERE = IW2 + ND = IW3 + NELIM = IW4 + NV = IW5 + +C Partition KEEP + PERM = 1 + NSTEPS = PERM + N + EXPNE = NSTEPS + 1 + HOLD = EXPNE + 1 + LROW = HOLD + 40 + NODE = LROW + N + NSTK = NODE + N + MAP = NSTK + N + IRNPRM = MAP + MAX(N,NE) + INVP = NODE + IW = NODE + IPE = LROW + IFCT = MAP +C This is set for MA57VD/MA57HD (MA27 orderings) only to allow more +C space for expanded factors + IF27H = NODE + IPS = MAP + COUNT = NSTK + +C Set HOLD(1) + KEEP(HOLD) = 0 + +C Sort and order ... generate tree + +C Set local value for ICNTL(6) + ICNTL6 = ICNTL(6) + IF (ICNTL(6).GT.5) ICNTL6 = 5 + + IF (ICNTL6.EQ.4 .OR. ICNTL6.EQ.5) THEN +C MeTiS ordering requested. Use dummy call to see if it has been +C installed. +C Set flag for Fortran-style numbering of arrays + METFTN = 1 +C Set default values for parameters. + METOPT(1) = 0 +C Dummy call with 1 by 1 matrix + KEEP(IPE) = 1 + KEEP(IPE+1) = 2 + KEEP(IFCT) = 1 + CALL METIS_NODEND(1,KEEP(IPE),KEEP(IFCT),METFTN,METOPT, + * KEEP(NSTK),KEEP(PERM)) +C Flag set if dummy code for METIS_NODEND has been used + IF (KEEP(PERM).EQ.-1) THEN + IF (ICNTL6 .EQ. 4) GO TO 90 +C Reset ICNTL6 to use MC47 + ICNTL6 = 2 + ENDIF + ENDIF + IF (ICNTL6.NE.1) THEN +C Ordering is to be calculated by program + + CALL MC47ID(ICNT47) + + IF (ICNTL6 .NE. 3) THEN +C ELSE clause (ICNTL6.EQ.3) for MA27 ordering +C MC47 (with dense row detection disabled) used if ICNTL6 equal to 0. +C MC47 used if ICNTL6 equal to 2. +C METIS used if ICNTL6 equal to 4. +C Automatic choice of METIS or MC47 if ICNTL6 equal to 5. + +C Sort matrix to obtain complete pattern (upper and lower triangle) +C but omitting diagonals, duplicates, and out-of-range entries. +C On exit, sorted matrix is given by IPE(pointers), IFCT (indices), +C and COUNT (lengths). IWFR is position after last index in IFCT. + CALL MA57GD(N,NE,IRN,JCN,KEEP(IFCT),KEEP(IPE),KEEP(COUNT), + + KEEP(IW),IWFR,ICNTL,INFO) + + IF (ICNTL6.EQ.5) THEN +C Calculate matrix statistics to determine ordering + IF (ICNTL(7).EQ.2) THEN +C Action if positive definite option has been chosen. + AVNUM = FLOAT(IWFR+N-1)/FLOAT(N) + IF (N.GE.50000) THEN + ICNTL6 = 4 +C IF (AVNUM.LE.6.0) ICNTL6 = 2 + GO TO 97 + ENDIF + IF (N.LE.30000) THEN + ICNTL6 = 2 + IF (AVNUM.GT.100.0) ICNTL6 = 4 + GO TO 97 + ENDIF + IF (N.GT.30000 .AND. N.LT.50000) THEN + IF (AVNUM.GT.46.0) THEN + ICNTL6 = 4 + ELSE + ICNTL6 = 2 + ENDIF + GO TO 97 + ENDIF + ELSE +C Matrix has not been declared positive definite. + AVNUM = FLOAT(IWFR+N-1)/FLOAT(N) +C Set flag for detection of OXO matrix + OXO = 0 +C Check for KKT and OXO. +C Calculate size of possible trailing block + J2 = IWFR - 1 + SIZE22 = 0 + DO 100 J = N,1,-1 + J1 = KEEP(IPE+J-1) +C Note that MA57GD does not sort within order in columns + DO 99 JJ = J1,J2 + IF (KEEP(IFCT+JJ-1).GT.J) GO TO 101 + 99 CONTINUE + SIZE22 = SIZE22 + 1 + J2 = J1-1 + 100 CONTINUE + 101 IF (SIZE22 .GT. 0) THEN +C Check to see if there are no entries in (1,1) block. + DO 98 I = 1,NE + IF (IRN(I) .LE. N-SIZE22 + * .AND. JCN(I) .LE. N-SIZE22) THEN + AVNUM = FLOAT(IWFR+N-SIZE22-1)/FLOAT(N) + GO TO 96 + ENDIF + 98 CONTINUE +C The (1,1) block is zero. + OXO = 1 + AVNUM = FLOAT(IWFR-1)/FLOAT(N) + ENDIF + 96 IF (N .GE. 100000) THEN + IF (AVNUM.GT.5.42) THEN + ICNTL6 = 4 + ELSE + ICNTL6 = 2 + ENDIF + GO TO 97 + ENDIF +C Logic for OXO matrices + IF (OXO.EQ.1) THEN + IF (FLOAT(N-SIZE22)/FLOAT(SIZE22) .GT .1.8D0) THEN + ICNTL6 = 2 + ELSE + ICNTL6 = 4 + ENDIF + GO TO 97 + ENDIF +C We can try further simple logic here ... then ... +C Call MC47 to test whether fill-in projected is large + LW = LKEEP-IFCT+1 + CALL MC47BD(N,LW,KEEP(IPE),IWFR,KEEP(COUNT), + + KEEP(IFCT),IWORK(NV), + + KEEP(INVP),KEEP(PERM),IWORK(IW1), + + IWORK(IW2),IWORK(IW3),IWORK(IW4), + + ICNT47,INF47,RINF47) + INFO(13) = INF47(2) + ICNTL6 = 2 + NEMIN = ICNTL(12) + CALL MA57LD(N,KEEP(IPE),IWORK(NV),KEEP(IPS),IWORK(NELIM), + + KEEP(NSTK),KEEP(NODE),KEEP(PERM), + + KEEP(NSTEPS),IWORK(FILS),IWORK(FRERE),IWORK(ND), + + NEMIN,KEEP(IRNPRM)) + NST = KEEP(NSTEPS) + CALL MA57MD(N,NE,IRN,JCN,KEEP(MAP),KEEP(IRNPRM), + + KEEP(LROW),KEEP(PERM), + + IWORK(IW2),IWORK(IW5)) + KEEP(EXPNE) = IWORK(IW5) + CALL MA57ND(N,KEEP(LROW),KEEP(NSTK),IWORK(NELIM), + + IWORK(ND),NST,IWORK(IW1),IWORK(IW2), + + INFO,RINFO) +C Check relative fill-in of MC47 + IF (FLOAT(INFO(5))/FLOAT(NE) .LT. 10.0) THEN +C We will run with the MC47 ordering + GO TO 93 + ELSE +C Save value of relative fill-in for testing against METIS + MC47FI = FLOAT(INFO(5))/FLOAT(NE) +C Must test METIS ordering now ... ugh + CALL MA57GD(N,NE,IRN,JCN,KEEP(IFCT),KEEP(IPE),KEEP(COUNT), + + KEEP(IW),IWFR,ICNTL,INFO) + KEEP(IPE+N) = IWFR + METFTN = 1 + METOPT(1) = 0 + IF (N.LT.50) GO TO 92 + DO 91 I = 1,N + IF ((KEEP(IPE+I)-KEEP(IPE+I-1)) .GT. N/10) THEN + METOPT(1) = 1 + METOPT(2) = 3 + METOPT(3) = 1 + METOPT(4) = 2 + METOPT(5) = 0 + METOPT(6) = 1 + METOPT(7) = 200 + METOPT(8) = 1 + GO TO 92 + ENDIF + 91 CONTINUE + 92 CALL METIS_NODEND(N,KEEP(IPE),KEEP(IFCT),METFTN,METOPT, + * KEEP(NSTK),KEEP(PERM)) + CALL MA57JD(N,NE,IRN,JCN,KEEP(PERM),KEEP(IFCT),KEEP(IPE), + + KEEP(COUNT),IWORK(IW1),IWFR,ICNTL,INFO) + LW = LKEEP - IFCT + 1 + CALL MA57KD(N,KEEP(IPE),KEEP(IFCT),LW,IWFR,KEEP(PERM), + + KEEP(INVP),IWORK(NV),IWORK(IW1),NCMPA) + INFO(13) = NCMPA + NEMIN = ICNTL(12) + CALL MA57LD(N,KEEP(IPE),IWORK(NV),KEEP(IPS),IWORK(NELIM), + + KEEP(NSTK),KEEP(NODE),KEEP(PERM), + + KEEP(NSTEPS),IWORK(FILS),IWORK(FRERE),IWORK(ND), + + NEMIN,KEEP(IRNPRM)) + NST = KEEP(NSTEPS) + CALL MA57MD(N,NE,IRN,JCN,KEEP(MAP),KEEP(IRNPRM), + + KEEP(LROW),KEEP(PERM), + + IWORK(IW2),IWORK(IW5)) + KEEP(EXPNE) = IWORK(IW5) + CALL MA57ND(N,KEEP(LROW),KEEP(NSTK),IWORK(NELIM), + + IWORK(ND),NST,IWORK(IW1),IWORK(IW2), + + INFO,RINFO) + IF (FLOAT(INFO(5))/FLOAT(NE).LT.MC47FI) THEN + ICNTL6 = 4 + GO TO 93 + ELSE +C Double groan ... we will run with MC47 after all + ICNTL6=2 +C KEEP(IPE) has been corrupted must reset it. + CALL MA57GD(N,NE,IRN,JCN,KEEP(IFCT),KEEP(IPE),KEEP(COUNT), + + KEEP(IW),IWFR,ICNTL,INFO) + GO TO 97 + ENDIF +C End of METIS check + ENDIF +C End of indef case calculation + ENDIF +C End of logic for ICNTL6 = 5 + ENDIF + + 97 IF (ICNTL6.EQ.4) THEN +C Set last pointer in IPE + KEEP(IPE+N) = IWFR +C Use MeTiS ordering +C Set flag for Fortran-style numbering of arrays + METFTN = 1 +C This would use only defaults + METOPT(1) = 0 +C Set options for METIS, particularly one for dense columns +C First determine if there are any dense columns + IF (N.LT.50) GO TO 103 + DO 102 I = 1,N + IF ((KEEP(IPE+I)-KEEP(IPE+I-1)) .GT. N/10) THEN +C The rest are set to default values + METOPT(1) = 1 + METOPT(2) = 3 + METOPT(3) = 1 + METOPT(4) = 2 + METOPT(5) = 0 + METOPT(6) = 1 + METOPT(7) = 200 + METOPT(8) = 1 + GO TO 103 + ENDIF + 102 CONTINUE + 103 CALL METIS_NODEND(N,KEEP(IPE),KEEP(IFCT),METFTN,METOPT, + * KEEP(NSTK),KEEP(PERM)) + GO TO 111 + ENDIF + + +C Obtain ordering using approximate minimum degree ordering. +C Input IPE,IWFR,COUNT,IFCT as from MA57GD. +C Output +C IPE (- father pointer .. if NV(I) > 0, - subordinate variable +C pointer if NV(I) = 0) +C NV(I) for subordinate variables of supervariable, otherwise +C degree when eliminated. +C IWFR is set to length required by MC47BD if no compresses. +C COUNT, IFCT undefined on exit. +C INVP is inverse permutation and PERM is permutation +C Length of LW set to maximum to avoid compresses in MC47B/BD + LW = LKEEP-IFCT+1 +C ICNTL6 = 0. MC47 uses code for dealing with dense rows disabled +C In HSL 2002 it was only used in the F90 version. +C ICNTL6 = 2. MC47 implements code for dealing with dense rows + IF (ICNTL6 .EQ. 0) ICNT47(4) = -1 + CALL MC47BD(N,LW,KEEP(IPE),IWFR,KEEP(COUNT), + + KEEP(IFCT),IWORK(NV), + + KEEP(INVP),KEEP(PERM),IWORK(IW1), + + IWORK(IW2),IWORK(IW3),IWORK(IW4), + + ICNT47,INF47,RINF47) + INFO(13) = INF47(2) + + ELSE +C End of ICNTL6 .NE. 3 + +C MA27 ordering being used. Must insert row lengths in KEEP(IFCT) +C Length of LW set to maximum to avoid compresses. + LW = LKEEP-IF27H+1 + CALL MA57VD(N,NE,IRN,JCN,KEEP(IF27H),LW,KEEP(IPE),IWORK(IW1), + * IWORK(IW2),IWFR,ICNTL,INFO) +C Analyse using minimum degree ordering + THRESH = FLOAT(ICNTL(14))/100.0 + CALL MA57HD(N,KEEP(IPE),KEEP(IF27H),LW,IWFR,IWORK(NV), + * IWORK(IW1),IWORK(IW2),IWORK(IW3),IWORK(IW4), + + 2139062143,INFO(13),THRESH) +C Set IPE correctly + DO 110 I = 1,N + IF (IWORK(NV+I-1).NE.0) GO TO 110 + IN = I + 105 IL = IN + IN = - KEEP(IPE+IL-1) + IF (IWORK(NV+IN-1).EQ.0) GO TO 105 +C Make subordinate node point to principal node + KEEP(IPE+I-1) = -IN + 110 CONTINUE + ENDIF + +C End of block for generating ordering + ENDIF + + 111 IF (ICNTL6.EQ.1 .OR. ICNTL6.EQ.4) THEN +C If we have generated ordering using MeTiS then we need to feed +C permutation as if it were coming from the user as we do not +C have a tight coupling to MeTiS as for other orderings. + +C Sort using given order + CALL MA57JD(N,NE,IRN,JCN,KEEP(PERM),KEEP(IFCT),KEEP(IPE), + + KEEP(COUNT),IWORK(IW1),IWFR,ICNTL,INFO) + +C Generating tree using given ordering +C Input: N,KEEP(IPE),KEEP(IFCT),LW,IWFR,KEEP(PERM) +C Output: KEEP(IPE),IWORK(NV) + LW = LKEEP - IFCT + 1 + CALL MA57KD(N,KEEP(IPE),KEEP(IFCT),LW,IWFR,KEEP(PERM), + + KEEP(INVP),IWORK(NV),IWORK(IW1),NCMPA) + INFO(13) = NCMPA + + END IF + + +C Perform depth-first search of assembly tree +C Set NEMIN + NEMIN = ICNTL(12) +C Input IPE,NV,NEMIN +C Output +C IPE .. father and younger brother pointer +C NV .. unchanged +C NE/NSTK/ND defined for nodes of tree +C PERM +C IPS(I) position of node I in order +C LROW(I) is size of frontal matrix at node I + CALL MA57LD(N,KEEP(IPE),IWORK(NV),KEEP(IPS),IWORK(NELIM), + + KEEP(NSTK),KEEP(NODE),KEEP(PERM), + + KEEP(NSTEPS),IWORK(FILS),IWORK(FRERE),IWORK(ND), + + NEMIN,KEEP(IRNPRM)) + NST = KEEP(NSTEPS) + +C Construct map for storing the permuted upper triangle by rows. +C Input N,NE,IRN,JCN,PERM +C Output MAP,LROW,IRNPRM + CALL MA57MD(N,NE,IRN,JCN,KEEP(MAP),KEEP(IRNPRM), + + KEEP(LROW),KEEP(PERM), + + IWORK(IW2),IWORK(IW5)) + +C Set number of entries in expanded input matrix + KEEP(EXPNE) = IWORK(IW5) + +C Evaluate storage and operation counts. +C Input LROW,NSTK,NELIM,ND +C Output LROW,NSTK (unchanged) + CALL MA57ND(N,KEEP(LROW),KEEP(NSTK),IWORK(NELIM), + + IWORK(ND),NST,IWORK(IW1),IWORK(IW2), + + INFO,RINFO) + +C Set INFO entry to record ordering used + 93 INFO(36) = ICNTL6 +C Add for BIGA + ALENB = 1 +C Add for Schnabel-Eskow + IF (ICNTL(7).EQ.4) ALENB = ALENB + N + 5 +C Add for scaling + IF (ICNTL(15).EQ.1) ALENB = ALENB + N + +C Allow enough to get started + INFO(9) = MAX(INFO(9)+ALENB,ALENB+KEEP(EXPNE)+1) + INFO(11) = MAX(INFO(11)+ALENB,ALENB+KEEP(EXPNE)+1) +C This is N+5 for starting the factorization, N for first row (max). + INFO(10) = MAX(INFO(10),KEEP(EXPNE)+N+5) + INFO(12) = MAX(INFO(12),KEEP(EXPNE)+N+5) + +C Needed by MA57B/BD + IF (ICNTL(15).EQ.1) THEN + INFO(9) = MAX(INFO(9),ALENB+3*KEEP(EXPNE)+3*N) + INFO(11) = MAX(INFO(11),ALENB+3*KEEP(EXPNE)+3*N) +C Allow space for integers in computing scaling factors + INFO(10) = MAX(INFO(10),3*KEEP(EXPNE)+5*N+1) + INFO(12) = MAX(INFO(12),3*KEEP(EXPNE)+5*N+1) + ENDIF + +C If requested, print parameter values on exit. + IF (LDIAG.GE.3 .AND. MP.GE.0) THEN + NZE = KEEP(EXPNE) + WRITE (MP,99999) INFO(1),NZE, + * (INFO(I),I=3,13),INFO(36),(RINFO(I),I=1,2) +99999 FORMAT (/'Leaving analysis phase (MA57AD) with ...'/ + 1 'INFO(1) Error indicator =',I12/ + 2 'Number of entries in matrix with diagonal =',I12/ + 2 'INFO(3) Number of out-of-range indices =',I12/ + 2 'INFO(4) Number of off-diagonal duplicates =',I12/ + 2 'INFO(5) Forecast real storage for factors =',I12/ + 3 '----(6) Forecast integer storage for factors =',I12/ + 3 '----(7) Forecast maximum front size =',I12/ + 4 '----(8) Number of nodes in assembly tree =',I12/ + 5 '----(9) Size of FACT without compress =',I12/ + 6 '----(10) Size of IFACT without compress =',I12/ + 5 '----(11) Size of FACT with compress =',I12/ + 5 '----(12) Size of IFACT with compress =',I12/ + 5 '----(13) Number of compresses =',I12/ + 5 '----(36) Ordering strategy used by code =',I12/ + 9 'RINFO(1) Forecast additions for assembly =',1P,D12.5/ + 9 'RINFO(2) Forecast ops for elimination =',1P,D12.5) + + K = MIN(10,N) + IF (LDIAG.GE.4) K = N + WRITE (MP,'(/A/(5I12))') 'Permutation array:', + + (KEEP(I),I=1,K) + IF (K.LT.N) WRITE (MP,'(16X,A)') ' . . .' + WRITE (MP,'(/A/(5I12))') + + 'Number of entries in rows of permuted matrix:', + + (KEEP(LROW+I-1),I=1,K) + IF (K.LT.N) WRITE (MP,'(16X,A)') ' . . .' + K = MIN(10,NZE) + IF (LDIAG.GE.4) K = NZE + WRITE (MP,'(/A/(5I12))') + * 'Column indices of permuted matrix:', + * (KEEP(IRNPRM+I-1),I=1,K) + IF (K.LT.NZE) WRITE (MP,'(16X,A)') ' . . .' + K = MIN(10,N) + IF (LDIAG.GE.4) K = N + WRITE (MP,'(/A/(5I12))') + + 'Tree nodes at which variables eliminated:', + + (KEEP(NODE+I-1),I=1,K) + IF (K.LT.N) WRITE (MP,'(16X,A)') ' . . .' + K = MIN(10,NE) + IF (LDIAG.GE.4) K = NE + WRITE (MP,'(/A/(5I12))') 'Map array:', + * (KEEP(I),I=MAP,MAP+K-1) + IF (K.LT.NE) WRITE (MP,'(16X,A)') ' . . .' + END IF + + RETURN + +C Error conditions. + 20 INFO(1) = -1 + INFO(2) = N + IF (LDIAG.GT.0 .AND. LP.GE.0) WRITE (LP,'(/A,I3/A,I10)') + + '**** Error return from MA57AD **** INFO(1) =',INFO(1), + + 'N has value ',INFO(2) + RETURN + + 30 INFO(1) = -2 + INFO(2) = NE + IF (LDIAG.GT.0 .AND. LP.GE.0) WRITE (LP,'(/A,I3/A,I10)') + + '**** Error return from MA57AD **** INFO(1) =',INFO(1), + + 'NE has value',INFO(2) + RETURN + + 40 INFO(1) = -15 + INFO(2) = LKEEP + IF (LDIAG.GT.0 .AND. LP.GE.0) WRITE (LP,'(/A,I3/A,I10/A,I10)') + + '**** Error return from MA57AD **** INFO(1) =',INFO(1), + + 'LKEEP has value ',INFO(2), + + 'Should be at least ',5*N+NE+MAX(N,NE)+42 + RETURN + + 80 INFO(1) = -9 + INFO(2) = I + IF (LDIAG.GT.0 .AND. LP.GE.0) WRITE (LP,'(/A,I3/A/A,I10,A)') + + '**** Error return from MA57AD **** INFO(1) =',INFO(1), + + 'Invalid permutation supplied in KEEP', + + 'Component',INFO(2),' is faulty' + RETURN + + 90 INFO(1) = -18 + IF (LDIAG.GT.0 .AND. LP.GE.0) WRITE (LP,'(/A,I3/A)') + + '**** Error return from MA57AD **** INFO(1) =',INFO(1), + + 'MeTiS ordering requested but MeTiS not linked' + + END + + +C-------------------------------------------------------------------- +C HSL 2000 (2000) +C -- +C- Copyright Rutherford Appleton Laboratory +C -- +C-------------------------------------------------------------------- + SUBROUTINE MA57BD(N, NE, A, FACT, LFACT, IFACT, LIFACT, + * LKEEP, KEEP, PPOS, ICNTL, CNTL, INFO, RINFO) +C +C Purpose +C ======= +C +C +C This subroutine computes the factorization of the matrix input in +C A using information (in KEEP and IFACT) from MA57AD. +C + INTEGER N,NE,LFACT,LIFACT,LKEEP + DOUBLE PRECISION A(NE),FACT(LFACT) + DOUBLE PRECISION RINFO(20) +C +C Control parameters: see description in MA57ID + DOUBLE PRECISION CNTL(5) + INTEGER ICNTL(20), IFACT(LIFACT) + INTEGER INFO(40), KEEP(LKEEP), PPOS(N) +C +C Parameters +C ========== +C +C N is an INTEGER variable which must be set by the user to the +C order n of the matrix A. It must be unchanged since the +C last call to MA57AD and is not altered by the +C subroutine. Restriction: N > 0 +C +C NE is an INTEGER variable which must be set by the user to the +C number of entries in the matrix A. It is not altered by +C the subroutine. Restriction: NE >= 0. +C +C A is a REAL (DOUBLE_PRECISION in the D version) array of length NE. +C It is not altered by the subroutine. +C +C FACT is a REAL (DOUBLE_PRECISION in the D version) +C array of length LFACT. It need not +C be set by the user. On exit, entries 1 to INFO(15) of FACT hold +C the real part of the factors and should be passed unchanged to +C MA57CD. +C +C LFACT is an INTEGER variable that must be set by the user to +C the size of array FACT. +C It should be passed unchanged to MA57CD. +C +C IFACT is an INTEGER array of length LIFACT. It need not +C be set by the user. On exit, entries 1 to INFO(16) of IFACT hold +C the integer part of the factors and should be passed unchanged to +C MA57CD. +C +C LIFACT is an INTEGER variable that must be set by the user to +C the size of array IFACT. +C It should be passed unchanged to MA57CD. +C +C LKEEP is an INTEGER that must be set to the length of array KEEP. +C Restriction: LKEEP >= 5*N+NE+MAX(N,NE)+42. +C +C KEEP is an INTEGER array of length LKEEP which must be +C passed unchanged since the last call to MA57AD. It is not +C altered by MA57BD. +C +C PPOS is an INTEGER array of length N that is used as workspace. +C +C ICNTL is an INTEGER array of length 20 +C that contains control parameters and must be set +C by the user. +C Default values for the components may be set by a call +C to MA57ID. Details +C of the control parameters are given in MA57ID +C +C CNTL is a REAL (DOUBLE_PRECISION in the D version) array of length 5 +C that contains control parameters and must be set +C by the user. +C Default values for the components may be set by a call +C to MA57ID. Details +C of the control parameters are given in MA57ID +C +C RINFO is a REAL (DOUBLE_PRECISION in the D version) array of +C length 20 which need not be set by the user. +C We describe below the components of this array modified +C in the subroutine. +C +C ______(3) Number of floating point operations involved +C during the assembly process +C +C ______(4) Number of floating point operations involved +C during the elimination process +C +C ______(5) Number of extra floating point operations caused by +C use of Level 3 BLAS +C +C +C .. Error Return .. +C ============ +C +C A successful return from MA57BD +C is indicated by a value of INFO(1) positive. +C Negative values of INFO(1) correspond to +C error message whereas positive values correspond to +C warning messages. A negative value of INFO(1) is associated with +C an error message which will be output on unit ICNTL(1). +C +C +C .. Local variables .. +C =============== +C + INTEGER EXPNE,HOLD,I,IRNPRM,K,LDIAG,LLFACT,LP,LROW,MAP,MM1,MM2,MP + INTEGER J,JJ,KK,ISCALE,NUM,NE64,IDUP,IMAT,IPT,JLOOP,JNEW,NN,ISING + INTEGER NSTEPS,NODE,NSTK,PERM,INEW,ALENB,BIGA + + DOUBLE PRECISION ONE,ZERO,RINF,FCT,SMAX,SMIN,REPS + PARAMETER (ONE = 1.0D0, ZERO=0.0D0) + + INTRINSIC MIN + +C +C EXPNE is number of entries of original matrix plus any missing +C diagonals. +C HOLD points to position in IFACT for first entry of array that holds +C values for restart. +C MM1,MM2 are used to define start point of arrays for matrix +C modification. Needed if LFACT < N + 5. +C NSTEPS holds the number of nodes in the tree. + +C +C External Subroutines +C ==================== +C + + EXTERNAL MA57OD,MA57UD,MC34AD,MC64WD + +C Set RINF to largest positive real number (infinity) + RINF = HUGE(RINF) +C Set REPS to smallest number st 1.0+REPS > 1.0 + REPS = EPSILON(REPS) + +C Set INFO for -3 and -4 error return. Ok that is done on every call + INFO(17) = 0 + INFO(18) = 0 + +C +C +C Initialisation of printing controls. +C + LP = ICNTL(1) + MP = ICNTL(3) + LDIAG = ICNTL(5) +C +C?? +C Check if analysis has been effectively performed +C + IF (N.LE.0) GO TO 25 + IF (NE.LT.0) GO TO 30 + IF (LKEEP.LT.5*N+NE+MAX(N,NE)+42) GO TO 40 + IF (ICNTL(7).LT.1 .OR. ICNTL(7).GT.4) GO TO 35 + +C Partition of array KEEP + NSTEPS = KEEP(N+1) + EXPNE = KEEP(N+2) + PERM = 1 + HOLD = PERM + N + 2 + LROW = HOLD + 40 + NODE = LROW + N + NSTK = NODE + N + MAP = NSTK + N + IRNPRM = MAP + MAX(NE,N) + + BIGA = LFACT + LLFACT = LFACT - 1 + + IF (ICNTL(15).EQ.1) THEN +C Matrix is being scaled using MC64SYM + ISCALE = LLFACT - N + 1 + LLFACT = ISCALE - 1 + ENDIF + + IF (ICNTL(7).EQ.4) THEN +C Schnabel-Eskow modification being used +C Reserve space in FACT for diagonal entries and controls. + LLFACT = LLFACT - N - 5 +C Set MM1 and MM2 to point to first entries in arrays. + MM1 = LLFACT+6 + MM2 = LLFACT+1 + ELSE + MM1 = 1 + MM2 = 1 + ENDIF + +C One for BIGA + ALENB = 1 + IF (ICNTL(7).EQ.4) ALENB = ALENB + N + 5 + IF (ICNTL(15).EQ.1) ALENB = ALENB + N +C +1 because MAP of o-o-r maps to entry 0 + IF (LLFACT.LT.EXPNE+1) GO TO 85 +C The first five positions and room for a whole row are needed +C at the beginning of the MA57O/OD factorization + IF (LIFACT.LT.EXPNE+N+5) GO TO 95 +C Check that there is enough space for scaling within MA57B/BD. + IF (ICNTL(15).EQ.1) THEN + IF (LFACT .LT. ALENB + 3*EXPNE + 3*N) GO TO 85 + IF (LIFACT .LT. 3*EXPNE + 5*N + 1) GO TO 95 + ENDIF + +C +C PRINTING OF INPUT PARAMETERS +C***************************** + IF (LDIAG.GE.3 .AND. MP.GE.0) THEN + WRITE (MP,99999) +99999 FORMAT (//'Entering factorization phase (MA57BD) with ...') + IF (KEEP(HOLD).GT.0) WRITE (MP,99998) +99998 FORMAT ('Re-entry call after call to MA57ED') + WRITE (MP,99997) N,NE,EXPNE,(ICNTL(I),I=1,5),ICNTL(7),ICNTL(8), + + ICNTL(11),ICNTL(15),ICNTL(16), LFACT, LIFACT, NSTEPS, + + CNTL(1), CNTL(2), CNTL(4), CNTL(5) +99997 FORMAT ('N Order of input matrix =',I12/ + 2 'NE Entries in input matrix =',I12/ + 2 ' Entries in input matrix (inc diags) =',I12/ + 6 'ICNTL(1) Stream for errors =',I12/ + 7 ' --- (2) Stream for warnings =',I12/ + 8 ' --- (3) Stream for monitoring =',I12/ + 9 ' --- (4) Stream for statistics =',I12/ + 1 ' --- (5) Level of diagnostic printing =',I12/ + 1 ' --- (7) Numerical pivoting control =',I12/ + 1 ' --- (8) Restart or discard factors =',I12/ + 1 ' --- (11) Block size for Level 3 BLAS =',I12/ + 1 ' --- (15) Scaling control (1 on) =',I12/ + 1 ' --- (16) Dropping control (1 on) =',I12/ + 4 'LFACT Size of real working space =',I12/ + 5 'LIFACT Size of integer working space =',I12/ + 7 ' Number nodes in assembly tree =',I12/ + 9 'CNTL(1) Value of threshold parameter =',D12.5/ + 9 'CNTL(2) Threshold for zero pivot =',D12.5/ + 9 'CNTL(4) Control for value of static pivots =',D12.5/ + 9 'CNTL(5) Control for number delayed pivots =',D12.5) + K = MIN(10,NE) + IF (LDIAG.GE.4) K = NE + IF (NE.GT.0) THEN + WRITE (MP,'(/A/(3(I6,A,1P,D16.8,A)))') 'Matrix entries:', + + (I,': (',A(I),')',I=1,K) + IF (K.LT.NE) WRITE (MP,'(A)') ' . . .' + END IF + K = MIN(10,N) + IF (LDIAG.GE.4) K = N + WRITE (MP,'(/A/(5I12))') 'Permutation array:', + + (KEEP(I),I=1,K) + IF (K.LT.N) WRITE (MP,'(16X,A)') ' . . .' + WRITE (MP,'(/A/(5I12))') + + 'Number of entries in rows of permuted matrix:', + + (KEEP(LROW+I-1),I=1,K) + IF (K.LT.N) WRITE (MP,'(16X,A)') ' . . .' + WRITE (MP,'(/A/(5I12))') + + 'Tree nodes at which variables eliminated:', + + (KEEP(NODE+I-1),I=1,K) + IF (K.LT.N) WRITE (MP,'(16X,A)') ' . . .' + K = MIN(10,NSTEPS) + IF (LDIAG.GE.4) K = NSTEPS + IF (K.GT.0) WRITE (MP,'(/A/(5I12))') + + 'Number of assemblies at each tree node:', + + (KEEP(NSTK+I-1),I=1,K) + IF (K.LT.NSTEPS) WRITE (MP,'(16X,A)') ' . . .' + K = MIN(10,NE) + IF (LDIAG.GE.4) K = NE + WRITE (MP,'(/A/(5I12))') 'Map array:', + * (KEEP(I),I=MAP,MAP+K-1) + IF (K.LT.NE) WRITE (MP,'(16X,A)') ' . . .' + K = MIN(10,EXPNE) + IF (LDIAG.GE.4) K = EXPNE + WRITE (MP,'(/A/(5I12))') + * 'Column indices of permuted matrix:', + * (KEEP(IRNPRM+I-1),I=1,K) + IF (K.LT.EXPNE) WRITE (MP,'(16X,A)') ' . . .' + ENDIF + + +C Can't do because all of A isn't there now .. also it is now scaled +C BIGA = ZERO +C DO 291 K = 1,NE +C BIGA = MAX(BIGA,ABS(A(K))) +C 291 CONTINUE + +C Jump if it is reentry + IF (KEEP(HOLD) .GT. 0) GO TO 22 + +C +C*************************************************** +C MAP input nonzeros to appropriate position in FACT +C*************************************************** +C +C?? For the moment to handle missing diagonals + DO 19 K = 1,EXPNE + FACT(LLFACT-EXPNE+K) = ZERO + 19 CONTINUE + + FACT(BIGA) = ZERO + DO 20 K = 1,NE + FACT(BIGA) = MAX(FACT(BIGA),ABS(A(K))) + FACT(KEEP(MAP+K-1)+LLFACT-EXPNE) = A(K) + 20 CONTINUE + RINFO(18) = FACT(BIGA) + DO 21 K = 1,EXPNE + IFACT(LIFACT-EXPNE+K) = KEEP(IRNPRM+K-1) + 21 CONTINUE +C Invert array PERM + DO 23 I = 1,N + PPOS(KEEP(PERM+I-1)) = I + 23 CONTINUE + + IF (ICNTL(15).EQ.1) THEN +C Scaling using MC64. Matrix must be generated in correct format. + + IPT = 1 + IDUP = IPT+N+1 + IMAT = IDUP+N + ISING = IMAT + MAX(NE,EXPNE) + +C Copy matrix, remove duplicates, and initialize IP array. + DO 4444 I = 1,N + IFACT(IDUP+I-1) = 0 + 4444 CONTINUE +C IFACT(IPT)=1 +C DO 9999 I = 1, N +C IFACT(IPT+I) = IFACT(IPT+I-1)+KEEP(LROW+I-1) +C9999 CONTINUE +C Must use new coordinates to keep matrix (half) symmetric + IFACT(IPT) = 1 + KK = 1 + K = 1 + DO 3333 J = 1,N + DO 2222 JJ = 1,KEEP(LROW+J-1) + I = KEEP(PERM+IFACT(LIFACT-EXPNE+K)-1) + IF (IFACT(IDUP+I-1).GE.IFACT(IPT+J-1)) THEN +C Duplicate + FACT(IFACT(IDUP+I-1)) = + & FACT(IFACT(IDUP+I-1)) + FACT(LLFACT-EXPNE+K) + ELSE +C Remove explicit zeros + IF (FACT(LLFACT-EXPNE+K).NE.ZERO) THEN + IFACT(IDUP+I-1) = KK + FACT(KK) = FACT(LLFACT-EXPNE+K) + IFACT(IMAT-1+KK) = I + KK = KK+1 + ENDIF + ENDIF + K = K + 1 + 2222 CONTINUE + IFACT(IPT+J) = KK + 3333 CONTINUE +C Expand matrix + CALL MC34AD(N,IFACT(IMAT),IFACT(IPT),.TRUE.,FACT,KEEP(PERM)) + NE64 = IFACT(IPT+N)-1 + DO 75 J = 1,N + FCT = ZERO + DO 60 K = IFACT(IPT+J-1),IFACT(IPT+J)-1 + FACT(K) = ABS(FACT(K)) + IF (FACT(K).GT.FCT) FCT = FACT(K) + 60 CONTINUE + FACT(NE64+2*N+J) = FCT + IF (FCT.NE.ZERO) THEN + FCT = LOG(FCT) + ELSE +C This can happen if only if column is null so matrix is singular. + FCT = RINF/N + ENDIF + DO 70 K = IFACT(IPT+J-1),IFACT(IPT+J)-1 +CCC +C Note that zeros have been screened out so that FACT(K) always > 0. +C IF (FACT(K).NE.ZERO) THEN + FACT(K) = FCT - LOG(FACT(K)) +C ELSE +C FACT(K) = RINF/N +C ENDIF + 70 CONTINUE + 75 CONTINUE +C Scale matrix +C B = DW(3N+1:3N+NE); IW(1:5N) and DW(1:2N) are workspaces + CALL MC64WD(N,NE64,IFACT(IPT),IFACT(IMAT),FACT,KEEP(PERM),NUM, + & IFACT(IDUP),IFACT(IMAT+NE64),IFACT(IMAT+NE64+N), + & IFACT(IMAT+NE64+2*N),IFACT(IMAT+NE64+3*N), + & FACT(NE64+1),FACT(NE64+N+1)) + IF (NUM.EQ.N) THEN + DO 80 J = 1,N +C IF (FACT(NE64+2*N+J).NE.ZERO) THEN + FACT(NE64+N+J) = FACT(NE64+N+J) - LOG(FACT(NE64+2*N+J)) +CCC +C ELSE +C Can't happen because only possible if matrix was singular NUM NE N). +C FACT(NE64+N+J) = ZERO +C ENDIF + 80 CONTINUE +C Check size of scaling factors +C FCT = 0.5*LOG(RINF) +C DO 86 J = 1,N +C IF (FACT(NE64+J).LT.FCT .AND. FACT(NE64+N+J).LT.FCT) GO TO 86 +C INF64(1) = 2 +C 86 CONTINUE + +C Scaling is permuted to scaling on original matrix + DO 5555 I=1,N + FACT(ISCALE+PPOS(I)-1) = + & SQRT(EXP(FACT(NE64+I)+FACT(NE64+N+I))) + 5555 CONTINUE + ELSE +C Matrix is singular +C Regenerate PERM and set PPOS to indicate nonsingular block + K = 0 + DO 3501 I = 1,N + IF (KEEP(PERM+I-1).LT.0) THEN + PPOS(I) = -PPOS(I) + IFACT(ISING+I-1) = 0 + ELSE + K = K + 1 + IFACT(ISING+I-1) = K + ENDIF + 3501 CONTINUE + DO 3502 I = 1,N + KEEP(PERM+ABS(PPOS(I))-1) = I + 3502 CONTINUE +C Copy matrix, remove duplicates, and initialize IP array. + DO 3503 I = 1,N + IFACT(IDUP+I-1) = 0 + 3503 CONTINUE +C Must use new coordinates to keep matrix (half) symmetric + IFACT(IPT) = 1 + KK = 1 + K = 1 + JNEW = 0 + NN = N + DO 3505 J = 1,N + IF (PPOS(J).LT.0) THEN + NN = NN - 1 + K = K + KEEP(LROW+J-1) + GO TO 3505 + ENDIF + JNEW = JNEW + 1 + DO 3504 JJ = 1,KEEP(LROW+J-1) + I = KEEP(PERM+IFACT(LIFACT-EXPNE+K)-1) + IF (PPOS(I).GT.0) THEN + IF (IFACT(IDUP+I-1).GE.IFACT(IPT+J-1)) THEN +C Duplicate + FACT(IFACT(IDUP+I-1)) = + & FACT(IFACT(IDUP+I-1)) + FACT(LLFACT-EXPNE+K) + ELSE +C Remove explicit zeros + IF (FACT(LLFACT-EXPNE+K).NE.ZERO) THEN + IFACT(IDUP+I-1) = KK + FACT(KK) = FACT(LLFACT-EXPNE+K) + IFACT(IMAT-1+KK) = IFACT(ISING+I-1) + KK = KK+1 + ENDIF + ENDIF + ENDIF + K = K + 1 + 3504 CONTINUE + IFACT(IPT+JNEW) = KK + 3505 CONTINUE + NE64 = IFACT(IPT+NN)-1 + CALL MC34AD(NN,IFACT(IMAT),IFACT(IPT),.TRUE.,FACT,KEEP(PERM)) + NE64 = IFACT(IPT+NN)-1 + DO 3508 J = 1,NN + FCT = ZERO + DO 3506 K = IFACT(IPT+J-1),IFACT(IPT+J)-1 + FACT(K) = ABS(FACT(K)) + IF (FACT(K).GT.FCT) FCT = FACT(K) + 3506 CONTINUE + FACT(NE64+2*N+J) = FCT +CCC +C IF (FCT.NE.ZERO) THEN + FCT = LOG(FCT) +C ELSE +C Can't happen because no null columns and zeros screened out. +C FCT = RINF/NN +C ENDIF + DO 3507 K = IFACT(IPT+J-1),IFACT(IPT+J)-1 +C IF (FACT(K).NE.ZERO) THEN + FACT(K) = FCT - LOG(FACT(K)) +C ELSE +C Can't happen because zeros screened out. +C FACT(K) = RINF/NN +C ENDIF + 3507 CONTINUE + 3508 CONTINUE + CALL MC64WD(NN,NE64,IFACT(IPT),IFACT(IMAT),FACT,KEEP(PERM),NUM, + & IFACT(IDUP),IFACT(IMAT+NE64),IFACT(IMAT+NE64+N), + & IFACT(IMAT+NE64+2*N),IFACT(IMAT+NE64+3*N), + & FACT(NE64+1),FACT(NE64+N+1)) + DO 3509 J = 1,NN +CCC +C IF (FACT(NE64+2*N+J).NE.ZERO) THEN + FACT(NE64+N+J) = FACT(NE64+N+J) - LOG(FACT(NE64+2*N+J)) +C ELSE +C As in original matrix ..this can't happen. + FACT(NE64+N+J) = ZERO +C ENDIF + 3509 CONTINUE +C Check size of scaling factors +C FCT = 0.5*LOG(RINF) +C DO 86 J = 1,N +C IF (FACT(NE64+J).LT.FCT .AND. FACT(NE64+N+J).LT.FCT) GO TO 86 +C INF64(1) = 2 +C 86 CONTINUE + +C Scaling is permuted to scaling on original matrix for scale factors +C for nonsingular block + K=0 +C Loop is on new indices + DO 3510 I=1,N + IF (PPOS(I).LT.0) THEN + K = K + 1 + FACT(ISCALE-PPOS(I)-1) = ZERO + ELSE + FACT(ISCALE+PPOS(I)-1) = + & SQRT(EXP(FACT(NE64+I-K)+FACT(NE64+N+I-K))) + ENDIF + 3510 CONTINUE +C Compute scaling on nonsingular part +C Remember that PPOS maps from new to original but is flag on new + DO 3516 I = 1,N + KEEP(PERM+ABS(PPOS(I))-1) = I + 3516 CONTINUE +C Looping on new indices + K = 1 + DO 3514 JJ = 1,N + J = PPOS(JJ) + IF (J.GT.0) THEN + DO 3511 JLOOP = 1,KEEP(LROW+JJ-1) + I = IFACT(LIFACT-EXPNE+K) +C I is original index so have to map to new to do PPOS test + INEW = KEEP(PERM+I-1) + IF (PPOS(INEW).LT.0) + & FACT(ISCALE+I-1) = MAX(FACT(ISCALE+I-1), + & ABS(FACT(LLFACT-EXPNE+K))*FACT(ISCALE+J-1)) + K = K + 1 + 3511 CONTINUE + ELSE + DO 3512 JLOOP = 1,KEEP(LROW+JJ-1) + I = IFACT(LIFACT-EXPNE+K) +C I is original index so have to map to new to do PPOS test + INEW = KEEP(PERM+I-1) +C Shouldn't happen otherwise nonsingular block not maximum +C Sorry can happen but entry is implicit zero on diagonal +C Note that J is negative + IF (I .NE. -J) THEN + FACT(ISCALE-J-1) = + & MAX(FACT(ISCALE-J-1), + & ABS(FACT(LLFACT-EXPNE+K))*FACT(ISCALE+I-1)) + ENDIF + K = K + 1 + 3512 CONTINUE + ENDIF + 3514 CONTINUE +C Set scaling factors for singular block and reset PPOS + DO 3513 I = 1,N + INEW = KEEP(PERM+I-1) + IF (PPOS(INEW) .LT. 0) THEN + PPOS(INEW) = - PPOS(INEW) + IF (FACT(ISCALE+I-1) .EQ. ZERO) THEN + FACT(ISCALE+I-1) = ONE + ELSE + FACT(ISCALE+I-1) = ONE/FACT(ISCALE+I-1) + ENDIF + ENDIF + 3513 CONTINUE + ENDIF +C End of logic for singular matrix + +C DO 8888 I = 1, N +C FACT(ISCALE+I-1) = ONE +C8888 CONTINUE + SMAX = FACT(ISCALE) + SMIN = FACT(ISCALE) + DO 5566 I = 1,N + SMAX = MAX(SMAX,FACT(ISCALE+I-1)) + SMIN = MIN(SMIN,FACT(ISCALE+I-1)) + 5566 CONTINUE + RINFO(16) = SMIN + RINFO(17) = SMAX +C Scale matrix + K = 1 + FACT(BIGA) = ZERO + DO 6666 JJ = 1,N + J = PPOS(JJ) + DO 7777 JLOOP = 1,KEEP(LROW+JJ-1) + I = IFACT(LIFACT-EXPNE+K) + FACT(LLFACT-EXPNE+K) = + & FACT(ISCALE+I-1)*FACT(LLFACT-EXPNE+K)*FACT(ISCALE+J-1) + FACT(BIGA) = MAX(FACT(BIGA), ABS(FACT(LLFACT-EXPNE+K))) + K = K + 1 + 7777 CONTINUE + 6666 CONTINUE +C End of scaling + ELSE + RINFO(16) = ONE + RINFO(17) = ONE + ENDIF +C +C********************************** +C Numerical Factorization +C********************************** +C Work arrays FACT(MM1/MM2), KEEP(PERM), IFACT(1) + 22 CALL MA57OD(N, EXPNE, FACT, LLFACT, IFACT, LIFACT, KEEP(LROW), + * PPOS, + * NSTEPS, KEEP(NSTK), KEEP(NODE), FACT(MM1), + * FACT(MM2), + * KEEP(PERM), + * CNTL, ICNTL, + * INFO, RINFO, KEEP(HOLD), FACT(BIGA)) + IF (INFO(1).EQ.10 .OR. INFO(1).EQ.11) THEN + IF (LDIAG.GT.2 .AND. MP.GE.0) THEN + IF (INFO(1).EQ.10) WRITE (MP,99982) INFO(1) +99982 FORMAT (/'Leaving factorization phase (MA57BD) with ...'/ + 1 'Factorization suspended because of lack of real space'/ + 1 'INFO (1) = ',I3) + IF (INFO(1).EQ.11) WRITE (MP,99983) INFO(1) +99983 FORMAT (/'Leaving factorization phase (MA57BD) with ...'/ + 1 'Factorization suspended because of lack of integer space'/ + 1 'INFO (1) = ',I3) + ENDIF + RETURN + ENDIF +C Regenerate array PERM + DO 24 I = 1,N + KEEP(PERM+PPOS(I)-1) = I + 24 CONTINUE +C Compute INFO(17-20) + INFO(17) = ALENB + INFO(17) + INFO(19) = ALENB + INFO(19) +C Allow space for scaling in MA57B/BD + IF (ICNTL(15).EQ.1) THEN + INFO(17) = MAX(INFO(17),ALENB + 3*EXPNE+3*N) + INFO(19) = MAX(INFO(19),ALENB + 3*EXPNE+3*N) + INFO(18) = MAX(INFO(18),3*EXPNE+5*N+1) + INFO(20) = MAX(INFO(20),3*EXPNE+5*N+1) + ENDIF + IF (INFO(1).EQ.-3) GO TO 85 + IF (INFO(1).EQ.-4) GO TO 95 + IF (INFO(1).LT.0) RETURN + GO TO 100 +C************************ +C **** Error returns **** +C************************ + 25 INFO(1) = -1 + INFO(2) = N + IF (LDIAG.GT.0 .AND. LP.GE.0) WRITE (LP,'(A,I3/A,I10)') + + '**** Error return from MA57BD **** INFO(1) =',INFO(1), + + 'N has value ',INFO(2) + RETURN + 30 INFO(1) = -2 + INFO(2) = NE + IF (LDIAG.GT.0 .AND. LP.GE.0) WRITE (LP,'(A,I3/A,I10)') + + '**** Error return from MA57BD **** INFO(1) =',INFO(1), + + 'NE has value',INFO(2) + RETURN + 40 INFO(1) = -15 + INFO(2) = LKEEP + IF (LDIAG.GT.0 .AND. LP.GE.0) WRITE (LP,'(A,I3/A,I10/A,I10)') + + '**** Error return from MA57BD **** INFO(1) =',INFO(1), + + 'LKEEP has value ',INFO(2), + + 'Should be at least ',5*N+NE+MAX(N,NE)+42 + RETURN + 35 INFO(1) = -10 + INFO(2) = ICNTL(7) + IF (LDIAG.GT.0 .AND. LP.GE.0) WRITE (LP,'(A,I3/A,I10)') + + '**** Error return from MA57BD **** INFO(1) =',INFO(1), + + 'ICNTL(7) has value',ICNTL(7) + RETURN + + 85 INFO(1) = -3 + INFO(2) = LFACT + INFO(17) = MAX(INFO(17), ALENB + EXPNE + 1) + IF (ICNTL(15).EQ.1) + * INFO(17) = MAX(INFO(17), ALENB + 3*EXPNE + 3*N) + IF (LDIAG.GT.0 .AND. LP.GE.0) WRITE (LP,'(A,I3/A,I10)') + + '**** Error return from MA57BD **** INFO(1) =',INFO(1), + + 'Insufficient real space in FACT, LFACT = ',INFO(2) + RETURN + + 95 INFO(1) = -4 + INFO(2) = LIFACT + INFO(18) = MAX(INFO(18), EXPNE+N+5) + IF (ICNTL(15).EQ.1) + * INFO(18) = MAX(INFO(18), 3*EXPNE + 5*N + 1) + IF (LDIAG.GT.0 .AND. LP.GE.0) WRITE (LP,'(A,I3/A,I10)') + + '**** Error return from MA57BD **** INFO(1) =',INFO(1), + + 'Insufficient integer space in IFACT, LIFACT = ',INFO(2) + RETURN + +C**************** +C Printing section +C**************** + 100 IF (LDIAG.LE.2 .OR. MP.LT.0) RETURN + WRITE (MP,99980) INFO(1), INFO(2), + * (INFO(I),I=14,25),INFO(28),INFO(29) + WRITE (MP,99984) (INFO(I),I=31,35),RINFO(3), RINFO(4), + * RINFO(5), RINFO(18) +99980 FORMAT (/'Leaving factorization phase (MA57BD) with ...'/ + 1 'INFO (1) =',I12/ + 2 ' --- (2) =',I12/ + 3 ' --- (14) Number of entries in factors =',I12/ + 4 ' --- (15) Real storage for factors =',I12/ + 5 ' --- (16) Integer storage for factors =',I12/ + 6 ' --- (17) Min LFACT with compresses =',I12/ + 7 ' --- (18) Min LIFACT with compresses =',I12/ + 8 ' --- (19) Min LFACT without compresses =',I12/ + 9 ' --- (20) Min LIFACT without compresses =',I12/ + * ' --- (21) Order of largest frontal matrix =',I12/ + 1 ' --- (22) Number of 2x2 pivots =',I12/ + 2 ' --- (23) Number of delayed pivots =',I12/ + 3 ' --- (24) Number of negative eigenvalues =',I12/ + 4 ' --- (25) Rank of factorization =',I12/ + 5 ' --- (28) Number compresses on real data =',I12/ + 6 ' --- (29) Number compresses on integer data =',I12) + IF (ICNTL(15).EQ.1) WRITE (MP,99985) RINFO(16),RINFO(17) +99985 FORMAT ( + 1 'RINFO(16) Minimum value of scaling factor = ',1PD10.3/ + 2 '-----(17) Maximum value of scaling factor = ',1PD10.3) +99984 FORMAT ( + 7 ' --- (31) Number of block pivots in factors =',I12/ + 7 ' --- (32) Number of zeros factors triangle =',I12/ + 7 ' --- (33) Number of zeros factors rectangle =',I12/ + 7 ' --- (34) Number of zero cols factors rect =',I12/ + 7 ' --- (35) Number of static pivots =',I12/ + 1 'RINFO(3) Operations during node assembly = ',1PD10.3/ + 2 '-----(4) Operations during node elimination = ',1PD10.3/ + 3 '-----(5) Extra operations because of BLAS = ',1PD10.3/ + 3 '-----(18) Largest modulus of entry in matrix = ',1PD10.3) +C IF (ICNTL(16).EQ.1) WRITE (MP,99986) INFO(37) +C9986 FORMAT ( +C 1 'INFO(37) Number entries dropped (ICNTL(16)=1) = ',I12) + IF (INFO(27).GT.0) WRITE (MP,99981) INFO(27),RINFO(14),RINFO(15) +99981 FORMAT (/'Matrix modification performed'/ + 1 'INFO (27) Step at which matrix first modified =',I12/ + 2 'RINFO(14) Maximum value added to diagonal = ',1PD10.3/ + 2 'RINFO(15) Smallest pivot in modified matrix = ',1PD10.3) +C Print out matrix factors from MA57BD. + CALL MA57UD(FACT,LFACT,IFACT,LIFACT,ICNTL) +C Print scaling factors + IF (ICNTL(15).NE.1) RETURN + K = MIN(10,N) + IF (LDIAG.GE.4) K = N + WRITE (MP,'(/A/(5D12.5))') 'Scaling factors:', + + (FACT(ISCALE+I-1),I=1,K) + IF (K.LT.N) WRITE (MP,'(16X,A)') ' . . .' + + END + SUBROUTINE MA57CD(JOB,N,FACT,LFACT,IFACT,LIFACT,NRHS,RHS,LRHS,W, + * LW,IW1,ICNTL,INFO) +C This subroutine uses the factorisation of the matrix in FACT,IFACT to +C solve a system of equations. + INTEGER JOB,N,LFACT + DOUBLE PRECISION FACT(LFACT) + INTEGER LIFACT,IFACT(LIFACT),NRHS,LRHS,LW + DOUBLE PRECISION W(LW),RHS(LRHS,NRHS) + INTEGER IW1(N),ICNTL(20),INFO(40) +C JOB must be set by the user to determine the coefficient matrix +C of the equations being solved. If the factorization is +C T T +C A = P L D L P +C then coefficient matrix is: +C +C JOB <= 1 A +C T +C JOB = 2 P L P +C T +C JOB = 3 P D P +C T T +C JOB >= 4 P L P +C +C N must be set to the order of the matrix and must be unchanged since +C the call to MA57BD. It is not altered. +C FACT holds information on the factors and must be unchanged since +C the call to MA57BD. It is not altered by MA57CD. +C LFACT must be set to the length of FACT. It is not altered. +C IFACT holds information on the factors and must be unchanged since +C the call to MA57BD. It is not altered by MA57CD. +C LIFACT must be set to the length of IFACT. It is not altered. +C NRHS is the number of right-hand sides being solved for. +C RHS must be set to the right hand sides for the equations being +C solved. On exit, this array will hold the solutions. +C LHS must be set to the leading dimension of array RHS. +C W is used as a work array. +C LW must be set to the length of array W. It must be at least +C as large as N*NRHS. (Actually only INFO(21)*NRHS but no way to +C check this). +C IW1 is used as a work array. +C ICNTL must be set by the user as follows and is not altered. +C ICNTL(1) must be set to the stream number for error messages. +C A value less than 0 suppresses output. +C ICNTL(2) must be set to the stream number for warning output. +C A value less than 0 suppresses output. +C ICNTL(3) must be set to the stream number for monitor output. +C A value less than 0 suppresses output. +C ICNTL(4) must be set to the stream number for statistics output. +C A value less than 0 suppresses output. +C ICNTL(5) must be set to control the amount of output: +C 0 None. +C 1 Error messages only. +C 2 Error and warning messages. +C 3 As 2, plus scalar parameters and a few entries of array +C parameters on entry and exit. +C > 3 As 2, plus all parameters on entry and exit. +C ICNTL(6:12) Not referenced. +C ICNTL(13) Threshold on number of columns in a block for direct +C addressing using Level 2 and Level 3 BLAS. + +C Procedures + INTRINSIC MIN + EXTERNAL MA57QD,MA57RD,MA57SD,MA57TD,MA57UD,MA57XD,MA57YD + +C +C Local variables + DOUBLE PRECISION SCALE,ONE + PARAMETER (ONE = 1.0D0) + INTEGER I,J,K,LDIAG,LLW,LP,MP,ISCALE +C I Temporary variable. +C J Temporary variable. +C K Temporary variable. +C LDIAG Control for amount of information output. +C LP Stream number for error printing. + +C C MP Stream number for monitor printing. +C + +C Set local print control variables + LP = ICNTL(1) + MP = ICNTL(3) + LDIAG = ICNTL(5) + + INFO(1) = 0 + +C Check input data + IF (N.LE.0) THEN + INFO(1) = -1 + INFO(2) = N + IF (LDIAG.GT.0 .AND. LP.GE.0) WRITE (LP,'(A,I3/A,I10)') + + '**** Error return from MA57CD **** INFO(1) =',INFO(1), + + 'N has value',N + GOTO 500 + ENDIF + + IF (NRHS.LT.1) THEN + INFO(1) = -16 + INFO(2) = NRHS + IF (LDIAG.GT.0 .AND. LP.GE.0) WRITE (LP,'(A,I4/A,I10,A)') + + '**** Error return from MA57CD **** INFO(1) =',INFO(1), + + 'value of NRHS =',NRHS,' is less than 1' + GOTO 500 + ENDIF + + IF (LRHS.LT.N) THEN + INFO(1) = -11 + INFO(2) = LRHS + IF (LDIAG.GT.0 .AND. LP.GE.0) WRITE (LP,'(A,I4/A,I10,A,I10)') + + '**** Error return from MA57CD **** INFO(1) =',INFO(1), + + 'value of LRHS =',LRHS,' is less than N=',N + GOTO 500 + ENDIF + + IF (LW.LT.N*NRHS) THEN + INFO(1) = -17 + INFO(2) = N*NRHS + IF (LDIAG.GT.0 .AND. LP.GE.0) WRITE (LP,'(A,I4/A,I10,A,I10)') + + '**** Error return from MA57CD **** INFO(1) =',INFO(1), + + 'value of LW =',LW,' is less than', N*NRHS + GOTO 500 + ENDIF + +C If requested, print input parameters + IF (LDIAG.GE.3 .AND. MP.GE.0) THEN + WRITE (MP,99999) JOB,N,(ICNTL(I),I=1,5),LFACT,LIFACT,NRHS, + + LRHS,LW,ICNTL(13) +99999 FORMAT(/'Entering solution phase (MA57CD) with ...'/ + + 'JOB Control on coefficient matrix =',I12/ + + 'N Order of matrix =',I12/ + 6 'ICNTL(1) Stream for errors =',I12/ + 7 ' --- (2) Stream for warnings =',I12/ + 8 ' --- (3) Stream for monitoring =',I12/ + 9 ' --- (4) Stream for statistics =',I12/ + 1 ' --- (5) Level of diagnostic printing =',I12/ + + 'LFACT Length of array FACT =',I12/ + + 'LIFACT Length of array IFACT =',I12/ + + 'NRHS Number of right-hand sides =',I12/ + + 'LRHS Leading dimension of RHS array =',I12/ + + 'LW Leading dimension of work array =',I12/ + + 'ICNTL(13) Threshold for Level 2 and 3 BLAS =',I12) + +C Print out matrix factors. + CALL MA57UD(FACT,LFACT,IFACT,LIFACT,ICNTL) +C Print scaling factors + IF (ICNTL(15).EQ.1) THEN + ISCALE = LFACT-N + K = MIN(10,N) + IF (LDIAG.GE.4) K = N + WRITE (MP,'(/A/(5D12.5))') 'Scaling factors:', + + (FACT(ISCALE+I-1),I=1,K) + IF (K.LT.N) WRITE (MP,'(16X,A)') ' . . .' + ENDIF + K = MIN(10,N) + IF (LDIAG.GE.4) K = N + DO 10 J = 1,NRHS + WRITE(MP,'(/A,I10)') 'Right-hand side',J + WRITE (MP,'((1P,5D13.3))') (RHS(I,J),I=1,K) + IF (K.LT.N) WRITE (MP,'(A)') ' . . .' + 10 CONTINUE + END IF + + LLW = LW/NRHS + + +C Scale right-hand side + IF (ICNTL(15).EQ.1) THEN + ISCALE = LFACT-N + DO 5555 I = 1, N + SCALE = FACT(ISCALE+I-1) + IF (JOB.GE.4) SCALE = ONE/FACT(ISCALE+I-1) + DO 4444 J = 1, NRHS + RHS(I,J) = SCALE*RHS(I,J) + 4444 CONTINUE + 5555 CONTINUE + ENDIF + +C Forward substitution + IF (JOB.LE.2) THEN + IF (NRHS.EQ.1) THEN + CALL MA57XD(N,FACT,LFACT,IFACT,LIFACT,RHS,LRHS, + * W,LLW,IW1,ICNTL) + ELSE + CALL MA57QD(N,FACT,LFACT,IFACT,LIFACT,NRHS,RHS,LRHS, + * W,LLW,IW1,ICNTL) + ENDIF + IF (JOB.EQ.2) GO TO 15 +C Back substitution. + IF (NRHS.EQ.1) THEN + CALL MA57YD(N,FACT,LFACT,IFACT,LIFACT,RHS,LRHS, + * W,LLW,IW1,ICNTL) + ELSE + CALL MA57RD(N,FACT,LFACT,IFACT,LIFACT,NRHS,RHS,LRHS, + * W,LLW,IW1,ICNTL) + ENDIF + ENDIF + IF (JOB.EQ.3) + * CALL MA57SD(FACT,LFACT,IFACT,LIFACT,NRHS,RHS,LRHS, + * W,LLW,ICNTL) + IF (JOB.GE.4) + * CALL MA57TD(N,FACT,LFACT,IFACT,LIFACT,NRHS,RHS,LRHS, + * W,LLW,IW1,ICNTL) + +C Scale solution + 15 IF (ICNTL(15).EQ.1) THEN + ISCALE = LFACT-N + DO 6666 I = 1, N + SCALE = FACT(ISCALE+I-1) + IF (JOB.EQ.2) SCALE = ONE/FACT(ISCALE+I-1) + DO 7777 J = 1, NRHS + RHS(I,J) = SCALE*RHS(I,J) + 7777 CONTINUE + 6666 CONTINUE + ENDIF + +C +C If requested, print output parameters. + IF (LDIAG.GE.3 .AND. MP.GE.0) THEN + WRITE (MP,'(//A)') + * 'Leaving solution phase (MA57CD) with ...' + DO 20 J = 1,NRHS + WRITE(MP,'(/A,I10)') 'Solution ',J + WRITE (MP,'(1P,5D13.3)') (RHS(I,J),I=1,K) + IF (K.LT.N) WRITE (MP,'(A)') ' . . .' + 20 CONTINUE + ENDIF + + 500 RETURN + + END + + + SUBROUTINE MA57QD(N,FACT,LFACT,IFACT,LIFACT,NRHS,RHS,LRHS, + * W,LW,IW1,ICNTL) +C This subroutine performs forward elimination using the factors +C stored in FACT/IFACT by MA57BD. + INTEGER N,LFACT + DOUBLE PRECISION FACT(LFACT) + INTEGER LIFACT,IFACT(LIFACT),NRHS,LRHS,LW + DOUBLE PRECISION W(LW,NRHS),RHS(LRHS,NRHS) + INTEGER IW1(N),ICNTL(20) +C N must be set to the order of the matrix. It is not altered. +C FACT must be set to hold the real values corresponding to the +C factors. This must be unchanged since the preceding call to +C MA57BD. It is not altered. +C LFACT length of array FACT. It is not altered. +C IFACT holds the integer indexing information for the matrix factors +C in FACT. This must be unchanged since the preceding call to +C MA57BD. It is not altered. +C LIFACT length of array IFACT. It is not altered. +C NRHS must be set to number of right-hand sides. +C RHS on input, must be set to hold the right hand side vector. On +C return, it will hold the modified vector following forward +C elimination. +C LHS must be set to the leading dimension of array RHS. +C W used as workspace to hold the components of the right hand +C sides corresponding to current block pivotal rows. +C LW must be set as the leading dimension of array W. It need not be +C larger than INFO(21) as returned from MA57BD. +C IW1 need not be set on entry. On exit IW1(I) (I = 1,NBLK), where +C NBLK = IFACT(3) is the number of block pivots, will +C hold pointers to the beginning of each block pivot in array IFACT. +C ICNTL Not referenced except: +C ICNTL(13) Threshold on number of columns in a block for using +C addressing using Level 2 and Level 3 BLAS. +C + +C Procedures + INTRINSIC ABS + EXTERNAL DGEMM,DTPSV + +C Constant + DOUBLE PRECISION ONE + PARAMETER (ONE=1.0D0) +C +C Local variables + INTEGER APOS,I,IBLK,II,IPIV,IRHS,IWPOS,J,J1,J2,K, + + NCOLS,NROWS + DOUBLE PRECISION W1 +C +C APOS Current position in array FACT. +C I Temporary DO index +C IBLK Index of block pivot. +C II Temporary index. +C IPIV Pivot index. +C IRHS RHS index. +C IWPOS Position in IFACT of start of current index list. +C J Temporary DO index +C K Temporary pointer to position in real array. +C J1 Position in IFACT of index of leading entry of row. +C J2 Position in IFACT of index of trailing entry of row. +C NCOLS Number of columns in the block pivot. +C NROWS Number of rows in the block pivot. +C W1 RHS value. + + APOS = 1 + IWPOS = 4 + DO 270 IBLK = 1,IFACT(3) + +C Find the number of rows and columns in the block. + IW1(IBLK) = IWPOS + NCOLS = IFACT(IWPOS) + NROWS = IFACT(IWPOS+1) + IWPOS = IWPOS + 2 + + IF (NROWS.GT.4 .AND. NCOLS.GT.ICNTL(13)) THEN + +C Perform operations using direct addressing. + +C Load appropriate components of right-hand sides into W. + DO 10 I = 1,NCOLS + II = ABS(IFACT(IWPOS+I-1)) + DO 11 J = 1,NRHS + W(I,J) = RHS(II,J) + 11 CONTINUE + 10 CONTINUE + + +C Treat diagonal block (direct addressing) + DO 12 J = 1,NRHS + CALL DTPSV('L','N','U',NROWS,FACT(APOS),W(1,J),1) + 12 CONTINUE + APOS = APOS + (NROWS* (NROWS+1))/2 + +C Treat off-diagonal block (direct addressing) + IF (NCOLS.GT.NROWS) CALL DGEMM('N','N',NCOLS-NROWS,NRHS,NROWS, + + ONE,FACT(APOS),NCOLS-NROWS, + + W,LW,ONE,W(NROWS+1,1),LW) + APOS = APOS + NROWS* (NCOLS-NROWS) + +C Reload W back into RHS. + DO 35 I = 1,NCOLS + II = ABS(IFACT(IWPOS+I-1)) + DO 36 J = 1,NRHS + RHS(II,J) = W(I,J) + 36 CONTINUE + 35 CONTINUE + + ELSE + +C Perform operations using indirect addressing. + + J1 = IWPOS + J2 = IWPOS + NROWS - 1 + + +C Treat diagonal block (indirect addressing) + DO 130 IPIV = 1,NROWS + APOS = APOS + 1 + DO 101 II = 1,NRHS + W1 = RHS(ABS(IFACT(J1)),II) + K = APOS + DO 100 J = J1+1,J2 + IRHS = ABS(IFACT(J)) + RHS(IRHS,II) = RHS(IRHS,II) - FACT(K)*W1 + K = K + 1 + 100 CONTINUE + 101 CONTINUE + APOS = K + J1 = J1 + 1 + 130 CONTINUE + +C Treat off-diagonal block (indirect addressing) + J2 = IWPOS + NCOLS - 1 + DO 136 IPIV = 1,NROWS + DO 135 II = 1,NRHS + K = APOS + W1 = RHS(ABS(IFACT(IWPOS+IPIV-1)),II) + DO 133 J = J1,J2 + IRHS = ABS(IFACT(J)) + RHS(IRHS,II) = RHS(IRHS,II) + W1*FACT(K) + K = K + 1 + 133 CONTINUE + 135 CONTINUE + APOS = K + 136 CONTINUE + + END IF + + IWPOS = IWPOS + NCOLS + 270 CONTINUE + + END + + + SUBROUTINE MA57RD(N,FACT,LFACT,IFACT,LIFACT,NRHS,RHS,LRHS, + * W,LW,IW1,ICNTL) +C This subroutine performs backward elimination operations +C using the factors stored in FACT/IFACT by MA57BD. + INTEGER N,LFACT + DOUBLE PRECISION FACT(LFACT) + INTEGER LIFACT,IFACT(LIFACT),NRHS,LRHS,LW + DOUBLE PRECISION W(LW,NRHS),RHS(LRHS,NRHS) + INTEGER IW1(N),ICNTL(20) +C N must be set to the order of the matrix. It is not altered. +C FACT must be set to hold the real values corresponding to the +C factors. This must be unchanged since the +C preceding call to MA57BD. It is not altered. +C LFACT length of array FACT. It is not altered. +C IFACT holds the integer indexing information for the matrix factors +C in FACT. This must be unchanged since the preceding call to +C MA57BD. It is not altered. +C LIFACT length of array IFACT. It is not altered. +C NRHS must be set to number of right-hand sides. +C RHS on entry, must be set to hold the right hand side modified by +C the forward substitution operations. On exit, holds the +C solution vector. +C LHS must be set to the leading dimension of array RHS. +C W used as workspace to hold the components of the right hand +C sides corresponding to current block pivotal rows. +C LW must be set as the leading dimension of array W. It need not be +C larger than INFO(21) as returned from MA57BD. +C IW1 on entry IW1(I) (I = 1,NBLK), where NBLK = IFACT(3) is the +C number of block pivots, must hold pointers to the beginning of +C each block pivot in array IFACT, as set by MA57Q/QD. +C It is not altered. +C ICNTL Not referenced except: +C ICNTL(13) Threshold on number of columns in a block for using +C addressing using Level 2 and Level 3 BLAS. + +C Procedures + INTRINSIC ABS + EXTERNAL DGEMM,DTPSV + +C Constants + DOUBLE PRECISION ONE + PARAMETER (ONE=1.0D0) +C +C Local variables. + INTEGER APOS,APOS2,I,IBLK,II,IPIV,IRHS,IRHS1, + + IRHS2,IWPOS,J,JPIV,J1,J2,K,KK,LROW,NCOLS,NROWS + DOUBLE PRECISION W1 +C APOS Current position in array FACT. +C APOS2 Current position in array FACT for off-diagonal entry of 2x2 +C pivot. +C I Temporary DO index +C IBLK Index of block pivot. +C II Temporary index. +C IPIV Pivot index. +C IRHS RHS index. +C IRHS1 RHS index. +C IRHS2 RHS index. +C IWPOS Position in IFACT of start of current index list. +C J Temporary DO index +C JPIV Has the value -1 for the first row of a 2 by 2 pivot and 1 for +C the second. +C K Temporary pointer to position in real array. +C J1 Position in IFACT of index of leading entry of row. +C J2 Position in IFACT of index of trailing entry of row. +C K Temporary variable. +C LROW Length of current row. +C NCOLS Number of columns in the block pivot. +C NROWS Number of rows in the block pivot. +C W1 RHS value. +C + APOS = IFACT(1) + APOS2 = IFACT(2) +C Run through block pivot rows in the reverse order. + DO 380 IBLK = IFACT(3),1,-1 + +C Find the number of rows and columns in the block. + IWPOS = IW1(IBLK) + NCOLS = ABS(IFACT(IWPOS)) + NROWS = ABS(IFACT(IWPOS+1)) + APOS = APOS - NROWS* (NCOLS-NROWS) + IWPOS = IWPOS + 2 + + IF (NROWS.GT.4 .AND. NCOLS.GT.ICNTL(13)) THEN + +C Perform operations using direct addressing. + +C Load latter part of right-hand side into W. + DO 5 I = NROWS + 1,NCOLS + II = ABS(IFACT(IWPOS+I-1)) + DO 3 J = 1,NRHS + W(I,J) = RHS(II,J) + 3 CONTINUE + 5 CONTINUE + + +C Multiply by the diagonal matrix (direct addressing) + DO 10 IPIV = NROWS,1,-1 + IRHS = ABS(IFACT(IWPOS+IPIV-1)) + APOS = APOS - (NROWS+1-IPIV) + DO 9 J = 1,NRHS + W(IPIV,J) = RHS(IRHS,J)*FACT(APOS) + 9 CONTINUE + 10 CONTINUE + JPIV = -1 + DO 20 IPIV = NROWS,1,-1 + IRHS = IFACT(IWPOS+IPIV-1) + IF (IRHS.LT.0) THEN + IRHS1 = -IFACT(IWPOS+IPIV-1+JPIV) + DO 19 J = 1,NRHS + W(IPIV,J) = RHS(IRHS1,J)*FACT(APOS2) + W(IPIV,J) + 19 CONTINUE + IF (JPIV.EQ.1) APOS2 = APOS2 - 1 + JPIV = -JPIV + END IF + + 20 CONTINUE + +C Treat off-diagonal block (direct addressing) + K = NCOLS - NROWS + IF (K.GT.0) CALL DGEMM('T','N',NROWS,NRHS,K,ONE, + + FACT(APOS+(NROWS*(NROWS+1))/2),K, + + W(NROWS+1,1),LW,ONE,W,LW) + +C Treat diagonal block (direct addressing) + DO 22 J = 1,NRHS + CALL DTPSV('L','T','U',NROWS,FACT(APOS),W(1,J),1) + 22 CONTINUE +C Reload W back into RHS. + DO 60 I = 1,NROWS + II = ABS(IFACT(IWPOS+I-1)) + DO 59 J = 1,NRHS + RHS(II,J) = W(I,J) + 59 CONTINUE + 60 CONTINUE + + ELSE +C +C Perform operations using indirect addressing. + J1 = IWPOS + J2 = IWPOS + NCOLS - 1 + + +C Multiply by the diagonal matrix (indirect addressing) + JPIV = -1 + DO 210 IPIV = NROWS,1,-1 + IRHS = IFACT(IWPOS+IPIV-1) + LROW = NROWS + 1 - IPIV + + IF (IRHS.GT.0) THEN +C 1 by 1 pivot. + APOS = APOS - LROW + DO 65 J = 1,NRHS + RHS(IRHS,J) = RHS(IRHS,J)*FACT(APOS) + 65 CONTINUE + ELSE +C 2 by 2 pivot + IF (JPIV.EQ.-1) THEN + IRHS1 = -IFACT(IWPOS+IPIV-2) + IRHS2 = -IRHS + APOS = APOS - LROW - LROW - 1 + DO 68 J = 1,NRHS + W1 = RHS(IRHS1,J)*FACT(APOS) + + + RHS(IRHS2,J)*FACT(APOS2) + RHS(IRHS2,J) = RHS(IRHS1,J)*FACT(APOS2) + + + RHS(IRHS2,J)*FACT(APOS+LROW+1) + RHS(IRHS1,J) = W1 + 68 CONTINUE + APOS2 = APOS2 - 1 + END IF + JPIV = -JPIV + END IF + + 210 CONTINUE + APOS = APOS + (NROWS* (NROWS+1))/2 + +C Treat off-diagonal block (indirect addressing) + KK = APOS + J1 = IWPOS + NROWS + DO 220 IPIV = 1,NROWS + IRHS = ABS(IFACT(IWPOS+IPIV-1)) + DO 218 II = 1,NRHS + W1 = RHS(IRHS,II) + K = KK + DO 215 J = J1,J2 + W1 = W1 + FACT(K)*RHS(ABS(IFACT(J)),II) + K = K + 1 + 215 CONTINUE + RHS(IRHS,II) = W1 + 218 CONTINUE + KK = K + 220 CONTINUE + +C Treat diagonal block (indirect addressing) + J2 = IWPOS + NROWS - 1 + DO 260 IPIV = 1,NROWS + IRHS = ABS(IFACT(J1-1)) + APOS = APOS - IPIV + DO 240 II = 1,NRHS + W1 = RHS(IRHS,II) + K = APOS + 1 + DO 230 J = J1,J2 + W1 = W1 - FACT(K)*RHS(ABS(IFACT(J)),II) + K = K + 1 + 230 CONTINUE + RHS(IRHS,II) = W1 + 240 CONTINUE + J1 = J1 - 1 + 260 CONTINUE + + END IF + + 380 CONTINUE + + END + + SUBROUTINE MA57UD(FACT,LFACT,IFACT,LIFACT,ICNTL) +C Print out matrix factors from MA57BD or a symbolic representation +C of them. + INTEGER LFACT + DOUBLE PRECISION FACT(LFACT) + INTEGER LIFACT,IFACT(LIFACT),ICNTL(20) +C FACT array holding the reals of the factorization. +C It is not altered. +C LFACT length of array FACT. It is not altered. +C IFACT array holding the integers of the factorization. It is not +C altered. +C LIFACT length of array IFACT. It is not altered. +C ICNTL is not referenced except: +C ICNTL(3) must be set to the stream number for diagnostic output. +C A value less than 1 suppresses output. +C ICNTL(5) must be set to control the amount of output: +C <3 None. +C 3 First block only. +C 4 All blocks. +C 5 All blocks, but each entry represented by a single character: +C + for a positive integer +C - for a negative integer +C * for a nonzero entry +C . for a zero entry + +C Procedures + INTRINSIC MIN,SIGN + +C Local variables + CHARACTER*72 LINE + INTEGER APOS,APOS2,IBLK,ILINE,IROW,IWPOS,J,JPIV,J1,J2,K, + + LDIAG,LEN,MP,NBLK,NCOLS,NROWS +C APOS Current position in FACT. +C APOS2 Position in FACT of next off-diagonal entry of 2x2 pivot. +C ILINE Current position in the line. +C IBLK Current block. +C IROW Current row. +C IWPOS Current position in IFACT. +C JPIV has value 1 only for the first row of a 2x2 pivot. +C J Column index. +C K Temporary pointer to position in real array. +C J1 Position of last zero in leading part of row. +C J2 Position of last nonzero in leading part of row. +C K Temporary DO index. +C LDIAG Control for diagnostic printing. +C LEN 1 if pattern only to be printed and 12 if values to be printed. +C LINE Character variable in which an output line is built. +C MP Stream number for warning or diagnostic messages +C NBLK Number of blocks to be printed. +C NCOLS Number of columns in the block. +C NROWS Number of rows in the block. + + CHARACTER*1 PM(-2:2) + DATA PM/'*','-','.','+','.'/ + DOUBLE PRECISION ZERO + PARAMETER (ZERO=0.0D0) + +C Initialize MP and LDIAG + MP = ICNTL(3) + LDIAG = ICNTL(5) + + APOS2 = IFACT(1) + NBLK = IFACT(3) + IF (LDIAG.EQ.3) NBLK = MIN(1,NBLK) + LEN = 12 + IF (LDIAG.EQ.5) LEN = 1 + IF (LEN.EQ.12) THEN + IF (NBLK.EQ.IFACT(3)) THEN + WRITE (MP,'(/A)') + + 'For each block, the following information is provided:' + + ELSE + WRITE (MP,'(/A,A)') 'For the first block only,', + + ' the following information is provided:' + END IF + + END IF + + IF (LEN.EQ.12) WRITE (MP,'(A)') + + ' 1. Block number, number of rows, number of columns', + + ' 2. List of indices for the pivot, each negated if part of' + + ,' a 2x2 pivot', + + ' 3. The factorized block pivot', + + ' It has the form', + + ' -1 T', + + ' L D L ', + + ' -1 T', + + ' and is printed as D and L packed together.', + + ' 4. List of indices for the non-pivot columns', + + ' 5. The non-pivot part as rectangular block by rows' + + IWPOS = 4 + APOS = 1 + + DO 300 IBLK = 1,NBLK + NCOLS = IFACT(IWPOS) + NROWS = IFACT(IWPOS+1) + IWPOS = IWPOS + 2 + + WRITE (MP,'(/4(A,I6))') 'Block pivot',IBLK,' with',NROWS, + + ' rows and', NCOLS,' columns' + IF (LEN.EQ.12) WRITE (MP,'(6I12)') + + (IFACT(K),K=IWPOS,IWPOS+NROWS-1) + IF (LEN.EQ.1) WRITE (MP,'(72A1)') (PM(SIGN(1,IFACT(K))), + + K=IWPOS,IWPOS+NROWS-1) + + JPIV = 0 + DO 30 IROW = 1,NROWS + IF (JPIV.EQ.1) THEN + JPIV = 0 + ELSE + IF (IFACT(IWPOS+IROW-1).LT.0) JPIV = 1 + END IF + + ILINE = 1 + DO 10 J = 1,IROW - 1 + WRITE (LINE(ILINE:ILINE+LEN-1),'(A)') ' ' + ILINE = ILINE + LEN + IF (ILINE.GT.72) THEN + WRITE (MP,'(A)') LINE + ILINE = 1 + END IF + 10 CONTINUE + + DO 20 J = IROW,NROWS + IF (LEN.EQ.12) WRITE (LINE(ILINE:ILINE+11), + + '(1P,D12.4)') FACT(APOS) + IF (LEN.EQ.1) THEN + IF (FACT(APOS).EQ.ZERO) THEN + WRITE (LINE(ILINE:ILINE),'(A)') '.' + ELSE + WRITE (LINE(ILINE:ILINE),'(A)') '*' + END IF + END IF + APOS = APOS + 1 + IF (J.EQ.IROW+1) THEN + IF (JPIV.EQ.1) THEN + IF (LEN.EQ.12) WRITE (LINE(ILINE:ILINE+11), + + '(1P,D12.4)') FACT(APOS2) + IF (LEN.EQ.1) THEN + IF (FACT(APOS2).EQ.ZERO) THEN + WRITE (LINE(ILINE:ILINE),'(A)') '.' + ELSE + WRITE (LINE(ILINE:ILINE),'(A)') '*' + END IF + END IF + APOS2 = APOS2 + 1 + END IF + END IF + ILINE = ILINE + LEN + IF (ILINE.GT.72) THEN + WRITE (MP,'(A)') LINE + ILINE = 1 + END IF + 20 CONTINUE + + IF (ILINE.GT.1) THEN + LINE(ILINE:) = ' ' + WRITE (MP,'(A)') LINE + END IF + + 30 CONTINUE + + IWPOS = IWPOS + NROWS + IF (LEN.EQ.12) WRITE (MP,'(6I12)') (IFACT(K),K=IWPOS, + + IWPOS+NCOLS-NROWS-1) + IF (LEN.EQ.1) WRITE (MP,'(72A1)') (PM(SIGN(1,IFACT(K))), + + K=IWPOS,IWPOS+NCOLS-NROWS-1) + + IWPOS = IWPOS + NCOLS - NROWS + DO 280 IROW = 1,NROWS + J1 = NROWS + J2 = NCOLS + ILINE = 1 + DO 110 J = J1 + 1,J2 + IF (LEN.EQ.12) WRITE (LINE(ILINE:ILINE+11), + + '(1P,D12.4)') FACT(APOS) + IF (LEN.EQ.1) THEN + IF (FACT(APOS).EQ.ZERO) THEN + WRITE (LINE(ILINE:ILINE),'(A)') '.' + ELSE + WRITE (LINE(ILINE:ILINE),'(A)') '*' + END IF + END IF + APOS = APOS + 1 + ILINE = ILINE + LEN + IF (ILINE.GT.72) THEN + WRITE (MP,'(A)') LINE + ILINE = 1 + END IF + 110 CONTINUE + + IF (ILINE.GT.1) THEN + LINE(ILINE:) = ' ' + WRITE (MP,'(A)') LINE + END IF + + 280 CONTINUE + 300 CONTINUE + END + + SUBROUTINE MA57SD(FACT,LFACT,IFACT,LIFACT,NRHS,RHS,LRHS, + * W,LW,ICNTL) +C This subroutine divides a vector by the block diagonal matrix of +C the matrix factors using factor entries stored in FACT/IFACT +C by MA57BD. + INTEGER LFACT + DOUBLE PRECISION FACT(LFACT) + INTEGER LIFACT,IFACT(LIFACT),NRHS,LRHS,LW + DOUBLE PRECISION W(LW,NRHS),RHS(LRHS,NRHS) + INTEGER ICNTL(20) +C FACT must be set to hold the real values corresponding to the +C factors. This must be unchanged since the +C preceding call to MA57BD. It is not altered. +C LFACT length of array FACT. It is not altered. +C IFACT holds the integer indexing information for the matrix factors +C in FACT. This must be unchanged since the preceding call to +C MA57BD. It is not altered. +C LIFACT length of array IFACT. It is not altered. +C NRHS must be set to number of right-hand sides. +C RHS on entry, must be set to hold the right hand side modified by +C the forward substitution operations. On exit, holds the +C solution vector. +C LHS must be set to the leading dimension of array RHS. +C W used as workspace to hold the components of the right hand +C sides corresponding to current block pivotal rows. +C LW must be set as the leading dimension of array W. It need not be +C larger than INFO(21) as returned from MA57BD. +C ICNTL Not referenced except: +C ICNTL(13) Threshold on number of columns in a block for direct +C addressing using Level 2 and Level 3 BLAS. + +C Procedures + INTRINSIC ABS + EXTERNAL DGEMM,DTPSV + +C +C Local variables. + INTEGER APOS,APOS2,I,IBLK,II,IPIV,IRHS,IRHS1, + + IRHS2,IWPOS,J,JPIV,NCOLS,NROWS + DOUBLE PRECISION W1 +C APOS Current position in array FACT. +C APOS2 Current position in array FACT for off-diagonal entry of 2x2 +C pivot. +C I Temporary DO index +C IBLK Index of block pivot. +C II Temporary index. +C IPIV Pivot index. +C IRHS RHS index. +C IRHS1 RHS index. +C IRHS2 RHS index. +C IWPOS Position in IFACT of start of current index list. +C J Temporary DO index +C JPIV Has the value 1 for the first row of a 2 by 2 pivot and -1 for +C the second. +C K Temporary pointer to position in real array. +C NCOLS Number of columns in the block pivot. +C NROWS Number of rows in the block pivot. +C W1 RHS value. +C + APOS = 1 + APOS2 = IFACT(1) + IWPOS = 4 +C Run through block pivot rows in the reverse order. + DO 380 IBLK = 1,IFACT(3) + +C Find the number of rows and columns in the block. + NCOLS = IFACT(IWPOS) + NROWS = IFACT(IWPOS+1) + IWPOS = IWPOS + 2 + + IF (NROWS.GT.4 .AND. NCOLS.GT.ICNTL(13)) THEN + +C Perform operations using direct addressing. + +C Multiply by the diagonal matrix (direct addressing) + DO 10 IPIV = 1,NROWS + IRHS = ABS(IFACT(IWPOS+IPIV-1)) + DO 9 J = 1,NRHS + W(IPIV,J) = RHS(IRHS,J)*FACT(APOS) + 9 CONTINUE + APOS = APOS + (NROWS+1-IPIV) + 10 CONTINUE + JPIV = 1 + DO 20 IPIV = 1,NROWS + IRHS = IFACT(IWPOS+IPIV-1) + IF (IRHS.LT.0) THEN + IRHS1 = -IFACT(IWPOS+IPIV-1+JPIV) + DO 19 J = 1,NRHS + W(IPIV,J) = RHS(IRHS1,J)*FACT(APOS2) + W(IPIV,J) + 19 CONTINUE + IF (JPIV.EQ.-1) APOS2 = APOS2 + 1 + JPIV = -JPIV + END IF + + 20 CONTINUE + +C Reload W back into RHS. + DO 60 I = 1,NROWS + II = ABS(IFACT(IWPOS+I-1)) + DO 59 J = 1,NRHS + RHS(II,J) = W(I,J) + 59 CONTINUE + 60 CONTINUE + + ELSE +C +C Perform operations using indirect addressing. + +C Multiply by the diagonal matrix (indirect addressing) + JPIV = 1 + DO 210 IPIV = 1,NROWS + IRHS = IFACT(IWPOS+IPIV-1) + + IF (IRHS.GT.0) THEN +C 1 by 1 pivot. + DO 65 J = 1,NRHS + RHS(IRHS,J) = RHS(IRHS,J)*FACT(APOS) + 65 CONTINUE + APOS = APOS + NROWS - IPIV + 1 + ELSE +C 2 by 2 pivot + IF (JPIV.EQ.1) THEN + IRHS1 = -IRHS + IRHS2 = -IFACT(IWPOS+IPIV) + DO 68 J = 1,NRHS + W1 = RHS(IRHS1,J)*FACT(APOS) + + + RHS(IRHS2,J)*FACT(APOS2) + RHS(IRHS2,J) = RHS(IRHS1,J)*FACT(APOS2) + + + RHS(IRHS2,J)*FACT(APOS+NROWS-IPIV+1) + RHS(IRHS1,J) = W1 + 68 CONTINUE + APOS2 = APOS2 + 1 + END IF + JPIV = -JPIV + APOS = APOS + NROWS - IPIV + 1 + END IF + + 210 CONTINUE + + END IF + + IWPOS = IWPOS + NCOLS + APOS = APOS + NROWS*(NCOLS-NROWS) + + 380 CONTINUE + + END + + SUBROUTINE MA57TD(N,FACT,LFACT,IFACT,LIFACT,NRHS,RHS,LRHS, + * W,LW,IW1,ICNTL) +C This subroutine performs backward elimination operations +C using the factors stored in FACT/IFACT by MA57BD. + INTEGER N,LFACT + DOUBLE PRECISION FACT(LFACT) + INTEGER LIFACT,IFACT(LIFACT),NRHS,LRHS,LW + DOUBLE PRECISION W(LW,NRHS),RHS(LRHS,NRHS) + INTEGER IW1(N),ICNTL(20) +C N must be set to the order of the matrix. It is not altered. +C FACT must be set to hold the real values corresponding to the +C factors. This must be unchanged since the +C preceding call to MA57BD. It is not altered. +C LFACT length of array FACT. It is not altered. +C IFACT holds the integer indexing information for the matrix factors +C in FACT. This must be unchanged since the preceding call to +C MA57BD. It is not altered. +C LIFACT length of array IFACT. It is not altered. +C NRHS must be set to number of right-hand sides. +C RHS on entry, must be set to hold the right hand side modified by +C the forward substitution operations. On exit, holds the +C solution vector. +C LHS must be set to the leading dimension of array RHS. +C W used as workspace to hold the components of the right hand +C sides corresponding to current block pivotal rows. +C LW must be set as the leading dimension of array W. It need not be +C larger than INFO(21) as returned from MA57BD. +C IW1 on entry IW1(I) (I = 1,NBLK), where NBLK = IFACT(3) is the +C number of block pivots, must hold pointers to the beginning of +C each block pivot in array IFACT, as set by MA57Q\QD. +C It is not altered. +C ICNTL Not referenced except: +C ICNTL(13) Threshold on number of columns in a block for direct +C addressing using Level 2 and Level 3 BLAS. + +C Procedures + INTRINSIC ABS + EXTERNAL DGEMM,DTPSV + +C Constants + DOUBLE PRECISION ONE + PARAMETER (ONE=1.0D0) +C +C Local variables. + INTEGER APOS,I,IBLK,II,IPIV,IRHS, + + IWPOS,J,J1,J2,K,KK,NCOLS,NROWS + DOUBLE PRECISION W1 +C APOS Current position in array FACT. +C I Temporary DO index +C IBLK Index of block pivot. +C II Temporary index. +C IPIV Pivot index. +C IRHS RHS index. +C IRHS1 RHS index. +C IRHS2 RHS index. +C IWPOS Position in IFACT of start of current index list. +C J Temporary DO index +C JPIV Has the value -1 for the first row of a 2 by 2 pivot and 1 for +C the second. +C K Temporary pointer to position in real array. +C J1 Position in IFACT of index of leading entry of row. +C J2 Position in IFACT of index of trailing entry of row. +C K Temporary variable. +C LROW Length of current row. +C NCOLS Number of columns in the block pivot. +C NROWS Number of rows in the block pivot. +C W1 RHS value. +C + APOS = IFACT(1) + +C Set IW1 array + IWPOS = 4 + DO 10 I = 1,IFACT(3)-1 + IW1(I) = IWPOS + IWPOS = IWPOS + ABS(IFACT(IWPOS))+2 + 10 CONTINUE + IW1(IFACT(3)) = IWPOS + +C Run through block pivot rows in the reverse order. + DO 380 IBLK = IFACT(3),1,-1 + +C Find the number of rows and columns in the block. + IWPOS = IW1(IBLK) + NCOLS = ABS(IFACT(IWPOS)) + NROWS = ABS(IFACT(IWPOS+1)) + APOS = APOS - NROWS* (NCOLS-NROWS) + IWPOS = IWPOS + 2 + + IF (NROWS.GT.4 .AND. NCOLS.GT.ICNTL(13)) THEN + +C Perform operations using direct addressing. + +C Load right-hand side into W. + DO 5 I = 1,NCOLS + II = ABS(IFACT(IWPOS+I-1)) + DO 3 J = 1,NRHS + W(I,J) = RHS(II,J) + 3 CONTINUE + 5 CONTINUE + + +C Treat off-diagonal block (direct addressing) + K = NCOLS - NROWS + IF (K.GT.0) CALL DGEMM('T','N',NROWS,NRHS,K,ONE, + + FACT(APOS),K, + + W(NROWS+1,1),LW,ONE,W,LW) + + APOS = APOS-(NROWS*(NROWS+1))/2 + +C Treat diagonal block (direct addressing) + DO 22 J = 1,NRHS + CALL DTPSV('L','T','U',NROWS,FACT(APOS),W(1,J),1) + 22 CONTINUE + +C Reload W back into RHS. + DO 60 I = 1,NROWS + II = ABS(IFACT(IWPOS+I-1)) + DO 59 J = 1,NRHS + RHS(II,J) = W(I,J) + 59 CONTINUE + 60 CONTINUE + + ELSE +C +C Perform operations using indirect addressing. + J1 = IWPOS + J2 = IWPOS + NCOLS - 1 + +C Treat off-diagonal block (indirect addressing) + KK = APOS + J1 = IWPOS + NROWS + DO 220 IPIV = 1,NROWS + IRHS = ABS(IFACT(IWPOS+IPIV-1)) + DO 218 II = 1,NRHS + W1 = RHS(IRHS,II) + K = KK + DO 215 J = J1,J2 + W1 = W1 + FACT(K)*RHS(ABS(IFACT(J)),II) + K = K + 1 + 215 CONTINUE + RHS(IRHS,II) = W1 + 218 CONTINUE + KK = K + 220 CONTINUE + +C Treat diagonal block (indirect addressing) + J2 = IWPOS + NROWS - 1 + DO 260 IPIV = 1,NROWS + IRHS = ABS(IFACT(J1-1)) + APOS = APOS - IPIV + DO 240 II = 1,NRHS + W1 = RHS(IRHS,II) + K = APOS + 1 + DO 230 J = J1,J2 + W1 = W1 - FACT(K)*RHS(ABS(IFACT(J)),II) + K = K + 1 + 230 CONTINUE + RHS(IRHS,II) = W1 + 240 CONTINUE + J1 = J1 - 1 + 260 CONTINUE + + END IF + + 380 CONTINUE + + + END + SUBROUTINE MA57DD(JOB,N,NE,A,IRN,JCN,FACT,LFACT,IFACT,LIFACT, + * RHS,X,RESID,W,IW,ICNTL,CNTL,INFO,RINFO) + +C This subroutine solves a single system using one or more steps of +C iterative refinement. +C If ICNTL(9) = 10 (the default), this subroutine performs iterative +C refinement using the strategy of Arioli, Demmel, and Duff. +C IF (ICNTL(9) = 1, then one step of iterative refinement is +C performed. + + INTEGER JOB,N,NE + DOUBLE PRECISION A(NE) + INTEGER IRN(NE),JCN(NE),LFACT + DOUBLE PRECISION FACT(LFACT) + INTEGER LIFACT,IFACT(LIFACT) + DOUBLE PRECISION RHS(N),X(N),RESID(N),W(N,*) + INTEGER IW(N),ICNTL(20) + DOUBLE PRECISION CNTL(5) + INTEGER INFO(40) + DOUBLE PRECISION RINFO(20) + +C JOB must be set by the user to determine what action is desired by +C the user. +C Values of JOB and their effect are: +C IF ICNTL(9)>1, JOB=0 if no estimate of solution in X; JOB=2 if +C estimate of solution in X. +C IF ICNTL(9)=1, then: +C 0: Solve Ax=b, calculate residual r=b-Ax and exit. +C (Note that MA57CD should be used if solution without residual +C is required) +C 1: Solve Ax=b, calculate residual r=b-Ax, solve A(dx)=r, +C update solution and exit. +C If JOB > 1, an estimate of the solution must be input in X. +C 2: Calculate residual r=b-Ax, solve A(dx)=r, +C update solution and exit. +C If JOB > 2, the residual for this estimate must also be input. +C 3: Solve A(dx)=r, update solution and exit. +C 4: Solve A(dx)=r, update solution, calculate residual for new +C solution and exit. +C N must be set to the order of the matrix and must be unchanged since +C the call to MA57BD. It is not altered by MA57DD. +C NE must be set to the number of entries in the matrix and must be +C unchanged since the call to MA57AD. It is not altered by MA57DD. +C A must be set by the user to the values of the matrix as input to +C MA57AD. It is not altered by MA57DD. +C IRN,JCN must be set to the row and column indices of the entries in A +C and must be unchanged since the call to MA57AD. They are +C not altered by MA57DD. +C FACT holds information on the factors and must be unchanged since +C the call to MA57BD. It is not altered by MA57DD. +C LFACT must be set to the length of FACT. It is not altered by MA57DD. +C IFACT holds information on the factors and must be unchanged since +C the call to MA57B/BD. It is not altered by MA57D. +C LIFACT must be set to the length of IFACT. It is not altered by +C A57D/DD. +C RHS is a real array of length N that must be set to the right-hand +C side for the equation being solved. It is not altered by MA57DD. +C X is a real array of length N. IF JOB >=2, it must be set on entry to +C an estimated solution. Otherwise, it need not be set by the user. +C On exit, the improved solution vector is returned in X. +C RESID is a real array of length N. If JOB>2, it must be set on entry +C to the value of the residual for the current solution estimate +C held in X. Otherwise, it need not be set by the user on entry. +C If JOB=0 or 4 or if ICNTL(9)>1, on exit it will hold the residual +C vector for the equations being solved. If 1<= JOB <= 3, then +C RESID will hold on exit the last correction vector added to the +C solution X. +C W is used as a work array. If ICNTL(9) = 1, it must be of length at +C least N. If ICNTL(9) > 1, it must be of length at least 3*N if +C ICNTL(10)=0. If ICNTL(9)>1 and ICNTL(10)>0, then W must be of +C length at least 4*N. +C IW is an integer array of length N that is used as a work array if +C ICNTL(1) > 9. It is not accessed if ICNTL(9) = 1. +C ICNTL must be set by the user as follows and is not altered. +C ICNTL(1) must be set to the stream number for error messages. +C A value less than 0 suppresses output. +C ICNTL(2) must be set to the stream number for warning output. +C A value less than 0 suppresses output. +C ICNTL(3) must be set to the stream number for monitor output. +C A value less than 0 suppresses output. +C ICNTL(4) must be set to the stream number for statistics output. +C A value less than 0 suppresses output. +C ICNTL(5) must be set to control the amount of output: +C 0 None. +C 1 Error messages only. +C 2 Error and warning messages. +C 3 As 2, plus scalar parameters and a few entries of array +C parameters on entry and exit. +C > 3 As 2, plus all parameters on entry and exit. +C ICNTL(6:12) Not referenced. +C ICNTL(9) Maximum permitted number of steps of iterative +C refinement. +C ICNTL(10) Flag to request calculation of error estimate and +C condition numbers. +C ICNTL(13) Threshold on number of columns in a block for direct +C addressing using Level 2 and Level 3 BLAS. +C CNTL must be set by the user as follows and is not altered. +C CNTL(3) is the required decrease in the scaled residuals required +C by the Arioli, Demmel, and Duff iteration. +C INFO is an integer array that need not be set by the user. On exit, +C a value of INFO(1) equal to zero indicates success. A failure is +C indicated by a negative value for INFO. +C RINFO is a real array that need not be set by the user. On exit, +C If ICNTL(9)>1, RINFO is set to information on the matrix and +C solution including backward errors. + +C .. Local constants .. + DOUBLE PRECISION ZERO,ONE + PARAMETER (ZERO=0.D0,ONE=1.0D0) + +C .. Local variables .. + DOUBLE PRECISION COND(2),CTAU,DXMAX,ERROR,OLDOMG(2),OLDOM2, + * OMEGA(2),OM2,TAU + INTEGER I,ICNTLC(20),ITER,J,K,KASE,KK,LDIAG,LP,MP,KEEP71(5) + LOGICAL LCOND(2) + +C +C COND is condition number of system. +C CTAU is set to 1000*machine precision. +C DXMAX used to calculate max norm of solution. +C ERROR used to accumulate error. +C OLDOMG holds value of previous backward errors. +C OLDOM2 holds previous sum of OMEGAs. +C OMEGA used to accumulate backward error. +C OM2 holds sum of OMEGAs. +C TAU is threshold for denominator in scaled residual calculation. +C I Temporary variable. +C ICNTLC is control array for MA57C/CD. +C ITER is maximum permitted number of steps of iterative refinement. +C J Temporary variable. +C K Temporary variable. +C KASE used when calling MC71AD. +C KK Temporary variable. +C LDIAG Control for amount of information output. +C LCOND used as switch when calculating condition number. +C LP Stream number for error printing. +C MP Stream number for monitor printing. +C KEEP71 Work array required by MC71. +C + +C Procedures + INTRINSIC MIN + EXTERNAL MA57CD,MA57UD,MC71AD +C EPS is the largest real such that 1+EPS is equal to 1. + DOUBLE PRECISION EPS + + +C Set local print control variables + LP = ICNTL(1) + MP = ICNTL(3) + LDIAG = ICNTL(5) + + INFO(1) = 0 + +C Check input data + IF (N.LE.0) THEN + INFO(1) = -1 + IF (LDIAG.GT.0 .AND. LP.GE.0) WRITE (LP,'(A,I3/A,I12)') + + '**** Error return from MA57DD **** INFO(1) =',INFO(1), + + 'N has value',N + INFO(2) = N + GOTO 500 + ENDIF + + IF (NE.LT.0) THEN + INFO(1) = -2 + IF (LDIAG.GT.0 .AND. LP.GE.0) WRITE (LP,'(A,I3/A,I12)') + + '**** Error return from MA57DD **** INFO(1) =',INFO(1), + + 'NE has value',NE + INFO(2) = NE + GOTO 500 + ENDIF + + IF (ICNTL(9).LT.1) THEN + INFO(1) = -13 + IF (LDIAG.GT.0 .AND. LP.GE.0) WRITE (LP,'(A,I4/A,I12)') + + '**** Error return from MA57DD **** INFO(1) =',INFO(1), + + 'ICNTL(9) has value',ICNTL(9) + INFO(2) = ICNTL(9) + GOTO 500 + ENDIF + + IF (JOB.LT.0 .OR. JOB.GT.4 .OR. (ICNTL(9).GT.1 .AND. + * (JOB.NE.0 .AND. JOB.NE.2))) THEN + INFO(1) = -12 + INFO(2) = JOB + IF (LDIAG.GT.0 .AND. LP.GE.0) WRITE (LP,'(A,I4/A,I12)') + + '**** Error return from MA57DD **** INFO(1) =',INFO(1), + + 'JOB has value',JOB + IF (ICNTL(9).GT.1 .AND. LDIAG.GT.0 .AND. LP.GE.0) + + WRITE (LP,'(A,I3)') 'and ICNTL(9) =',ICNTL(9) + GOTO 500 + ENDIF + +C If NE = 0, set variables and return + IF (NE.EQ.0) THEN + IF (JOB.NE.3) THEN + DO 8 I = 1,N + RESID(I) = ZERO + 8 CONTINUE + ENDIF + DO 9 I = 1,N + X(I) = ZERO + 9 CONTINUE + INFO(30)=0 + DO 10 I = 6,13 + RINFO(I) = ZERO + 10 CONTINUE + GO TO 500 + ENDIF + +C If requested, print input parameters + IF (LDIAG.GE.3 .AND. MP.GE.0) THEN + WRITE (MP,99999) JOB,N,NE,(ICNTL(I),I=1,5),LFACT,LIFACT, + + ICNTL(9),ICNTL(10),ICNTL(13),CNTL(3) +99999 FORMAT(/'Entering iterative refinement solution phase ', + + '(MA57DD) with ...'/ + + 'JOB Control for coefficient matrix =',I12/ + + 'N Order of matrix =',I12/ + + 'NE Number of entries in matrix =',I12/ + 6 'ICNTL(1) Stream for errors =',I12/ + 7 ' --- (2) Stream for warnings =',I12/ + 8 ' --- (3) Stream for monitoring =',I12/ + 9 ' --- (4) Stream for statistics =',I12/ + 1 ' --- (5) Level of diagnostic printing =',I12/ + + 'LFACT Length of array FACT =',I12/ + + 'LIFACT Length of array IFACT =',I12/ + + 'ICNTL(9) Number steps iterative refinement =',I12/ + + 'ICNTL(10) Control for error analysis =',I12/ + + 'ICNTL(13) Threshold for Level 2 and 3 BLAS =',I12/ + + 'CNTL(3) Convergence test for IR =',1P,D12.4) + +C Print out matrix factors. + CALL MA57UD(FACT,LFACT,IFACT,LIFACT,ICNTL) + K = MIN(10,N) + IF (LDIAG.GE.4) K = N + WRITE(MP,'(/A)') 'Right-hand side' + WRITE (MP,'((4X, 1P,5D13.3))') (RHS(I),I=1,K) + IF (K.LT.N) WRITE (MP,'(A)') ' . . .' + END IF + + + DO 15 I=1,5 + ICNTLC(I) = ICNTL(I) + 15 CONTINUE + ICNTLC(13) = ICNTL(13) + ICNTLC(15) = ICNTL(15) +C Switch off monitor printing in MA57C/CD + ICNTLC(3) = -1 + + IF (JOB.LE.2) THEN + IF (JOB .LE. 1) THEN +C No estimate given in X. + DO 14 I = 1,N + X(I) = RHS(I) + RESID(I) = RHS(I) + 14 CONTINUE +C Solve system Ax=b using MA57C/CD + CALL MA57CD(1,N,FACT,LFACT,IFACT,LIFACT,1,X,N,W,N,IW, + + ICNTLC,INFO) + ELSE +C Estimate of solution was input in X. + DO 13 I = 1,N + RESID(I) = RHS(I) + 13 CONTINUE + ENDIF + + IF (ICNTL(9).EQ.1) THEN +C Compute residual + DO 16 KK = 1,NE + I = IRN(KK) + J = JCN(KK) + IF (MIN(I,J).LT.1 .OR. MAX(I,J).GT.N) GO TO 16 + RESID(J) = RESID(J) - A(KK)*X(I) +C Matrix is symmetric + IF (I.NE.J) RESID(I) = RESID(I) - A(KK)*X(J) + 16 CONTINUE + IF (JOB.EQ.0) GO TO 340 + ELSE +C Calculate values for iterative refinement strategy of Arioli, +C Demmel and Duff. + DO 18 I = 1,N + W(I,1) = ZERO +C Calculate infinity norms of rows of A in W(I,1) +C Sum |a |, j=1,N (= ||A || ) +C ij i. infinity + W(I,3) = ZERO + 18 CONTINUE + DO 17 KK = 1,NE + I = IRN(KK) + J = JCN(KK) + IF (MIN(I,J).LT.1 .OR. MAX(I,J).GT.N) GO TO 17 + RESID(J) = RESID(J) - A(KK)*X(I) + W(J,1) = W(J,1) + ABS(A(KK)*X(I)) + W(J,3) = W(J,3) + ABS(A(KK)) +C Matrix is symmetric + IF (I.NE.J) THEN + RESID(I) = RESID(I) - A(KK)*X(J) + W(I,1) = W(I,1) + ABS(A(KK)*X(J)) + W(I,3) = W(I,3) + ABS(A(KK)) + ENDIF + 17 CONTINUE + +C Calculate max-norm of solution + DXMAX = ZERO + DO 221 I = 1,N + DXMAX = MAX(DXMAX,ABS(X(I))) + 221 CONTINUE + +C Initialize EPS + EPS = EPSILON(EPS) +C Calculate backward errors OMEGA(1) and OMEGA(2) +C CTAU ... 1000 eps (approx) + CTAU = 1000.*EPS +C tau is (||A || ||x|| + |b| )*n*1000*epsilon +C i. infinity max i + OMEGA(1) = ZERO + OMEGA(2) = ZERO + DO 231 I = 1,N + TAU = (W(I,3)*DXMAX+ABS(RHS(I)))*N*CTAU + IF ((W(I,1)+ABS(RHS(I))).GT.TAU) THEN +C |Ax-b| /(|A||x| + |b|) +C i i + OMEGA(1) = MAX(OMEGA(1),ABS(RESID(I))/ + + (W(I,1)+ABS(RHS(I)))) + IW(I) = 1 + ELSE +C TAU will be zero if all zero row in A, for example + IF (TAU.GT.ZERO) THEN +C |Ax-b| /(|A||x| + ||A || ||x|| ) +C i i i. infinity max + OMEGA(2) = MAX(OMEGA(2),ABS(RESID(I))/ + + (W(I,1)+W(I,3)*DXMAX)) + END IF + IW(I) = 2 + END IF + 231 CONTINUE +C +C Stop the calculations if the backward error is small +C + OM2 = OMEGA(1) + OMEGA(2) + ITER = 0 +C Statement changed because IBM SP held quantities in registers +C IF ((OM2+ONE).LE.ONE) THEN + IF (OM2.LE.EPS) THEN + GO TO 270 + ENDIF + +C Hold current estimate in case needed later + DO 251 I = 1,N + W(I,2) = X(I) + 251 CONTINUE + OLDOMG(1) = OMEGA(1) + OLDOMG(2) = OMEGA(2) + OLDOM2 = OM2 + + ENDIF + + ENDIF + +C At this point JOB >= 1 or ICNTL(9) > 1 +C +C Iterative refinement loop + DO 260 ITER = 1,ICNTL(9) + +C Solve system A(dx) = r using MA57C/CD + CALL MA57CD(1,N,FACT,LFACT,IFACT,LIFACT,1,RESID,N,W,N,IW, + + ICNTLC,INFO) + +C Update solution + DO 141 I = 1,N + X(I) = X(I) + RESID(I) + 141 CONTINUE + +C Exit without computing residual + IF (JOB.LT.4 .AND. ICNTL(9).EQ.1) GO TO 340 + +C +C Calculate residual using information in A,IRN,JCN +C If ICNTL(9).GT.1 also calculate |A| |x| +C + IF (ICNTL(9).EQ.1) THEN +C Now JOB = 4 + DO 151 I = 1,N + RESID(I) = RHS(I) + 151 CONTINUE + DO 181 KK = 1,NE + I = IRN(KK) + J = JCN(KK) + IF (MIN(I,J).LT.1 .OR. MAX(I,J).GT.N) GO TO 181 + RESID(J) = RESID(J) - A(KK)*X(I) +C Matrix is symmetric + IF (I.NE.J) RESID(I) = RESID(I) - A(KK)*X(J) + 181 CONTINUE +C Jump because only one step of iterative refinement requested. + GO TO 340 + ELSE + DO 153 I = 1,N +C b - Ax + RESID(I) = RHS(I) +C |A||x| + W(I,1) = ZERO + 153 CONTINUE + DO 183 KK = 1,NE + I = IRN(KK) + J = JCN(KK) + IF (MIN(I,J).LT.1 .OR. MAX(I,J).GT.N) GO TO 183 + RESID(J) = RESID(J) - A(KK)*X(I) + W(J,1) = W(J,1) + ABS(A(KK)*X(I)) +C Matrix is symmetric + IF (I.NE.J) THEN + RESID(I) = RESID(I) - A(KK)*X(J) + W(I,1) = W(I,1) + ABS(A(KK)*X(J)) + ENDIF + 183 CONTINUE + ENDIF + +C Calculate max-norm of solution + DXMAX = ZERO + DO 220 I = 1,N + DXMAX = MAX(DXMAX,ABS(X(I))) + 220 CONTINUE + +C Calculate omega(1) and omega(2) +C tau is (||A || ||x|| + |b| )*n*1000*epsilon +C i. infinity max i + OMEGA(1) = ZERO + OMEGA(2) = ZERO + DO 230 I = 1,N + TAU = (W(I,3)*DXMAX+ABS(RHS(I)))*N*CTAU + IF ((W(I,1)+ABS(RHS(I))).GT.TAU) THEN +C |Ax-b| /(|A||x| + |b|) +C i i + OMEGA(1) = MAX(OMEGA(1),ABS(RESID(I))/ + + (W(I,1)+ABS(RHS(I)))) + IW(I) = 1 + ELSE +C TAU will be zero if all zero row in A, for example + IF (TAU.GT.ZERO) THEN +C |Ax-b| /(|A||x| + ||A || ||x|| ) +C i i i. infinity max + OMEGA(2) = MAX(OMEGA(2),ABS(RESID(I))/ + + (W(I,1)+W(I,3)*DXMAX)) + END IF + IW(I) = 2 + END IF + 230 CONTINUE +C +C Stop the calculations if the backward error is small + OM2 = OMEGA(1) + OMEGA(2) + IF ((OM2+ONE).LE.ONE) THEN + GO TO 270 + ENDIF +C +C Check the convergence. +C + IF (OM2.GT.OLDOM2*CNTL(3)) THEN +C Stop if insufficient decrease in omega. + IF (OM2.GT.OLDOM2) THEN +C Previous estimate was better ... reinstate it. + OMEGA(1) = OLDOMG(1) + OMEGA(2) = OLDOMG(2) + DO 240 I = 1,N + X(I) = W(I,2) + 240 CONTINUE + END IF + GO TO 270 + ELSE +C Hold current estimate in case needed later + DO 250 I = 1,N + W(I,2) = X(I) + 250 CONTINUE + OLDOMG(1) = OMEGA(1) + OLDOMG(2) = OMEGA(2) + OLDOM2 = OM2 + END IF + + 260 CONTINUE +C End of iterative refinement loop. + + INFO(1) = -8 + IF (LP.GE.0 .AND. LDIAG.GE.1) WRITE (LP,9170) INFO(1),ICNTL(9) + 9170 FORMAT ('Error return from MA57D/DD because of ','nonconvergence', + + ' of iterative refinement'/'Error INFO(1) = ',I2,' with', + + ' ICNTL','(9) = ',I10) + +C Set the RINFO parameters + 270 RINFO(6) = OMEGA(1) + RINFO(7) = OMEGA(2) + RINFO(8) = ZERO + DO 271 I=1,N + RINFO(8) = MAX(RINFO(8),W(I,3)) + 271 CONTINUE + RINFO(9) = DXMAX + RINFO(10) = ZERO + DO 272 I=1,N + RINFO(10) = MAX(RINFO(10),ABS(RESID(I))) + 272 CONTINUE + IF (RINFO(8)*RINFO(9).NE.ZERO) + *RINFO(10) = RINFO(10)/(RINFO(8)*RINFO(9)) + INFO(30) = ITER + + IF (INFO(1).LT.0) GO TO 340 + +C Jump if estimate of error not requested. + IF (ICNTL(10).LE.0) GO TO 340 + +C +C Calculate condition numbers and estimate of the error. +C +C Condition numbers obtained through use of norm estimation +C routine MC71A/AD. +C +C Initializations +C + LCOND(1) = .FALSE. + LCOND(2) = .FALSE. + ERROR = ZERO + DO 280 I = 1,N + IF (IW(I).EQ.1) THEN + W(I,1) = W(I,1) + ABS(RHS(I)) +C |A||x| + |b| + W(I,2) = ZERO + LCOND(1) = .TRUE. + ELSE +C |A||x| + ||A || ||x|| +C i. infinity max + + W(I,2) = W(I,1) + W(I,3)*DXMAX + W(I,1) = ZERO + LCOND(2) = .TRUE. + END IF + 280 CONTINUE +C +C Compute the estimate of COND +C + DO 330 K = 1,2 + IF (LCOND(K)) THEN +C MC71A/AD has its own built in limit of 5 to the number of iterations +C allowed. It is this limit that will be used to terminate the +C following loop. + KASE = 0 + DO 310 KK = 1,40 + +C MC71A/AD calculates norm of matrix +C We are calculating the infinity norm of INV(A).W + +C Initialize W(1,3). W(1,4) is a work array. + CALL MC71AD(N,KASE,W(1,3),COND(K),W(1,4),IW,KEEP71) +C +C KASE = 0........ Computation completed +C KASE = 1........ W * INV(TRANSPOSE(A)) * Y +C KASE = 2........ INV(A) * W * Y +C W is W/W(*,2) .. Y is W(*,3) +C + IF (KASE.EQ.0) GO TO 320 + + IF (KASE.EQ.1) THEN +C Solve system using MA57C/CD. +C W(1,4) is used as workspace + CALL MA57CD(1,N,FACT,LFACT,IFACT,LIFACT,1,W(1,3), + * N,W(1,4),N,IW,ICNTLC,INFO) + DO 290 I = 1,N + W(I,3) = W(I,K)*W(I,3) + 290 CONTINUE + END IF + + IF (KASE.EQ.2) THEN + DO 300 I = 1,N + W(I,3) = W(I,K)*W(I,3) + 300 CONTINUE +C Solve system using MA57C/CD. + CALL MA57CD(1,N,FACT,LFACT,IFACT,LIFACT,1,W(1,3),N, + * W(1,4),N,IW,ICNTLC,INFO) + END IF + + 310 CONTINUE + +C Error return if MC71AD does not converge + INFO(1) = -14 + IF (LP.GE.0 .AND. LDIAG.GE.1) WRITE (LP,9160) + 9160 FORMAT ('Error return from MA57D/DD because of ','error in MC71', + + 'A/AD'/'Error not calculated') + + 320 IF (DXMAX.GT.ZERO) COND(K) = COND(K)/DXMAX + ERROR = ERROR + OMEGA(K)*COND(K) + ELSE + COND(K) = ZERO + ENDIF + + 330 CONTINUE + + RINFO(11) = COND(1) + RINFO(12) = COND(2) + RINFO(13) = ERROR + +C +C If requested, print output parameters. + 340 IF (LDIAG.GE.3 .AND. MP.GE.0) THEN + WRITE(MP,99980) INFO(1) +99980 FORMAT (/'Leaving iterative refinement solution phase ', + + '(MA57DD) with ...'/ + 1 'INFO (1) =',I12/) + IF (INFO(1).LT.0) GO TO 500 + IF (ICNTL(9).GT.1) THEN + WRITE(MP,99981) INFO(30),(RINFO(I),I=6,10) +99981 FORMAT( + 1 'INFO(30) Number steps iterative ref =',I10/ + 1 'RINFO(6) Backward errors (OMEGA(1)) =',1PD10.3/ + 2 '-----(7) Backward errors (OMEGA(2)) =',1PD10.3/ + 3 '-----(8) Infinity norm of matrix =',1PD10.3/ + 4 '-----(9) Infinity norm of solution =',1PD10.3/ + 5 '-----(10) Norm of scaled residuals =',1PD10.3) + IF (ICNTL(10).GT.0) WRITE(MP,99979) (RINFO(I),I=11,13) +99979 FORMAT ( + 1 'RINFO(11) Condition number (COND(1)) =',1PD10.3/ + 1 'RINFO(12) Condition number (COND(2)) =',1PD10.3/ + 1 'RINFO(13) Error in solution =',1PD10.3) + WRITE(MP,'(/A,I10)') 'Residual' + K=MIN(N,10) + IF (LDIAG.GE.4) K = N + WRITE (MP,'(1P,5D13.3)') (RESID(I),I=1,K) + IF (K.LT.N) WRITE (MP,'(A)') ' . . .' + ELSE +C ICNTL(9) = 1 + IF (JOB.GE.1 .AND. JOB.LE.3) THEN + WRITE(MP,'(/A,I10)') 'Correction to solution' + ELSE + WRITE(MP,'(/A,I10)') 'Residual' + ENDIF + K=MIN(N,10) + IF (LDIAG.GE.4) K = N + WRITE (MP,'(1P,5D13.3)') (RESID(I),I=1,K) + IF (K.LT.N) WRITE (MP,'(A)') ' . . .' + END IF + +C Print solution + K=MIN(N,10) + IF (LDIAG.GE.4) K = N + WRITE(MP,'(/A,I10)') 'Solution' + WRITE (MP,'(1P,5D13.3)') (X(I),I=1,K) + IF (K.LT.N) WRITE (MP,'(A)') ' . . .' + + END IF + + 500 RETURN + + END + SUBROUTINE MA57ED(N,IC,KEEP,FACT,LFACT,NEWFAC,LNEW, + * IFACT,LIFACT,NEWIFC,LINEW,INFO) + INTEGER N,IC,KEEP(*),LFACT,LNEW,LIFACT,LINEW,INFO(40) + DOUBLE PRECISION FACT(LFACT),NEWFAC(LNEW) + INTEGER IFACT(LIFACT),NEWIFC(LINEW) +C Local variables + INTEGER APOSBB,ASTK,HOLD,I,ISTK,IWPOS,MOVE,NFRONT + +C HOLD determines part of keep holding saved variables from MA57OD. + HOLD = N + 3 + +C Initialize INFO(1) and INFO(2) + INFO(1) = 0 + INFO(2) = 0 + +C Test to see whether to map real or integer space + IF (IC.GE.1) THEN +C Remap of integer space + IF (LINEW.LE.LIFACT) THEN + INFO(1) = -7 + INFO(2) = LINEW + RETURN + ENDIF + IWPOS = KEEP(HOLD+7) + ISTK = KEEP(HOLD+14) + NFRONT = KEEP(HOLD+23) + DO 10 I = 1,IWPOS+NFRONT-1 + NEWIFC(I) = IFACT(I) + 10 CONTINUE +C Move distance + MOVE = LINEW - LIFACT + DO 20 I = ISTK+1,LIFACT + NEWIFC(I+MOVE) = IFACT(I) + 20 CONTINUE +C Reset INPUT, ISTK, PTIRN + KEEP(HOLD+13) = KEEP(HOLD+13) + MOVE + KEEP(HOLD+14) = ISTK + MOVE + KEEP(HOLD+18) = KEEP(HOLD+18) + MOVE + ENDIF + IF (IC.NE.1) THEN +C Remap of real space + IF (LNEW.LE.LFACT) THEN + INFO(1) = -7 + INFO(2) = LNEW + RETURN + ENDIF +C Was .. APOS = KEEP(HOLD+8) + APOSBB = KEEP(HOLD+9) + ASTK = KEEP(HOLD+15) + DO 60 I = 1, APOSBB-1 + NEWFAC(I) = FACT(I) + 60 CONTINUE +C Move distance + MOVE = LNEW - LFACT + DO 70 I = ASTK+1,LFACT + NEWFAC(I+MOVE) = FACT(I) + 70 CONTINUE +C Reset AINPUT, ASTK, PTRA + KEEP(HOLD+12) = KEEP(HOLD+12) + MOVE + KEEP(HOLD+15) = ASTK + MOVE + KEEP(HOLD+19) = KEEP(HOLD+19) + MOVE + ENDIF + RETURN + END + SUBROUTINE MA57GD(N,NE,IRN,JCN,IW,IPE,COUNT,FLAG,IWFR,ICNTL,INFO) + +C Given the positions of the entries of a symmetric matrix, construct +C the sparsity pattern of the whole matrix. Either one of a pair +C (I,J),(J,I) may be used to represent the pair. Duplicates are +C ignored. + + INTEGER N,NE,IRN(NE),JCN(NE),IW(NE*2+N),IPE(N),COUNT(N), + + FLAG(N),IWFR,ICNTL(20),INFO(40) +C N must be set to the matrix order. It is not altered. +C NE must be set to the number of entries input. It is not altered. +C IRN(K),K=1,2,...,NE must be set to the row indices of the entries on +C input. IRN is not changed. +C JCN(K),K=1,2,...,NE must be set to the column indices of the entries +C on input. JCN is not changed. +C IW need not be set on input. On output it contains lists of +C column indices. +C IPE need not be set on input. On output IPE(I) points to the start of +C the entry in IW for row I, I=1,2,...,N. +C COUNT need not be set. On output COUNT(I), I=1,2,..,N, contains the +C number of off-diagonal entries in row I excluding duplicates. +C FLAG is used for workspace to hold flags to permit duplicate entries +C to be identified quickly. +C IWFR need not be set on input. On output it points to the first +C unused location in IW. +C ICNTL Warning messages are printed on stream number ICNTL(2) if +C ICNTL(2).GT.0 and ICNTL(5).GT.1. +C INFO need not be set on input. On output, +C INFO(1) has one of the values: +C 0 No out-of-range index or duplicate entry found. +C 1 Out-of-range index found. +C 2 Duplicate entry found. +C 3 Out-of-range index found and duplicate entry found. +C INFO(3) is set to the number of out-of-range entries. +C INFO(4) is set to the number of off-diagonal duplicate entries. +C + INTRINSIC MAX,MIN +C +C Local variables + INTEGER I,J,K,L,LDIAG,WP +C I Row index +C J Column index +C K Position in IRN, JCN, or IW. +C L Position in IW. +C LDIAG Level of diagnostic printing. +C WP Stream for printing warning messages. + +C Set LDIAG and WP + WP = ICNTL(2) + LDIAG = ICNTL(5) + IF (WP.LT.0) LDIAG = 0 + +C Initialize INFO(1) + INFO(1) = 0 + +C Count in INFO(3) the number of out-of-range entries, initialize FLAG, +C and count in COUNT the numbers of entries in the rows including +C duplicates. + INFO(3) = 0 + DO 10 I = 1,N + FLAG(I) = 0 + COUNT(I) = 0 + 10 CONTINUE + DO 20 K = 1,NE + I = IRN(K) + J = JCN(K) + IF (MIN(I,J).LT.1 .OR. MAX(I,J).GT.N) THEN + INFO(3) = INFO(3) + 1 + INFO(1) = 1 + IF (INFO(3).EQ.1 .AND. LDIAG.GT.1) WRITE (WP,'(2A,I2)') + + '*** Warning message from subroutine MA57AD ***', + + ' INFO(1) =',INFO(1) + IF (INFO(3).LE.10 .AND. LDIAG.GT.1) WRITE (WP,'(3(I10,A))') + + K,'th entry (in row',I,' and column',J,') ignored' + + ELSE IF (I.NE.J) THEN + COUNT(I) = COUNT(I) + 1 + COUNT(J) = COUNT(J) + 1 + END IF + + 20 CONTINUE +C +C Accumulate row counts in IPE which is set so that IPE(I) points to +C position after end of row I. + IPE(1) = COUNT(1)+1 + DO 30 I = 2,N + IPE(I) = IPE(I-1) + COUNT(I) + 30 CONTINUE +C +C Run through putting the matrix entries in the right places. IPE is +C used for holding running pointers and is left holding pointers to +C row starts. + DO 40 K = 1,NE + I = IRN(K) + J = JCN(K) + IF (MIN(I,J).LT.1 .OR. MAX(I,J).GT.N .OR. I.EQ.J) GO TO 40 + IPE(I) = IPE(I) - 1 + IW(IPE(I)) = J + IPE(J) = IPE(J) - 1 + IW(IPE(J)) = I + 40 CONTINUE +C +C Remove duplicates. + INFO(4) = 0 +C IWFR points to the current position in the compressed set of rows. + IWFR = 1 +C At the start of cycle I of this loop FLAG(J).LT.I for J=1,2,...,N. +C During the loop FLAG(J) is set to I if an entry in column J is +C found. This permits duplicates to be recognized quickly. + DO 60 I = 1,N + L = IPE(I) + IPE(I) = IWFR + DO 50 K = L,L+COUNT(I)-1 + J = IW(K) + + IF (FLAG(J).NE.I) THEN + FLAG(J) = I + IW(IWFR) = J + IWFR = IWFR + 1 + ELSE +C Count duplicates only once. + IF (I.LT.J) INFO(4) = INFO(4) + 1 + END IF + + 50 CONTINUE +C Set COUNT to number without duplicates. + COUNT(I) = IWFR - IPE(I) + 60 CONTINUE +C +C Test whether duplicates found + IF (INFO(4).GT.0) THEN + INFO(1) = INFO(1) + 2 + IF (LDIAG.GT.1 .AND. WP.GE.0) WRITE (WP,'(A/I10,A)') + + '*** Warning message from subroutine MA57AD ***',INFO(4), + + ' off-diagonal duplicate entries found' + END IF + + END + SUBROUTINE MA57JD(N,NE,IRN,JCN,PERM,IW,IPE,COUNT,FLAG,IWFR, + + ICNTL,INFO) + +C Given the positions of the entries of a symmetric matrix and a +C permutation, construct the sparsity pattern of the upper +C triangular part of the matrix. Either one of a pair +C (I,J),(J,I) may be used to represent the pair. Duplicates are +C ignored. + + INTEGER N,NE,IRN(NE),JCN(NE),IW(NE+N),IPE(N),COUNT(N), + + PERM(N),FLAG(N),IWFR,ICNTL(20),INFO(40) +C N must be set to the matrix order. It is not altered. +C NE must be set to the number of entries input. It is not altered. +C IRN(K),K=1,2,...,NE must be set to the row indices of the entries on +C input. If IRN(K) or JCN(K) is out of range, IRN(K) is replaced by +C zero. Otherwise, IRN(K) is not changed. +C JCN(K),K=1,2,...,NE must be set to the column indices of the entries +C on input. If IRN(K) or JCN(K) is out of range, JCN(K) is replaced +C by zero. Otherwise, JCN(K) is not changed. +C PERM must be set so that PERM(I) holds the position of variable I +C in the permuted order. Its validity as a permutation will have +C been checked in MA57A/AD. +C IW need not be set on input. On output it contains lists of +C column indices, each list being headed by its length. +C IPE need not be set on input. On output IPE(I) points to the start of +C the entry in IW for row I, I=1,2,...,N. +C COUNT need not be set. On output COUNT(I), I=1,2,..,N, contains the +C number of off-diagonal entries in row I including duplicates. +C COUNT(0) contains the number of entries with one or both indices +C out of range. +C FLAG is used for workspace to hold flags to permit duplicate entries +C to be identified quickly. +C IWFR need not be set on input. On output it points to the first +C unused location in IW. +C ICNTL Warning messages are printed on stream number ICNTL(2) if +C ICNTL(2).GT.0 and ICNTL(3).GT.1. +C INFO need not be set on input. On output, INFO(1) has one of the +C values: +C 0 No out-of-range index or duplicate entry found. +C 1 Out-of-range index found. +C 2 Duplicate entry found. +C 3 Out-of-range index found and duplicate entry found. +C INFO(3) is set to the number of faulty entries. +C INFO(4) is set to the number of off-diagonal duplicate entries. + + INTRINSIC MAX,MIN +C +C Local variables + INTEGER I,J,K,L,LDIAG,WP +C I Row index +C J Column index +C K Position in IRN, JCN, or IW. +C L Position in IW. +C LDIAG Level of monitor printing. +C WP Stream for printing. + +C Set LDIAG and WP + WP = ICNTL(2) + LDIAG = ICNTL(5) + IF (WP.LT.0) LDIAG = 0 + +C Initialize INFO(1), FLAG, and COUNT. + INFO(1) = 0 + DO 10 I = 1,N + FLAG(I) = 0 + COUNT(I) = 0 + 10 CONTINUE + +C Count in INFO(3) the number of out-of-range entries, initialize FLAG, +C and count in COUNT the numbers of entries in the rows. + INFO(3) = 0 + DO 30 K = 1,NE + I = IRN(K) + J = JCN(K) + IF (MIN(I,J).LT.1 .OR. MAX(I,J).GT.N) THEN + IRN(K) = 0 + JCN(K) = 0 + INFO(3) = INFO(3) + 1 + INFO(1) = 1 + IF (INFO(3).EQ.1 .AND. LDIAG.GT.1) WRITE (WP,'(2A,I2)') + + '*** Warning message from subroutine MA57AD ***', + + ' INFO(1) =',INFO(1) + IF (INFO(3).LE.10 .AND. LDIAG.GT.1) WRITE (WP,'(3(I10,A))') + + K,'th entry (in row',I,' and column',J,') ignored' + + ELSE IF (PERM(I).LE.PERM(J)) THEN + COUNT(I) = COUNT(I) + 1 + ELSE + COUNT(J) = COUNT(J) + 1 + END IF + + 30 CONTINUE +C +C Accumulate row counts in IPE ... one added for row length location. + IPE(1) = COUNT(1) + 1 + DO 40 I = 2,N + IPE(I) = IPE(I-1) + COUNT(I) + 1 + 40 CONTINUE + +C Run through putting the matrix entries in the right places. IPE is +C used for holding running pointers and is left holding pointers to +C row starts. + DO 50 K = 1,NE + I = IRN(K) + J = JCN(K) + IF (MIN(I,J).LT.1 .OR. MAX(I,J).GT.N) GO TO 50 + IF (PERM(I).LE.PERM(J)) THEN + IW(IPE(I)) = J + IPE(I) = IPE(I) - 1 + ELSE + IW(IPE(J)) = I + IPE(J) = IPE(J) - 1 + END IF + 50 CONTINUE + +C Remove duplicates +C IWFR points to the current position in the compressed set of rows. + IWFR = 1 + INFO(4) = 0 + +C At the start of cycle I of this loop FLAG(J).LT.I for J=1,2,...,N. +C During the loop FLAG(J) is set to I if an entry in column J is +C found. This permits duplicates to be recognized quickly. + DO 70 I = 1,N + L = IPE(I) + IPE(I) = IWFR + + DO 60 K = L + 1,L + COUNT(I) + J = IW(K) + IF (FLAG(J).NE.I) THEN + FLAG(J) = I + IWFR = IWFR + 1 + IW(IWFR) = J + ELSE +C Count duplicates only once. + IF (I.LT.J) INFO(4) = INFO(4) + 1 + END IF + 60 CONTINUE + + IF (IWFR.GT.IPE(I)) THEN + IW(IPE(I)) = IWFR - IPE(I) + IWFR = IWFR + 1 + ELSE + IPE(I) = 0 + END IF + + 70 CONTINUE + +C Test whether duplicates found + IF (INFO(4).GT.0) THEN + INFO(1) = INFO(1) + 2 + IF (LDIAG.GT.1 .AND. WP.GE.0) WRITE (WP,'(A/I10,A)') + + '*** Warning message from subroutine MA57AD ***', + + INFO(4),' off-diagonal duplicate entries found' + END IF + + END + + SUBROUTINE MA57KD(N, IPE, IW, LW, IWFR, PERM, IPS, NV, FLAG, + * NCMPA) + INTEGER N,LW,IWFR,NCMPA + INTEGER IPE(N) + INTEGER IW(LW), PERM(N), IPS(N), NV(N), FLAG(N) +C +C Using a given pivotal sequence and a representation of the matrix that +C includes only non-zeros of the strictly upper-triangular part +C of the permuted matrix, construct tree pointers. +C +C N must be set to the matrix order. It is not altered. +C IPE(I) must be set to point to the position in IW of the +C start of row I or have the value zero if row I has no off- +C diagonal non-zeros. during execution it is used as follows. +C If variable I is eliminated then IPE(I) points to the list +C of variables for created element I. If element I is +C absorbed into newly created element J then IPE(I)=-J. +C IW must be set on entry to hold lists of variables by +C rows, each list being headed by its length. when a variable +C is eliminated its list is replaced by a list of variables +C in the new element. +C LW must be set to the length of IW. It is not altered. +C IWFR must be set to the position in IW of the first free variable. +C It is revised during execution, continuing to have this meaning. +C PERM(K) must be set to hold the position of variable K in the +C pivot order. It is not altered. +C IPS(I) need not be set by the user and will be used to hold the +C inverse permutation to PERM. +C NV need not be set. If variable J has not been eliminated then +C the last element whose leading variable (variable earliest +C in the pivot sequence) is J is element NV(J). If element J +C exists then the last element having the same leading +C variable is NV(J). In both cases NV(J)=0 if there is no such +C element. If element J has been merged into a later element +C then NV(J) is the degree at the time of elimination. +C FLAG is used as workspace for variable flags. +C FLAG(JS)=ME if JS has been included in the list for ME. +C + INTEGER I,J,ML,MS,ME,IP,MINJS,IE,KDUMMY,JP + INTEGER LN,JP1,JS,LWFR,JP2,JE + + EXTERNAL MA57FD + +C +C Initializations + DO 10 I=1,N + FLAG(I) = 0 + NV(I) = 0 + J = PERM(I) + IPS(J) = I + 10 CONTINUE + NCMPA = 0 +C +C Start of main loop +C + DO 100 ML=1,N +C ME=MS is the name of the variable eliminated and +C of the element created in the main loop. + MS = IPS(ML) + ME = MS + FLAG(MS) = ME +C +C Merge row MS with all the elements having MS as leading variable. +C IP points to the start of the new list. + IP = IWFR +C MINJS is set to the position in the order of the leading variable +C in the new list. + MINJS = N + IE = ME + DO 70 KDUMMY=1,N +C Search variable list of element IE. +C JP points to the current position in the list being searched. + JP = IPE(IE) +C LN is the length of the list being searched. + LN = 0 + IF (JP.LE.0) GO TO 60 + LN = IW(JP) +C +C Search for different variables and add them to list, +C compressing when necessary + DO 50 JP1=1,LN + JP = JP + 1 +C Place next variable in JS. + JS = IW(JP) +C Jump if variable has already been included. + IF (FLAG(JS).EQ.ME) GO TO 50 + FLAG(JS) = ME + IF (IWFR.LT.LW) GO TO 40 +C Prepare for compressing IW by adjusting pointer to and length of +C the list for IE to refer to the remaining entries. + IPE(IE) = JP + IW(JP) = LN - JP1 +C Compress IW. + CALL MA57FD(N, IPE, IW, IP-1, LWFR, NCMPA) +C Copy new list forward + JP2 = IWFR - 1 + IWFR = LWFR + IF (IP.GT.JP2) GO TO 30 + DO 20 JP=IP,JP2 + IW(IWFR) = IW(JP) + IWFR = IWFR + 1 + 20 CONTINUE + 30 IP = LWFR + JP = IPE(IE) +C Add variable JS to new list. + 40 IW(IWFR) = JS + MINJS = MIN0(MINJS,PERM(JS)+0) + IWFR = IWFR + 1 + 50 CONTINUE +C Record absorption of element IE into new element. + 60 IPE(IE) = -ME +C Pick up next element with leading variable MS. + JE = NV(IE) +C Store degree of IE. + NV(IE) = LN + 1 + IE = JE +C Leave loop if there are no more elements. + IF (IE.EQ.0) GO TO 80 + 70 CONTINUE + 80 IF (IWFR.GT.IP) GO TO 90 +C Deal with null new element. + IPE(ME) = 0 + NV(ME) = 1 + GO TO 100 +C Link new element with others having same leading variable. + 90 MINJS = IPS(MINJS) + NV(ME) = NV(MINJS) + NV(MINJS) = ME +C Move first entry in new list to end to allow room for length at +C front. Set pointer to front. + IW(IWFR) = IW(IP) + IW(IP) = IWFR - IP + IPE(ME) = IP + IWFR = IWFR + 1 + 100 CONTINUE + + RETURN + END +C** end of MA57KD** + + SUBROUTINE MA57FD(N, IPE, IW, LW, IWFR, NCMPA) +C Compress lists held by MA57KD in IW and adjust pointers +C in IPE to correspond. + INTEGER N,LW,IWFR,NCMPA + INTEGER IPE(N) +C + INTEGER IW(LW) +C N is the matrix order. It is not altered. +C IPE(I) points to the position in IW of the start of list I or is +C zero if there is no list I. On exit it points to the new position. +C IW holds the lists, each headed by its length. On output the same +C lists are held, but they are now compressed together. +C LW holds the length of IW. It is not altered. +C IWFR need not be set on entry. On exit it points to the first free +C location in IW. +C + INTEGER I,K1,LWFR,IR,K,K2 + NCMPA = NCMPA + 1 +C Prepare for compressing by storing the lengths of the +C lists in IPE and setting the first entry of each list to +C -(list number). + DO 10 I=1,N + K1 = IPE(I) + IF (K1.LE.0) GO TO 10 + IPE(I) = IW(K1) + IW(K1) = -I + 10 CONTINUE +C +C Compress +C IWFR points just beyond the end of the compressed file. +C LWFR points just beyond the end of the uncompressed file. + IWFR = 1 + LWFR = IWFR + DO 60 IR=1,N + IF (LWFR.GT.LW) GO TO 70 +C Search for the next negative entry. + DO 20 K=LWFR,LW + IF (IW(K).LT.0) GO TO 30 + 20 CONTINUE + GO TO 70 +C Pick up entry number, store length in new position, set new pointer +C and prepare to copy list. + 30 I = -IW(K) + IW(IWFR) = IPE(I) + IPE(I) = IWFR + K1 = K + 1 + K2 = K + IW(IWFR) + IWFR = IWFR + 1 + IF (K1.GT.K2) GO TO 50 +C Copy list to new position. + DO 40 K=K1,K2 + IW(IWFR) = IW(K) + IWFR = IWFR + 1 + 40 CONTINUE + 50 LWFR = K2 + 1 + 60 CONTINUE + 70 RETURN + END +C-------------------------------------------------------------------- +C HSL 2000 +C -- +C- Copyright CCLRC Rutherford Appleton Laboratory +C -- +C-------------------------------------------------------------------- + SUBROUTINE MA57LD(N, IPE, NV, IPS, NE, NA, NODE, PERM, NSTEPS, + * FILS, FRERE, ND, NEMIN, SUBORD) +C +C Tree search +C +C Given son to father tree pointers, reorder so that eldest son has +C smallest degree and perform depth-first +C search to find pivot order and number of eliminations +C and assemblies at each stage. + INTEGER N, NSTEPS + INTEGER ND(N) + INTEGER IPE(N), FILS(N), FRERE(N), SUBORD(N) +C + INTEGER NV(N), IPS(N), NE(N), NA(N), NODE(N), PERM(N) + INTEGER NEMIN +C N must be set to the matrix order. It is not altered. +C IPE(I) must be set equal to -(father of node I) or zero if +C node is a root, if NV(I) > 0. If NV(I) = 0, then I is +C subordinate variable of a supervariable and -IPE(I) points to +C principal variable. It is altered to point to its next +C younger brother if it has one, but otherwise is not changed. +C NV(I) must be set to zero if variable is a subordinate variable +C of a supervariable and to the degree otherwise. +C NV is not altered. +C IPS(I) need not be set. It is used temporarily to hold +C -(eldest son of node I) if it has one and 0 otherwise. It is +C finally set to hold the position of node I in the order. +C NE(IS) need not be set. It is set to the number of variables +C eliminated at stage IS of the elimination. +C NA(IS) need not be set. It is set to the number of elements +C assembled at stage IS of the elimination. +C NODE (I) need not be set before entry. It is used during the code +C to hold the number of subordinate variables for variable I and +C on output it holds +C the node (in dfs ordering) at which variable I is eliminated. +C It is also defined for subordinate variables. +C PERM is set to the new permutation after dfs of tree. PERM(I) is +C the position of variable I in the pivot order. +C ND(IS) need not be set. It is set to the degree at stage IS of +C the elimination. +C NSTEPS need not be set. It is set to the number of elimination steps. +C NEMIN is used to control the amalgamation process between +C a son and its father (if the number of fully summed +C variables of both nodes is smaller than NEMIN). +C SUBORD(I) need not be set. It holds the first subordinate variable +C for variable I if I +C is a principal variable and holds the next subordinate variable +C if otherwise. It is zero at the end of the chain. +C + INTEGER I,IF,IS,NR,NR1,INS,INL,INB,INF,INFS,INSW + INTEGER K,L,ISON,IN,IFSON,INO + INTEGER INOS,IB,IL,INT + INTEGER IPERM + +C +C Initialize IPS and NE. + DO 10 I=1,N + IPS(I) = 0 + NE(I) = 0 + NODE(I) = 0 + SUBORD(I) = 0 + 10 CONTINUE +C +C Set IPS(I) to -(eldest son of node I) and IPE(I) to next younger +C brother of node I if it has one. + NR = N + 1 + DO 50 I=1,N + IF = -IPE(I) + IF (NV(I).EQ.0) THEN +C I is a subordinate node, principal variable is IF + IF (SUBORD(IF).NE.0) SUBORD(I) = SUBORD(IF) + SUBORD(IF) = I + NODE(IF) = NODE(IF)+1 + ELSE +C Node IF is the father of node I. + IF (IF.NE.0) THEN +C IS is younger brother of node I. +C IPS(IF) will eventually point to - eldest son of IF. + IS = -IPS(IF) + IF (IS.GT.0) IPE(I) = IS + IPS(IF) = -I + ELSE +C I is a root node + NR = NR - 1 + NE(NR) = I + ENDIF + ENDIF + 50 CONTINUE +C +C We reorganize the tree so that the eldest son has maximum number of +C variables. We combine nodes when the number of variables in a son +C is greater than or equal to the number of variables in the father. +C If the eldest son has the maximum number of variables, +C and if a combination is possible, it has to be possible with +C the eldest son. +C +C FILS is just used as workspace during this reorganization and is reset +C afterwards. + + DO 999 I=1,N + FILS(I) = IPS(I) + 999 CONTINUE + + NR1 = NR + INS = 0 +C Jump if all roots processed. + 1000 IF (NR1.GT.N) GO TO 1151 +C Get next root + INS = NE(NR1) + NR1 = NR1 + 1 +C Depth first search through eldest sons. + 1070 INL = FILS(INS) + IF (INL.LT.0) THEN + INS = -INL + GO TO 1070 + ENDIF +C INS is leaf node. + + 1080 IF (IPE(INS).LT.0) THEN +C INS is youngest son otherwise IPE value would be positive. + INS = -IPE(INS) +C INS is now the father of the reorganized son so we can +C clear the pointer to the sons. + FILS(INS) = 0 +C Continue backtracking until we encounter node with younger brother. + GO TO 1080 + ENDIF + + IF (IPE(INS).EQ.0) THEN +C INS is a root, check for next one. + INS = 0 + GO TO 1000 + ENDIF +C INB is younger brother of INS. + INB = IPE(INS) + +C?? I think this test is the wrong way round + IF (NV(INB).GE.NV(INS)) THEN +C?? So reversed +C IF (NV(INS).GE.NV(INB)) THEN + INS = INB +C Do depth first search from younger brother + GO TO 1070 + ENDIF +C +C Exchange INB and INS +C Find previous brother of INS (could be the father) +C then we do depth first search with INS = INB +C + INF = INB + 1090 INF = IPE(INF) + IF (INF.GT.0) GO TO 1090 +C -INF IS THE FATHER + INF = -INF + INFS = -FILS(INF) +C INFS is eldest son of INF + IF (INFS.EQ.INS) THEN +C INS is eldest brother .. a role which INB now assumes + FILS(INF) = -INB + IPS(INF) = -INB + IPE(INS) = IPE(INB) + IPE(INB) = INS + ELSE + INSW = INFS + 1100 INFS = IPE(INSW) + IF (INFS.NE.INS) THEN + INSW = INFS + GO TO 1100 + ENDIF + IPE(INS) = IPE(INB) + IPE(INB) = INS + IPE(INSW)= INB + ENDIF + INS = INB +C Depth first search from moved younger brother + GO TO 1070 +C Set FRERE and FILS + 1151 DO 51 I=1,N + FRERE(I) = IPE(I) + FILS(I) = IPS(I) + 51 CONTINUE +C +C Depth-first search. +C IL holds the current tree level. Roots are at level N, their sons +C are at level N-1, etc. +C IS holds the current elimination stage. We accumulate the number +C of eliminations at stage is directly in NE(IS). The number of +C assemblies is accumulated temporarily in NA(IL), for tree +C level IL, and is transferred to NA(IS) when we reach the +C appropriate stage IS. + IS = 1 +C I is the current node. + I = 0 +C IPERM is used as pointer to setting permutation vector + IPERM = 1 + DO 160 K=1,N + IF (I.GT.0) GO TO 60 +C Pick up next root. +C Stop if all roots used (needed because of subordinate variables) + IF (NR.GT.N) GO TO 161 + I = NE(NR) + NE(NR) = 0 + NR = NR + 1 + IL = N + NA(N) = 0 +C Go to son for as long as possible, clearing father-son pointers +C in IPS as each is used and setting NA(IL)=0 for all levels +C reached. + 60 CONTINUE + DO 70 L=1,N + IF (IPS(I).GE.0) GO TO 80 + ISON = -IPS(I) + IPS(I) = 0 + I = ISON + IL = IL - 1 + NA(IL) = 0 + 70 CONTINUE + 80 CONTINUE +C?? Do we want to expand for subordinate variables +C Record position of node I in the order. + IPS(I) = K +C Add number of subordinate variables to variable I + NE(IS) = NE(IS) + NODE(I) + 1 + IF (IL.LT.N) NA(IL+1) = NA(IL+1) + 1 + NA(IS) = NA(IL) + ND(IS) = NV(I) + NODE(I) = IS + PERM(I) = IPERM + IPERM = IPERM + 1 +C Order subordinate variables to node I + IN = I + 777 IF (SUBORD(IN).EQ.0) GO TO 778 + IN = SUBORD(IN) + NODE(IN) = IS + PERM(IN) = IPERM + IPERM = IPERM + 1 + GO TO 777 +C Check for static condensation + 778 IF (NA(IS).NE.1) GO TO 90 + IF (ND(IS-1)-NE(IS-1).EQ.ND(IS)) GO TO 100 +C Check for small numbers of eliminations in both last two steps. + 90 IF (NE(IS).GE.NEMIN) GO TO 110 + IF (NA(IS).EQ.0) GO TO 110 + IF (NE(IS-1).GE.NEMIN) GO TO 110 + +C Combine the last two steps + 100 NA(IS-1) = NA(IS-1) + NA(IS) - 1 + ND(IS-1) = ND(IS) + NE(IS-1) + NE(IS-1) = NE(IS) + NE(IS-1) + NE(IS) = 0 + NODE(I) = IS-1 +C Find eldest son (IFSON) of node I (IS) +C Note that node I must have a son (node IS-1 is youngest) + IFSON = -FILS(I) +C Now find youngest son INO (he is node IS-1) + IN = IFSON + 102 INO = IN + IN = FRERE(IN) + IF (IN.GT.0) GO TO 102 +C Cannot be root node .. so points to father +C Merge node IS-1 (INO) into node IS (I) + NV(INO) = 0 +C IPE already set .. was father pointer now principal variable pointer +C Now make subsidiary nodes of INO into subsidiary nodes of I. +C Subordinate nodes of INO become subordinate nodes of I + IN = I + 888 IF (SUBORD(IN).EQ.0) GO TO 889 + IN = SUBORD(IN) + NODE(IN) = IS-1 + GO TO 888 + 889 SUBORD(IN) = INO + IN = INO + IF (SUBORD(IN).EQ.0) GO TO 887 + IN = SUBORD(IN) + IPE(IN) = -I + 887 CONTINUE + +C INOS is eldest son of INO + INOS = -FILS(INO) + +C Find elder brother of node INO +C First check to see if he is only son + IF (IFSON.EQ.INO) GO TO 107 + IN = IFSON + 105 INS = IN + IN = FRERE(IN) + IF (IN.NE.INO) GO TO 105 +C INS is older brother .. make him brother of first son of INO (ie INOS) +C and make INOS point to I now as father. +C Jump if there is no son of INO + IF (INOS.EQ.0) THEN +C Elder brother of INO just points to (new) father. + FRERE(INS) = -I + GO TO 120 + ELSE + FRERE(INS) = INOS + ENDIF +C INT is youngest brother of INOS. Make him point to (new) father. + 107 IN = INOS + IF (IN.EQ.0) GO TO 120 + 108 INT = IN + IN = FRERE(IN) + IF (IN.GT.0) GO TO 108 + FRERE(INT) = -I + GO TO 120 + 110 IS = IS + 1 + 120 IB = IPE(I) + IF (IB.GE.0) THEN +C Node I has a younger brother or is a root + IF (IB.GT.0) NA(IL) = 0 + I = IB + GO TO 160 + ELSE +C I has no brothers. Go to father of node I + I = -IB + IL = IL + 1 + ENDIF + 160 CONTINUE + 161 NSTEPS = IS - 1 + RETURN + END + SUBROUTINE MA57MD(N,NE,IRN,JCN,MAP,IRNPRM, + + LROW,PERM,COUNT,IDIAG) +C +C This subroutine is called by MA57A/AD and generates the map that +C reorders the user's input so that the upper triangle of the +C permuted matrix is held by rows. No check is made for duplicates. +C + INTEGER N,NE +C IRNPRM(N+NE) has this dimension to include possibility of no +C diagonals in input. + INTEGER IRN(NE),JCN(NE),MAP(NE),IRNPRM(N+NE),LROW(N),PERM(N), + + COUNT(N), + + IDIAG(N) +C N must be set to the matrix order. It is not altered. +C NE must be set to the number of entries input. It is not altered. +C IRN(K) and JCN(K), K=1,2,...,NE must be set to the row and column +C numbers of the entries. If entry (IRN(K),JCN(K)) lies in the +C lower triangular part of the permuted matrix, the values of +C IRN(K) and JCN(K) are interchanged. Otherwise, these arrays are +C not changed. +C MAP need not be set on input and on return holds the positions of +C entries when the permuted upper triangle is ordered by rows. +C LROW need not be set. On return, LROW(I),I=1,N holds the number of +C entries in row I of the permuted matrix. +C PERM(I) must be set to the position of variable I in the +C pivot order, I=1,2,...,N. +C COUNT is used for workspace. It is set to row counts and then +C accumulated row counts. +C IDIAG is used for workspace. It is used as pointer to diagonal entry +C that is first in the row. +C +C Local variables + INTEGER EXPNE,I,J,K +C I Row index +C J Column index +C K Position in IRN or JCN. + +C Accumulate row counts in COUNT, and interchange row and column +C numbers where necessary. + DO 10 I = 1,N +C Set to 1 since diagonal will always be present as first entry. + COUNT(I) = 1 +C IDIAG used first as flag to identify duplicate diagonals + IDIAG(I) = 0 + 10 CONTINUE + +C EXPNE counts number of entries plus missing diagonals + EXPNE = NE + N + DO 20 K = 1,NE + + I = IRN(K) + J = JCN(K) + + IF (MAX(I,J).GT.N .OR. MIN(I,J).LT.1) THEN + EXPNE = EXPNE - 1 + GO TO 20 + ENDIF + +C Check for duplicate diagonals + IF (I.EQ.J) THEN + I = PERM(I) + IF (IDIAG(I).GE.1) THEN + COUNT(I) = COUNT(I) + 1 + IDIAG(I) = IDIAG(I) + 1 + ELSE + IDIAG(I) = 1 + EXPNE = EXPNE - 1 + ENDIF + GO TO 20 + ENDIF + + IF (PERM(I).LT.PERM(J)) THEN + I = PERM(I) + COUNT(I) = COUNT(I) + 1 + ELSE + J = PERM(J) + COUNT(J) = COUNT(J) + 1 + END IF + + 20 CONTINUE +C +C Store row counts in LROW and accumulate row counts in COUNT. + LROW(1) = COUNT(1) + IDIAG(1) = MAX(IDIAG(1),1) + DO 30 I = 2,N + LROW(I) = COUNT(I) +C COUNT(I) set to point to position of last entry in row I of permuted +C upper triangle. + COUNT(I) = COUNT(I-1) + LROW(I) + IDIAG(I) = COUNT(I-1) + MAX(IDIAG(I),1) + 30 CONTINUE + +C Set diagonal entries in IRNPRM. This is done separately because some +C diagonals may not be present in the users input. + DO 35 I = 1,N + K = PERM(I) + IRNPRM(IDIAG(K)) = I + 35 CONTINUE +C +C Run through putting the entries in the right places. COUNT is used for +C holding running pointers and is left holding pointers to row +C starts. +C Count number of entries in expanded matrix (allowing for non-input +C diagonals) + DO 40 K = 1,NE + I = IRN(K) + J = JCN(K) + IF (MIN(I,J).LT.1 .OR. MAX(I,J).GT.N) THEN + MAP(K) = 0 + GO TO 40 + ENDIF + I = PERM(IRN(K)) + J = PERM(JCN(K)) + IF (I.EQ.J) THEN + MAP(K) = IDIAG(I) + IRNPRM(IDIAG(I)) = IRN(K) + IDIAG(I) = IDIAG(I) - 1 + ELSE + IF (I.GT.J) THEN + MAP(K) = COUNT(J) + IRNPRM(COUNT(J)) = IRN(K) + COUNT(J) = COUNT(J) - 1 + ELSE + MAP(K) = COUNT(I) + IRNPRM(COUNT(I)) = JCN(K) + COUNT(I) = COUNT(I) - 1 + ENDIF +C II = MIN(I,J) +C MAP(K) = COUNT(II) +C COUNT(I) = COUNT(II) - 1 + ENDIF + 40 CONTINUE + +C Set number of entries in expanded matrix + IDIAG(1) = EXPNE + RETURN + + END + SUBROUTINE MA57ND(N,LENR,NA,NE,ND,NSTEPS,LSTKI,LSTKR, + * INFO,RINFO) +C +C Storage and operation count evaluation. +C +C Evaluate number of operations and space required by factorization +C using MA57BD. The values given are exact only if no numerical +C pivoting is performed. +C +C N must be set to the matrix order. It is not altered. +C LENR is number of entries in upper triangle of each row of permuted +C matrix. It includes diagonal (no duplicates) and duplicates +C off-diagonal but excludes any out-of-range entries. +C NA,NE,ND must be set to hold, for each tree node, the number of stack +C elements assembled, the number of eliminations and the size of +C the assembled front matrix respectively. They are not altered. +C NSTEPS must be set to hold the number of tree nodes. It is not +C altered. +C LSTKI is used as a work array by MA57ND. +C LSTKR is used as a work array by MA57ND. +C +C Counts for operations and storage are accumulated in variables +C OPS,OPSASS,NRLTOT,NIRTOT,NRLNEC,NIRNEC,NRLADU,NIRADU. +C OPS number of multiplications and additions during factorization. +C OPSASS number of multiplications and additions during assembly. +C NRLADU,NIRADU real and integer storage respectively for the +C matrix factors. +C NRLTOT,NIRTOT real and integer storage respectively required +C for the factorization if no compresses are allowed. +C NRLNEC,NIRNEC real and integer storage respectively required for +C the factorization if compresses are allowed. +C MAXFRT is maximum front size + +C .. Scalar Arguments .. + INTEGER N,NSTEPS +C .. +C .. Array Arguments .. + INTEGER LENR(N),LSTKI(N),LSTKR(N),NA(NSTEPS), + + ND(NSTEPS),NE(NSTEPS),INFO(40) + DOUBLE PRECISION RINFO(20) +C .. +C .. Local Scalars .. + INTEGER I,IORG,ISTKI,ISTKR,ITOP,ITREE,JORG,K, + + LSTK,NASSR,NELIM,NFR,NSTK,NTOTPV,NZ1,NZ2 + DOUBLE PRECISION DELIM +C .. +C .. Intrinsic Functions .. + INTRINSIC MAX +C .. + DOUBLE PRECISION OPS,OPSASS + INTEGER NIRADU,NIRNEC,NIRTOT,NRLADU,NRLNEC,NRLTOT,MAXFRT + +C .. +C .. Executable Statements .. +C +C Accumulate number of nonzeros with indices in range in NZ1. +C Duplicates on the diagonal are ignored but NZ1 includes any +C diagonals not present on input and duplicates off the diagonal. + NZ1 = 0 + DO 40 I = 1,N + NZ1 = NZ1 + LENR(I) + 40 CONTINUE + NZ2 = NZ1 +C ISTKR,ISTKI Current number of stack entries in +C real and integer storage respectively. +C OPS,OPSASS,NRLADU,NIRADU,NIRTOT,NRLTOT,NIRNEC,NRLNEC,NZ2 are defined +C above. +C NZ2 Current number of original matrix entries not yet processed. +C NTOTPV Current total number of rows eliminated. +C ITOP Current number of elements on the stack. + ISTKI = 0 + ISTKR = 0 + OPS = 0.0D0 + OPSASS = 0.0D0 + NRLADU = 0 +C One location is needed to record the number of blocks actually used. + NIRADU = 3 +C Initialize to what is required in MA57BD (as opposed to MA57OD). + NIRTOT = NZ1+N+5 + NRLTOT = NZ1 + NIRNEC = NZ2+N+5 + NRLNEC = NZ2 + NTOTPV = 0 + ITOP = 0 + MAXFRT = 0 +C +C Each pass through this loop processes a node of the tree. + DO 100 ITREE = 1,NSTEPS + NELIM = NE(ITREE) + DELIM = NELIM + NFR = ND(ITREE) + MAXFRT = MAX(MAXFRT,NFR) + NSTK = NA(ITREE) +C Adjust storage counts on assembly of current frontal matrix. + NASSR = NELIM*(NELIM+1)/2 + NFR*NFR +C Data for no compresses so use original number, NZ1. + NRLTOT = MAX(NRLTOT,NRLADU+NASSR+ISTKR+NZ1) +C Data for compresses so use current number, NZ2. + NRLNEC = MAX(NRLNEC,NRLADU+NASSR+ISTKR+NZ2) + +C Decrease NZ2 by the number of entries in rows being eliminated at +C this stage. + DO 70 IORG = 1,NELIM + JORG = NTOTPV + IORG + OPSASS = OPSASS + LENR(JORG) + NZ2 = NZ2 - LENR(JORG) + 70 CONTINUE + + NTOTPV = NTOTPV + NELIM + +C Remove elements from the stack. There are ITOP elements on the +C stack with the appropriate entries in LSTKR and LSTKI giving +C the real and integer storage respectively for each stack +C element. + DO 80 K = 1,NSTK + LSTK = LSTKR(ITOP) + ISTKR = ISTKR - LSTK + OPSASS = OPSASS + LSTK + LSTK = LSTKI(ITOP) + ISTKI = ISTKI - LSTK + ITOP = ITOP - 1 + 80 CONTINUE + +C Accumulate nonzeros in factors and number of operations. + NRLADU = NRLADU + (NELIM*(NELIM+1))/2 + (NFR-NELIM)*NELIM + NIRADU = NIRADU + 2 + NFR + OPS = OPS + (DELIM* (12*NFR+6*NFR*NFR - (DELIM+1)* + + (6*NFR+6-(2*DELIM+1))))/6 + DELIM + + IF (NFR.GT.NELIM) THEN +C Stack remainder of element. + ITOP = ITOP + 1 + LSTKR(ITOP) = ((NFR-NELIM)*(NFR-NELIM+1))/2 + LSTKI(ITOP) = NFR - NELIM + 1 + ISTKI = ISTKI + LSTKI(ITOP) + ISTKR = ISTKR + LSTKR(ITOP) + ENDIF + +C Adjust integer counts to stack elements and allow for next front. + IF (ITREE.EQ.NSTEPS) THEN + NIRTOT = MAX(NIRTOT,NIRADU+ISTKI+NZ1) + NIRNEC = MAX(NIRNEC,NIRADU+ISTKI+NZ2) + ELSE + NIRTOT = MAX(NIRTOT,NIRADU+(N-NTOTPV+2)+ISTKI+NZ1) + NIRNEC = MAX(NIRNEC,NIRADU+(N-NTOTPV+2)+ISTKI+NZ2) + ENDIF + + 100 CONTINUE +C + +C Set INFO and RINFO + INFO(5) = NRLADU + INFO(6) = NIRADU + INFO(7) = MAXFRT + INFO(8) = NSTEPS + INFO(9) = NRLTOT + INFO(10) = NIRTOT + INFO(11) = NRLNEC + INFO(12) = NIRNEC + RINFO(1) = OPSASS + RINFO(2) = OPS + + RETURN + END + SUBROUTINE MA57OD(N,NE,A,LA,IW,LIW,LROW,PERM,NSTEPS,NSTK,NODE, + + DIAG,SCHNAB,PPOS,CNTL,ICNTL,INFO,RINFO,HOLD, + + BIGA) +C +C Factorization subroutine +C +C This subroutine operates on the input matrix ordered into a tentative +C pivot order by MA57BD and produces the matrices U and inv(D) +C of the factorization A = (U trans) D U, where D is a block +C diagonal matrix with blocks of order 1 and 2. Gaussian elimination +C is used with pivots of order 1 and 2, chosen according to the +C tentative pivot order unless stability considerations +C require otherwise. + INTEGER N,NE,LA +C SCHNAB is in fact of dimension 5, but must set to * for Fujitsu (and +C maybe other) compilers on very small matrices. + DOUBLE PRECISION A(LA),DIAG(N),SCHNAB(*),CNTL(5),RINFO(20),BIGA + INTEGER LIW,IW(LIW),LROW(N),PERM(N),NSTEPS,NSTK(NSTEPS), + + NODE(N),PPOS(N),ICNTL(20),INFO(40),HOLD(40) +C N must be set to the order of the matrix. It is not altered. +C NE must be set to the number of entries in the upper triangle of +C the permuted matrix. It is not altered. +C A must be set so that the upper triangle of the permuted matrix +C is held by rows in positions LA-NE+1 to LA. Explicit zero +C diagonals are stored. Duplicate entries are permitted +C and are summed. During the computation, active frontal matrices +C are held in A by rows. The working front is held in full form. +C Stacked elements are held by rows in packed form. +C On exit, entries 1 to INFO(10) of A hold real information on the +C factors and should be passed unchanged to MA57CD. For each block, +C the factorized block pivot precedes the rows of the out-of-pivot +C part held as a rectangular matrix by rows. +C The factorized pivot has the form: +C -1 T +C L D L +C +C where L is unit lower triangular, D is block diagonal with blocks +C of size 1 or 2. L and the diagonal part of D is held packed by +C columns and the off-diagonal entries of the 2*2 blocks of D are +C held from position IW(1). +C LA length of array A. A value for LA sufficient for the +C tentative pivot sequence will have been provided by MA57AD +C in variable INFO(11). LA is not altered. +C IW must be set on input so that IW(I+LIW-NE) holds the column +C index of the entry in A(I+LA-NE) for I = 1,..., NE. +C On exit, entries 1 to INFO(16) hold integer information on the +C factors and should be passed unchanged to MA57CD. +C IW(1) will be set to one greater than the number of entries in the +C factors. +C IW(2) points to the end of the factorization. +C IW(3) will be set to the number of block pivots actually used; +C this may be different from NSTEPS since numerical considerations +C may prevent us choosing pivots at some stages. +C Integer information on each block pivot row follows. For each +C block pivot row, we have: +C * no. of columns, +C * no. of rows, +C * list of column indices. The column indices for a +C 2x2 pivot are flagged negative. +C During the computation, the array is used to hold indexing +C information on stacked elements. IW stores the number of +C variables then a list of variables in the element. +C LIW must be set to the length of array IW. A value sufficient for the +C tentative pivot sequence will have been provided by MA57AD in +C variable INFO(12). LIW is not altered. +C LROW must be set so that LROW(I) holds the number of entries in row +C I (in permuted order) of the incoming matrix. LROW is not altered. +C PERM must be set so that PERM(I) holds the variable that is Ith in +C the tentative pivot order generated by MA57AD. PERM is not +C altered. +C NSTEPS must be set to the number of nodes in the tree from the +C analysis. It is the length of array NSTK. Its +C value will never exceed N. It is not altered. +C NSTK must be set so that NSTK(I) holds the number of +C stacked elements to be assembled at tree node I. +C NODE must be unchanged since return from MA57AD. NODE(I) gives +C the tree node at which variable I was eliminated in the +C analysis phase. It is of length N and is not altered. +C DIAG is only accessed if ICNTL(7) is equal to 4. +C In that case it must be set to the values of the diagonals of +C matrix. +C SCHNAB is only accessed if ICNTL(7) is equal to 4. It is used to hold +C parameters for the Schnabel-Eskow modification and max/min values +C of current diagonal. Specifically (using notation of S-E): +C SCHNAB(1) == GAMMA +C SCHNAB(2) == TAUBAR (in fact root of TAUBAR) +C SCHNAB(3) == MU +C SCHNAB(4) == Max entry on diag +C SCHNAB(5) == Min entry on diag +C PPOS is integer work array of dimension N. If I is a variable in +C the current front, PPOS(I) is used to indicate its position in the +C front. For any other uneliminated variable, PPOS(I) is set to N+1. +C CNTL must be set (perhaps by MA57ID) so that CNTL(1) holds the +C pivot threshold and CNTL(2) holds the pivot tolerance. +C ICNTL must be set (perhaps by MA57ID). Entries of ICNTL accessed +C by MA57OD are: +C ICNTL(2) is output unit for warning messages. +C ICNTL(7) is used to control pivoting. With the default value of 1, +C 1 x 1 and 2 x 2 pivots are used subject to passing a threshold +C tolerance. If ICNTL(7) is greater than 1 only 1 x 1 pivots will +C be used. If ICNTL(7) equal to 2, +C the subroutine will exit immediately a sign change or zero pivot +C is detected. If ICNTL(7) is equal to 3, the subroutine will +C continue the factorization unless a zero +C pivot is detected. If ICNTL(7) is equal to 4, the diagonal of +C the matrix will be modified so that all pivots are of the same. +C ICNTL(8) is used to control whether, on running out of space, the +C subroutine exits with an error return (ICNTL(8) = 0), or +C whether it saves some internal variables so that +C larger arrays can be allocated and the computation restarted +C from the point at which it failed. +C ICNTL(11) is the block size used by the Level 3 BLAS (default 32). +C RINFO(3) will be set to the number of floating-point operations +C required for the assembly. +C RINFO(4) will be set to the number of floating-point operations +C required for the factorization. RINFO(5) will be set to the +C number of extra flops needed for the use of GEMM. +C INFO(1) holds a diagnostic flag. It need not be set on entry. A zero +C value on exit indicates success. Possible nonzero values are +C -3 insufficient storage for A. +C -4 insufficient storage for IW. +C -5 zero pivot found when ICNTL(7) = 2 or 3. +C -6 change in sign of pivots when ICNTL(7) = 2. +C +4 matrix is singular +C +10 factorizations pauses because insufficient real space +C +11 factorizations pauses because insufficient integer space +C INFO(40) is used to accumulate number of reals discarded if +C elimination continues without restart when space is exhausted. +C + +C INFO(32) is set to number of zeros in the triangle of the factors +C INFO(33) is set to number of zeros in the rectangle of the factors +C INFO(34) is set to number of zero columns in rectangle of the factors +C Needed to compute these + INTEGER ZCOL,RPOS + +C +C Constants + DOUBLE PRECISION ZERO,HALF,ONE + PARAMETER (ZERO=0.0D0,HALF=0.5D0,ONE=1.0D0) +C +C Local variables + INTEGER AINPUT + DOUBLE PRECISION AMAX,AMULT1,AMULT2 + INTEGER APOS,APOSA,APOSB,APOSBB,APOSBK,APOSC,APOSI,APOSJ,APOSM, + + APOS1,APOS2,APOS3,APOS4,ASTK,ATRASH,BLK + DOUBLE PRECISION DELTA,DETPIV + INTEGER ELT + DOUBLE PRECISION FLOPSA,FLOPSB,FLOPSX + INTEGER I,I1,IASS,IBEG,IELL,IEND,IEXCH,IINPUT,INTSPA, + + IORG,IPIV,IPOS,IROW,ISNPIV,ISTK,ISWOP,IWNFS,IWPOS, + + J,JAY,JA1,JCOL,JJ,JJJ,JMAX,J1,J2,K, + + KB,KBLK,KCT,KR,KROW,K1,K2,L,LASPIV,LDIAG,LIELL, + + LP,LPIV, NBSTATIC + LOGICAL LASTBK,LTWO + INTEGER MAXFRT + DOUBLE PRECISION MAXPIV + INTEGER NASS,NBLK,NBLOC,NCMPBI,NCMPBR,NEIG,NELL,NFRONT,NIRBDU + DOUBLE PRECISION NORMJ + INTEGER NTWO +C LSTAT is .TRUE. is we can use static pivoting + LOGICAL SCHUR,LSTAT + INTEGER MPIV,NPIV,NPOTPV,NRLBDU,NSC1,NST, + + NSTACK(2),NSTKAC(2),NTOTPV, + + NUMORG,OFFDAG,PHASE,PIVBLK + DOUBLE PRECISION PIVOT + INTEGER PIVSIZ,POSELT,POSPV1,POSPV2,PTRA,PTRIRN,RLSPA, + + SIZBLK,SIZC,SIZF,TRLSPA,TINSPA,TOTSTA(2),WP,ZCOUNT + DOUBLE PRECISION RMAX,SWOP,TMAX,TOL,UU,ULOC,UTARG,STCTOL + +C AINPUT is the position of the first entry of the original matrix +C reals since the last compress. It is reset to the current +C part being processed when MA57PD is called. +C AMAX is used to record the largest entry in a row. +C AMULT1, AMULT2 are used to hold multipliers. +C Also used as temporary variables. +C APOS is a pointer to the start of the current front in A. +C APOSA holds the index of the current entry of the matrix A used to +C form the Schur complement as C = A*B +C APOSB holds the index of the current entry of the matrix B used to +C form the Schur complement as C = A*B +C APOSBB is a pointer to the start of the buffer before current front +C in A. It is different from APOS because of the way we store the +C factors and prevents us overwriting when generating them. +C APOSC holds the index of the current entry of the matrix C used to +C form the Schur complement as C = A*B +C APOSI is set to the beginning of a row in the working front or just +C ahead of this position. +C APOSJ is set to the beginning of row JMAX in working front. +C APOSM holds the index of the current entry of the multiplier matrix +C for the matrix B used to form the Schur complement as C = A*B for +C the part of the pivot rows outside the pivot block. +C APOS1 is a position in the array A. +C APOS2 is a position in the array A. +C APOS3 is the position in A of the first entry in the copy of U. +C APOS4 is the position in A of the first entry in the Schur complement. +C ASTK indicates position immediately before first stack entry. +C ATRASH is used as limit on space in A being set to zero. +C BLK is DO loop variable for blocks in pivot block. +C DELTA is the amount added to diagonal when in Phase 2 of matrix +C modification. +C DETPIV is the value of the determinant of the 2x2 pivot or +C candidate pivot. +C ELT is a DO loop variable indicating the element being processed. +C FLOPSA counts floating-point operations for assembly +C FLOPSB counts floating-point operations for elimination +C FLOPSX counts extra flops required by use of GEMM +C I is a DO loop variable. +C I1 is used to hold limit of DO loop. +C IASS is the index of the current tree node. +C IBEG is the position of the beginning of a row in A, used when +C performing elimination operations on the front. +C IELL Current element being assembled starts in position IELL of IW. +C IEND is the position of the end of a row in A, used when +C performing elimination operations on the front. +C IEXCH is used to hold the contents of an array entry when doing a +C swop. +C IINPUT is the position of the first entry of the original matrix +C integers since the last compress. It is reset to the current +C part being processed when MA57PD is called. with REAL = .FALSE. +C INTSPA is amount of integer workspace needed to progress to current +C point in elimination. +C IORG is a DO loop variable indicating which current row from the +C incoming matrix is being processed. +C IPIV is the current relative position of the pivot search. +C IPOS is used to hold (temporarily) a position in IW. +C IROW is a DO loop variable used when scanning a row of A. +C ISNPIV is +1 if first pivot is positive and -1 if it is negative. +C ISTK points to the bottom of the stack in IW (needed by compress). +C It indicates position immediately before first stack entry. +C ISWOP is used when swopping two integers. +C IWNFS points to the first free location for a variable that is not +C fully summed. +C IWPOS points to the first free position for factors in IW. +C J is a temporary variable. +C JA1 is a temporary index. +C JCOL is used as an index into array A. +C JJ and JJJ are Do loop indices. +C JMAX is the relative column index in the front of the largest +C off-diagonal in the fully summed part of the prospective pivot +C row. +C J1 and J2 are pointers to the beginning and end of a row segment +C in the array IW. They are also used as running pointers in IW. +C K is a temporary variable. +C KBLK Blocked GEMM is performed on a block KBLK by KBLK matrix. +C KCT counts the number of unchecked candidates in a pivot sweep. +C KR is pointer to the current row in the assembled block being +C tested for a potential pivot. +C KROW is a DO loop variable. +C K1 and K2 are used as running indices for array A. +C KB is block row index for blocked GEMM. +C L is a temporary variable. +C LASPIV is set to value of NPIV at end of previous block of pivots. +C LIELL is the order of the size of the reduced matrix from the front. +C This is the order of the stacked matrix. +C LPIV is the number of pivots selected in a block pivot. +C LASTBK is flag to indicate when we are processing last block of +C pivot block. +C LTWO is logical variable used to indicate if current pivot is a 2 x 2 +C pivot. +C MAXFRT is the maximum front size encountered so far. +C MAXPIV is the largest of two diagonal entries of a 2 x 2 pivot. +C NASS holds the number of fully assembled variables in +C the newly created element. +C NBLK is the number of block pivots used. +C NBLOC Number of rows of the Schur complement calculated by each GEMM +C reference. Set to ICNTL(11). +C NCMPBR, NCMPBI are the number of compresses on real and integer space +C respectively. +C NEIG is number of negative eigenvalues detected. +C NELL is used to hold the current number of son elements. +C NFRONT is the number of variables in the front. +C NIRBDU is number of integer entries in factors. +C NORMJ is used in matrix modification for 1-norm of off-diagonals. +C NTWO is the number of two by two full pivots used. +C SCHUR if set to .TRUE. then the Schur complement will be +C generated using Level 3 BLAS. +C MPIV is the number of pivots so far chosen in the current block. +C NPIV is the number of pivots so far chosen at the current node. +C NPOTPV is the total number of potential pivots so far. Variables +C PERM(1), PERM(2), .... PERM(NPOTPV) are fully assembled. +C NRLBDU is number of real entries in factors. +C NST temporary to hold NSC1+1 if NSC1 > 0, 0 otherwise. +C NSTACK(I), I = 1,2 hold the number of active entries on the +C real/integer stack. +C NSTKAC(I), I =1,2 hold the number of entries on the real/integer +C stack and original matrix after a compress. +C NTOTPV is the total number of pivots selected. This is used +C to determine whether the matrix is singular. +C NUMORG is the number of variables in the tentative pivot from the +C incoming original rows. +C OFFDAG is the position in A of the off-diagonal entry of a 2 x 2 +C pivot. +C PIVBLK Number of rows of each block when using GEMM in pivot block. +C Set to minimum of NBLOC and NASS. +C PIVOT is a temporary variable used to hold the value of the current +C pivot. +C PIVSIZ is order of current pivot (has value 1 or 2). +C POSELT is a pointer into the current element being assembled. +C POSPV1 is the position in A of a 1 x 1 pivot or the first diagonal +C of a 2 x 2 pivot. +C POSPV2 is the position in A of the second diagonal of a 2 x 2 pivot. +C PTRA points to the next original row in A. +C PTRIRN points to the next original row in IW. +C RLSPA is amount of real workspace needed to progress to current +C point in elimination. +C SIZBLK Number of rows in current block when using GEMM in pivot block. +C Set to minimum of PIVBLK and NASS - NPIV +C SIZC is set to number of rows in remainder of pivot block after +C blocking is done. +C SIZF is set to number of rows in remainder of pivot row (to NFRONT) +C after blocking is done. +C TOTSTA(I), I =1,2 hold the number of entries on the stack and +C original matrix. +C TRLSPA is amount of real workspace needed to progress to current +C point in elimination if no compresses on the data are performed. +C RMAX is used to record the largest entry in a row. +C SWOP is used when swopping two reals. +C TMAX is used to record the largest entry in a row. +C TOL is the tolerance against which singularity is judged. +C If static pivoting is used, then TOL is the value for this. +C UU is a local variable used to hold threshold parameter. Its value is +C between 0 and 0.5. +C ZCOUNT is number of "zero" rows in current front (used when +C ICNTL(16) is equal to 1). +C +C Procedures +C MA57PD compresses arrays. +C MA57WD adjusts signs in factors, moves the off-diagonal entries of +C full 2x2 pivots and updates counts. + +C?? To identify bug +C LOGICAL LCASE +C COMMON /CCASE/LCASE + + INTRINSIC MIN,MAX,ABS + EXTERNAL DGEMM,MA57PD,MA57WD + +C +C Initialization. + NBLOC = ICNTL(11) + TOL = CNTL(2) + LP = ICNTL(1) + WP = ICNTL(2) + LDIAG = ICNTL(5) + INFO(40) = 0 +C A local variable UU is used for the threshold parameter, so that +C CNTL(1) will remain unaltered. + UU = MIN(CNTL(1),HALF) + UU = MAX(UU,ZERO) + + LSTAT = .FALSE. +C Check if static pivoting option is on + IF (CNTL(4).GT.ZERO) THEN +C LSTAT is not now set until number of delayed pivots is CNTL(5)*N + IF (CNTL(5).EQ.ZERO) LSTAT = .TRUE. + UTARG = SQRT(UU/CNTL(4))*CNTL(4) + STCTOL = BIGA*CNTL(4) +C TOL = STCTOL + ENDIF + +C Action if we are returning in the middle of the factorization + IF (HOLD(1).GT.0) THEN + INFO(1) = 0 + NBLK = HOLD(2) + NTWO = HOLD(3) + INFO(23) = HOLD(4) + NCMPBR = 0 + NCMPBI = 0 + NEIG = HOLD(6) + MAXFRT = HOLD(7) +C Test compiler by commenting this out + IWPOS = HOLD(8) + APOS = HOLD(9) + APOSBB = HOLD(10) + NSTKAC(1) = HOLD(11) + NSTKAC(2) = HOLD(12) + AINPUT = HOLD(13) + IINPUT = HOLD(14) + ISTK = HOLD(15) + ASTK = HOLD(16) + INTSPA = HOLD(17) + RLSPA = HOLD(18) + PTRIRN = HOLD(19) + PTRA = HOLD(20) + NTOTPV = HOLD(21) + NPOTPV = HOLD(22) + NUMORG = HOLD(23) + NFRONT = HOLD(24) + NASS = HOLD(25) +C NCOL = HOLD(26) + IF (HOLD(1).EQ.1) NELL = HOLD(27) + IF (HOLD(1).EQ.2) NPIV = HOLD(27) + IASS = HOLD(28) + TINSPA = HOLD(29) + TRLSPA = HOLD(30) + TOTSTA(1) = HOLD(31) + TOTSTA(2) = HOLD(32) + NSTACK(1) = HOLD(33) + NSTACK(2) = HOLD(34) + INFO(32) = HOLD(37) + INFO(33) = HOLD(38) + INFO(34) = HOLD(39) + NBSTATIC = HOLD(40) + IF (ICNTL(7).GT.1) ISNPIV = HOLD(35) + IF (ICNTL(7).EQ.4) PHASE = HOLD(36) + IF (HOLD(1).EQ.2) NSC1 = NFRONT-NPIV + FLOPSA = RINFO(3) + FLOPSB = RINFO(4) + FLOPSX = RINFO(5) + IF (HOLD(1).EQ.1) THEN +C Real arrays expanded + HOLD(1) = 0 + GO TO 333 + ELSE + IF (HOLD(1).EQ.3) THEN +C We ran out of space when allocating values for zero pivots at the end +C of the factorization. This is most likely to happen when we +C are running with ICNTL(16) equal to 1 (dropping small entries +C from front). + HOLD(1) = 0 + GO TO 555 + ELSE +C Integer arrays expanded + HOLD(1) = 0 + GO TO 444 + ENDIF + ENDIF + ENDIF + +C NBSTATIC is the number of modified diagonal entries + NBSTATIC = 0 +C NBLK is the number of block pivots used. + NBLK = 0 +C NTWO is the number of 2 x 2 pivots used. + NTWO = 0 +C NCMPBR, NCMPBI are the number of compresses on real and integer space +C respectively. + NCMPBR = 0 + NCMPBI = 0 +C FLOPSA is the number of floating-point operations for assembly. + FLOPSA = ZERO +C FLOPSB is the number of floating-point operations for elimination. + FLOPSB = ZERO +C FLOPSX counts extra flops required by use of GEMM + FLOPSX = ZERO +C NEIG is number of negative eigenvalues detected. + NEIG = 0 +C MAXFRT is the maximum front size encountered so far. + MAXFRT = 0 +C All relevant INFO and RINFO parameters initialized to zero +C so they have a valid entry on any error return. + INFO(1) = 0 + INFO(2) = 0 + INFO(14:29) = 0 + INFO(31:35) = 0 + RINFO(3:5) = ZERO + RINFO(14:15) = ZERO + +C Initialization of array indicating positions of variables in front + DO 10 I = 1,N + PPOS(I) = N + 1 + 10 CONTINUE +C IWPOS is set to position for first index of first block pivot + IWPOS = 6 +C Set first five entries to dummies to avoid unassigned var in MA57ED + IW(1) = 0 + IW(2) = 0 + IW(3) = 0 + IW(4) = 0 + IW(5) = 0 +C APOSBB is a pointer to the next position for storing factors in A + APOSBB = 1 +C Initialize NSTKAC and INTSPA and RLSPA + NSTACK(1) = 0 + NSTACK(2) = 0 + NSTKAC(1) = NE + NSTKAC(2) = NE + TOTSTA(1) = NE + TOTSTA(2) = NE + INTSPA = NE+5+N + RLSPA = NE + TINSPA = NE+5+N + TRLSPA = NE +C PTRIRN points to the next original row in IW. + PTRIRN = LIW - NE + 1 +C PTRA points to the next original row in A. + PTRA = LA - NE + 1 +C ISTK points to the position in IW immediately before the stack. + ISTK = PTRIRN - 1 +C ASTK points to the position in A immediately before the stack. + ASTK = PTRA - 1 +C AINPUT is the position of the first entry of the original matrix +C reals since the last compress. It is reset to the current +C part being processed when MA57PD is called with REAL .TRUE. + AINPUT = PTRA +C IINPUT is the position of the first entry of the original matrix +C integers since the last compress. It is reset to the current +C part being processed when MA57PD is called. with REAL = .FALSE. + IINPUT = PTRIRN +C NTOTPV is the total number of pivots selected. + NTOTPV = 0 +C NPOTPV is the total number of potential pivots so far. + NPOTPV = 0 +C In case we run out of space before the first pivot is chosen, we +C must initialize ISNPIV. + IF (ICNTL(7).GT.1) ISNPIV = 0 + + +C Calculate diagonal of matrix and store in DIAG + IF (ICNTL(7).EQ.4) THEN + PHASE = 1 + DO 19 I = 1,N + DIAG(I) = ZERO + 19 CONTINUE + APOS1 = PTRA-1 + J1 = PTRIRN + DO 20 I = 1,N + J2 = J1 + LROW(I) - 1 + DO 25 JJ = J1,J2 + J = IW(JJ) + APOS1 = APOS1 + 1 + IF (J.EQ.PERM(I)) DIAG(J) = DIAG(J) + A(APOS1) + 25 CONTINUE + J1 = J2 + 1 + 20 CONTINUE + SCHNAB(1) = ONE + SCHNAB(5) = ZERO + DO 21 I = 1,N + SCHNAB(1) = MAX(SCHNAB(1),ABS(DIAG(I))) + SCHNAB(5) = MIN(SCHNAB(5),DIAG(I)) + 21 CONTINUE +C Set max entry on diag + SCHNAB(4) = SCHNAB(1) +C S+E has **2/3 .. Nick wants **1/3 + SCHNAB(2) = EPSILON(SCHNAB)**(1.0/3.0) + SCHNAB(3) = 0.1 +C Initialize RINFO(15) to compute smallest pivot in modified matrix + RINFO(15) = HUGE(RINFO) + DELTA = ZERO + ENDIF + +C ***************************************************************** +C * Each pass through this main loop performs all the operations * +C * associated with one node of the assembly tree. * +C ***************************************************************** + + IASS = 1 +C DO 2160 IASS = 1,NSTEPS + 2160 CONTINUE +C Find the frontal variables, ordered with the fully summed variables +C of the incoming rows first, the fully summed rows from previous +C steps next, followed by the rest in any order. + +C NUMORG is the number of variables in the tentative pivot from the +C incoming original rows. +C Calculate NUMORG and put indices of these fully summed rows in IW. + NUMORG = 0 + DO 30 I = NPOTPV + 1,N +C J is Ith variable in tentative pivotal sequence. + J = PERM(I) +C Jump if we have finished with variables in current node. + IF (ABS(NODE(J)).GT.IASS) GO TO 40 + IW(IWPOS+NUMORG) = J + NUMORG = NUMORG + 1 + PPOS(J) = NUMORG + 30 CONTINUE + +C NASS will be set to the total number of fully assembled variables in +C the newly created element. First set it to NUMORG. + 40 NASS = NUMORG +C Add indices of fully summed variables of stacked sons to IW. + NELL = NSTK(IASS) + IELL = ISTK + 1 + DO 70 ELT = 1,NELL + DO 50 JJ = IELL + 1,IELL + IW(IELL) + J = IW(JJ) + IF (NODE(J).GT.IASS) GO TO 50 +C Jump if variable already included. + IF (PPOS(J).LE.N) GO TO 50 + IW(IWPOS+NASS) = J + NASS = NASS + 1 + PPOS(J) = NASS + 50 CONTINUE + IELL = IELL + IW(IELL) + 1 + 70 CONTINUE +C IWNFS points to the first free location for a variable that is not +C fully summed. + IWNFS = IWPOS + NASS + +C Incorporate original rows. +C J1 is the position of the start of the first original row associated +C with this node of the assembly tree. + J1 = PTRIRN + DO 90 IORG = 1,NUMORG + J2 = J1 + LROW(NPOTPV+IORG) - 1 +C Run through index list of original row. + DO 80 JJ = J1,J2 + J = IW(JJ) +C Jump if variable already included. + IF (PPOS(J).LE.N) GO TO 80 + IW(IWNFS) = J + IWNFS = IWNFS + 1 + PPOS(J) = IWNFS - IWPOS + 80 CONTINUE + J1 = J2 + 1 + 90 CONTINUE + +C Now incorporate stacked elements. +C J1 is set to beginning +C J2 is set to end + IELL = ISTK + 1 + DO 170 ELT = 1,NELL + J1 = IELL+1 + J2 = IELL+IW(IELL) + DO 150 JJ = J1,J2 + J = IW(JJ) +C Jump if already assembled + IF (PPOS(J).LE.N) GO TO 150 + IW(IWNFS) = J + IWNFS = IWNFS + 1 + PPOS(J) = IWNFS - IWPOS + 150 CONTINUE + IELL = J2 + 1 + 170 CONTINUE + +C NFRONT is the number of variables in the front. + NFRONT = IWNFS - IWPOS + +C MAXFRT is the largest front size so far encountered. + MAXFRT = MAX(MAXFRT,NFRONT) + +C Set APOS to the position of first entry in frontal matrix. + IF (INFO(1).NE.-3) THEN +C Buffer space allocated so that triangular part of pivot can be stored +C without danger of overwrite. + APOS = APOSBB + (NASS*(NASS+1))/2 + ELSE + APOS = 1 + END IF +C +C Assemble reals into frontal matrix. +C +C Accumulate real space needed + RLSPA = MAX(RLSPA,INFO(40)+APOS+NFRONT*NFRONT-1+NSTKAC(1)) + TRLSPA = MAX(TRLSPA,INFO(40)+APOS+NFRONT*NFRONT-1+TOTSTA(1)) + +C If necessary, compress A. + + 333 IF (APOS+NFRONT*NFRONT-1.GT.ASTK) THEN + + + CALL MA57PD(A,IW,ASTK,AINPUT,PTRA,.TRUE.) + + NCMPBR = NCMPBR + 1 + IF (APOS+NFRONT*NFRONT-1.GT.ASTK) THEN + IF (ICNTL(8).NE.0) THEN +C Zero part of A to avoid failure in HSL_MA57 + DO 334 I = APOSBB,ASTK + A(I) = ZERO + 334 CONTINUE + HOLD(1) = 1 + HOLD(2) = NBLK + HOLD(3) = NTWO + HOLD(4) = INFO(23) + HOLD(5) = NCMPBI + HOLD(6) = NEIG + HOLD(7) = MAXFRT + HOLD(8) = IWPOS + HOLD(9) = APOS + HOLD(10) = APOSBB + HOLD(11) = NSTKAC(1) + HOLD(12) = NSTKAC(2) + HOLD(13) = AINPUT + HOLD(14) = IINPUT + HOLD(15) = ISTK + HOLD(16) = ASTK + HOLD(17) = INTSPA + HOLD(18) = RLSPA + HOLD(19) = PTRIRN + HOLD(20) = PTRA + HOLD(21) = NTOTPV + HOLD(22) = NPOTPV + HOLD(23) = NUMORG + HOLD(24) = NFRONT + HOLD(25) = NASS +C HOLD(26) = NCOL + HOLD(27) = NELL + HOLD(28) = IASS + HOLD(29) = TINSPA + HOLD(30) = TRLSPA + HOLD(31) = TOTSTA(1) + HOLD(32) = TOTSTA(2) + HOLD(33) = NSTACK(1) + HOLD(34) = NSTACK(2) + IF (ICNTL(7).GT.1) HOLD(35) = ISNPIV + IF (ICNTL(7).EQ.4) HOLD(36) = PHASE + HOLD(37) = INFO(32) + HOLD(38) = INFO(33) + HOLD(39) = INFO(34) + RINFO(3) =FLOPSA + RINFO(4) =FLOPSB + RINFO(5) =FLOPSX + HOLD(40) = NBSTATIC + INFO(35) = HOLD(40) + INFO(1) = 10 + RETURN + ELSE +C INFO(40) accumulates number of discards from factors. + INFO(40) = INFO(40) + APOS - 1 + APOS = 1 + APOSBB = 1 + INFO(1) = -3 + IF (NFRONT*NFRONT.GT.ASTK) THEN + INFO(17) = MAX(INFO(17),RLSPA) + IF (ICNTL(7).EQ.4) INFO(17) = MAX(INFO(17),RLSPA + N) + INFO(2) = LA + RETURN + ENDIF + ENDIF + ENDIF + END IF + + ATRASH = APOS + NFRONT*NFRONT - 1 +C Zero out appropriate part of A for incoming potential pivot rows. + DO 210 JJ = APOS,ATRASH + A(JJ) = ZERO + 210 CONTINUE + +C Incorporate reals from original rows. + J1 = PTRIRN + DO 230 IORG = 1,NUMORG +C APOSI indicates the position in A just before the beginning of the row +C being assembled. + J = PERM(NPOTPV+IORG) + APOSI = APOS + (PPOS(J)-1)*NFRONT - 1 + J2 = J1 + LROW(NPOTPV+IORG) - 1 + FLOPSA = FLOPSA + J2 - J1 + 1 + DO 220 JJ = J1,J2 + JAY = IW(JJ) +CCC +C Entries always in upper triangle because of ordering. +C Pivot permutations can only affect fully summed variables +C IF (PPOS(JAY).GE.PPOS(J)) THEN + APOS2 = APOSI + PPOS(JAY) +C ELSE +C APOS2 = APOS + (PPOS(JAY)-1)*NFRONT + PPOS(J) - 1 +C ENDIF + A(APOS2) = A(APOS2) + A(PTRA) + PTRA = PTRA + 1 + 220 CONTINUE +C AINPUT = AINPUT + J2 - J1 + 1 + NSTKAC(1) = NSTKAC(1) - J2 + J1 - 1 + J1 = J2 + 1 + 230 CONTINUE +C IINPUT = IINPUT + J2 - PTRIRN + NSTKAC(2) = NSTKAC(2) - J1 + PTRIRN + PTRIRN = J1 +C Update NPOTPV + NPOTPV = NPOTPV + NUMORG + +C??? +C?? Depends if we need lower triangle and whether all entries are +C already in upper triangle. +C Correct the leading NUMORG*NASS block to allow for having only +C assembled one of each pair of off-diagonal entries. +C DO 410 I = 1,NUMORG +C APOS2 points to the diagonal entry of row I. +C APOS2 = APOS + (NFRONT+1)* (I-1) +C DO 390 J = 1,NUMORG - I +C A(APOS2+J*NFRONT) = A(APOS2+J*NFRONT) + A(APOS2+J) +C 390 CONTINUE +C DO 400 J = 1,NASS - I +C A(APOS2+J) = A(APOS2+J*NFRONT) +C 400 CONTINUE +C 410 CONTINUE + +C Now assemble reals from stacked elements +C POSELT is a running pointer into that element. + DO 380 ELT = 1,NELL + POSELT = ASTK + 1 + LIELL = IW(ISTK+1) + J1 = ISTK + 2 + J2 = ISTK+1 + LIELL + FLOPSA = FLOPSA + (LIELL*(LIELL+1))/2 + DO 250 JJ = J1,J2 + J = IW(JJ) + APOS2 = APOS + (PPOS(J)-1)*NFRONT + APOS1 = POSELT + DO 240 JJJ=JJ,J2 + JAY = IW(JJJ) +C This part has been modified (2/11/04) +C??? APOS3 = APOS2 + PPOS(JAY) - 1 +C??? A(APOS3) = A(APOS3) + A(APOS1) +C To ensure there is valid entry in upper triangle +C??? APOS5 = APOS+(PPOS(JAY)-1)*NFRONT+PPOS(J)-1 +C??? IF (APOS3.NE.APOS5) A(APOS5) = A(APOS5) + A(APOS1) + IF (PPOS(JAY) .GE. PPOS(J)) THEN + APOS3 = APOS2 + PPOS(JAY) - 1 + ELSE + APOS3 = APOS+(PPOS(JAY)-1)*NFRONT+PPOS(J)-1 + ENDIF + A(APOS3) = A(APOS3) + A(APOS1) + APOS1 = APOS1 + 1 + 240 CONTINUE + POSELT = POSELT + LIELL - (JJ-J1) + 250 CONTINUE +C ISTK and ASTK updated to point to posn before next element on stack. + NSTKAC(2) = NSTKAC(2) - (J2-ISTK) + NSTACK(2) = NSTACK(2) - (J2-ISTK) + TOTSTA(2) = TOTSTA(2) - (J2-ISTK) + ISTK = J2 + ASTK = ASTK + (LIELL*(LIELL+1))/2 + NSTKAC(1) = NSTKAC(1) - (LIELL*(LIELL+1))/2 + NSTACK(1) = NSTACK(1) - (LIELL*(LIELL+1))/2 + TOTSTA(1) = TOTSTA(1) - (LIELL*(LIELL+1))/2 + 380 CONTINUE + +C IF (LCASE) THEN +C write(7,'(/A,I8/A,5I8)') '*** Frontal matrix before step', +C * IASS,'NFRONT,NASS,NUMORG,APOS,IWPOS', +C * NFRONT,NASS,NUMORG,APOS,IWPOS +C write(7,'(/A/(10I8))') 'IW array', +C * (IW(IWPOS+I-1),I=1,NFRONT) +C DO 1122 J = 1, NFRONT +C write(7,'(/A/(5D16.8))') 'Frontal matrix', +C * (A(APOS+I-1+(J-1)*NFRONT),I=1,NFRONT) +C1122 CONTINUE +C ENDIF + +C ****************** +C Each time round this loop, we sweep through the remainder +C of the assembled part of the front looking for pivots. +C ****************** + +C Set PIVBLK + PIVBLK = MIN(NBLOC,NASS) +C Set pointer to first entry in block + APOSBK = APOS +C NPIV is the number of pivots so far selected at the current node. + NPIV = 0 +C Set local value for U + ULOC = UU + +C Each pass through loop processes one block. + DO 918 BLK = 1,NASS +C Set last block flag + IF (NPIV+PIVBLK .GE. NASS) THEN + LASTBK = .TRUE. + SIZBLK = NASS - NPIV + ELSE + LASTBK = .FALSE. + SIZBLK = PIVBLK + ENDIF +C Record number of rows processed to date + LASPIV = NPIV +C MPIV is the number of pivots so far selected in the current block. + MPIV = 0 +C KR is relative position of current pivot candidate + KR = 0 +CCC Set to following to force 2 by 2 pivots in Nocedal examples +C KR = NUMORG +C KCT is set to one more than the number of unsearched pivot candidates + KCT = SIZBLK + 1 + +C Loop for pivot searches + 920 CONTINUE +C Increment pointer for circular sweep. + KR = KR + 1 + KCT = KCT - 1 + IF (KCT.EQ.0) GO TO 930 + IF (KR.GT.SIZBLK) KR = MPIV + 1 +C Check to see if no pivot was chosen is complete sweep of pivot block. +C We either take the diagonal entry or the 2 by 2 pivot with the +C largest fully summed off-diagonal at each stage. +C Note that IPIV is the position within the complete current front. + IPIV = LASPIV + KR +C APOSI is set to the beginning of row IPIV in working front. + APOSI = APOS + (IPIV-1)*NFRONT +C Set position and value of potential pivot. + POSPV1 = APOSI + IPIV - 1 + PIVOT = A(POSPV1) + + 29 IF (ICNTL(7).EQ.4) THEN + IF (PHASE.EQ.2) THEN +C In phase 2 of matrix modification (ICNTL(7) = 4) +C Compute quantity to add to diagonal +C Calculate norm of pivot row + IF (INFO(27).EQ.0) INFO(27) = NTOTPV + 1 + NORMJ = ZERO + DO 28 I = POSPV1+1,POSPV1+NFRONT-NPIV-1 + NORMJ = NORMJ + ABS(A(I)) + 28 CONTINUE + DELTA = MAX(ZERO, + * - A(POSPV1) + MAX(NORMJ,SCHNAB(2)*SCHNAB(1))) + A(POSPV1) = A(POSPV1) + DELTA + IF (A(POSPV1).EQ.ZERO) GO TO 970 + RINFO(15) = MIN(RINFO(15),A(POSPV1)) + DIAG(PERM(NTOTPV+1)) = DELTA + PIVSIZ = 1 + GO TO 811 + ENDIF + ENDIF + IF (ICNTL(7).GT.1) THEN +C Action if no pivoting requested + IF (ABS(PIVOT).LE.CNTL(2)) THEN + IF (ICNTL(7).LT.4) GO TO 970 +C We are now in phase 2 of matrix modification (ICNTL(7) = 4) + PHASE = 2 + GO TO 29 + ENDIF + IF (NTOTPV.EQ.0) THEN + IF (PIVOT.GT.ZERO) ISNPIV = 1 + IF (PIVOT.LT.ZERO) ISNPIV = -1 + ELSE + IF (ICNTL(7).EQ.2 .AND. ISNPIV*PIVOT.LT.ZERO) GO TO 980 + IF (ICNTL(7).EQ.3 .AND. ISNPIV*PIVOT.LT.ZERO) THEN + INFO(26) = INFO(26) + 1 + ISNPIV = -ISNPIV + ENDIF + ENDIF + IF (ICNTL(7).EQ.4) THEN + IF (PIVOT.GE.SCHNAB(1)*SCHNAB(2) .AND. + * SCHNAB(5).GE.-SCHNAB(3)*SCHNAB(4)) THEN +C Update and check values of future diagonals + SCHNAB(5) = ZERO + SCHNAB(4) = ZERO + DO 22 I = POSPV1+1,POSPV1+NFRONT-NPIV-1 + J = IW(IWPOS+NPIV+I-POSPV1) + DIAG(J) = DIAG(J) - A(I)*A(I)/PIVOT + SCHNAB(5) = MIN(DIAG(J),SCHNAB(5)) + SCHNAB(4) = MAX(DIAG(J),SCHNAB(4)) + IF (DIAG(J).LT.-SCHNAB(3)*SCHNAB(1)) THEN + PHASE = 2 + GO TO 29 + ENDIF + 22 CONTINUE + DIAG(PERM(NTOTPV+1)) = ZERO + RINFO(15) = MIN(RINFO(15),PIVOT) + ELSE + PHASE = 2 + GO TO 29 + ENDIF + ENDIF + PIVSIZ = 1 + GO TO 811 + ENDIF +C Find largest off-diagonal entry in the part of the row in which we +C seek a pivot. + AMAX = ZERO + JMAX = 0 +C Split loops in two because only upper triangle is held +C Scan lower triangle by scanning up column of upper triangle. + DO 110 K = 1, IPIV - NPIV - 1 + IF (ABS(A(POSPV1-K*NFRONT)).GT.AMAX) THEN + AMAX = ABS(A(POSPV1-K*NFRONT)) + JMAX = IPIV - K + ENDIF + 110 CONTINUE +C Scan upper triangle by scanning along row from first off-diagonal + DO 111 K = 1, MIN(NASS,LASPIV+PIVBLK) - IPIV + IF (ABS(A(POSPV1+K)).GT.AMAX) THEN + AMAX = ABS(A(POSPV1+K)) + JMAX = IPIV + K + ENDIF + 111 CONTINUE +C Do same for the other part. + RMAX = ZERO + +C restrict partial pivoting check to the fully summed block +C RMAX = STCTOL +C DO 112 K = MIN(NASS,LASPIV+PIVBLK)-IPIV+1,NASS +C NFRONT-IPIV +C RMAX = MAX(RMAX,ABS(A(POSPV1+K))) +C 112 CONTINUE + + DO 112 K = MIN(NASS,LASPIV+PIVBLK)-IPIV+1,NFRONT-IPIV + RMAX = MAX(RMAX,ABS(A(POSPV1+K))) + 112 CONTINUE + +C Action taken if matrix is singular. + IF (MAX(AMAX,RMAX,ABS(PIVOT)).LE.TOL) THEN +C Skip if all of row is zero. + GO TO 920 + END IF +C Jump if no nonzero entry in row of pivot block + IF (MAX(AMAX,ABS(PIVOT)).LE.TOL) GO TO 920 + PIVSIZ = 0 + IF (ABS(PIVOT).GT.ULOC*MAX(RMAX,AMAX)) THEN + PIVSIZ = 1 + A(POSPV1) = PIVOT +C 1 x 1 pivot is chosen + GO TO 810 + + END IF +C If there is only one remaining fully summed row and column exit. + IF (NPIV+1.EQ.NASS) THEN + A(POSPV1) = PIVOT + GO TO 920 + END IF + +C Jump if 2 x 2 candidate is diagonal + IF (AMAX.LE.TOL) GO TO 920 + +C Check block pivot of order 2 for stability. +C Find largest entry in row IPIV outwith the pivot. + IF (RMAX.LT.AMAX) THEN + RMAX = ZERO +C Split loops in two because only upper triangle is held +C Scan lower triangle by scanning up column of upper triangle. + DO 113 K = 1, IPIV - NPIV - 1 + IF (IPIV-K.EQ.JMAX) GO TO 113 + RMAX=MAX(RMAX,ABS(A(POSPV1-K*NFRONT))) + 113 CONTINUE +C Scan upper triangle by scanning along row from first off-diagonal + DO 114 K = 1, NFRONT - IPIV + IF (IPIV+K.EQ.JMAX) GO TO 114 + RMAX = MAX(RMAX,ABS(A(POSPV1+K))) + 114 CONTINUE + ENDIF + +C APOSJ is set to the beginning of row JMAX in working front. + APOSJ = APOS + (JMAX-1)*NFRONT +C POSPV2 is the position in A of the second diagonal of a 2 x 2 pivot. +C OFFDAG is the position in A of the off-diagonal of a 2 x 2 pivot. + POSPV2 = APOSJ + JMAX - 1 + IF (IPIV.GT.JMAX) THEN + OFFDAG = APOSJ + IPIV - 1 + ELSE + OFFDAG = APOSI + JMAX - 1 + END IF + +C Find largest entry in row JMAX outwith the pivot. + TMAX = ZERO +C Split loops in two because only upper triangle is held +C Scan lower triangle by scanning up column of upper triangle. + DO 115 K = 1, JMAX - NPIV - 1 + IF (JMAX-K.EQ.IPIV) GO TO 115 + TMAX=MAX(TMAX,ABS(A(POSPV2-K*NFRONT))) + 115 CONTINUE +C Scan upper triangle by scanning along row from first off-diagonal + DO 116 K = 1, NFRONT - JMAX + IF (JMAX+K.EQ.IPIV) GO TO 116 + TMAX = MAX(TMAX,ABS(A(POSPV2+K))) + 116 CONTINUE + + +C DETPIV is the value of the determinant of the 2x2 pivot. + DETPIV = A(POSPV1)*A(POSPV2) - AMAX*AMAX + MAXPIV = MAX(ABS(A(POSPV1)),ABS(A(POSPV2))) + IF (MAXPIV.EQ.ZERO) MAXPIV = ONE + IF (ABS(DETPIV)/MAXPIV.LE.TOL) GO TO 920 + PIVSIZ = 2 +C Check pivot for stability +C Jump if pivot fails test +C This is componentwise test + IF ((ABS(A(POSPV2))*RMAX+AMAX*TMAX)*ULOC.GT. + + ABS(DETPIV)) GO TO 920 + IF ((ABS(A(POSPV1))*TMAX+AMAX*RMAX)*ULOC.GT. + + ABS(DETPIV)) GO TO 920 +C 2 x 2 pivot is chosen + +C +C Pivot has been chosen. It has order PIVSIZ. + 810 LPIV = IPIV + IF (PIVSIZ.EQ.2) LPIV = MIN(IPIV,JMAX) +C Change made at Stephane's suggestion +CCC KR = MAX(KR,NPIV+PIVSIZ) + KR = MAX(KR,MPIV+PIVSIZ) + KCT = SIZBLK - MPIV - PIVSIZ + 1 + +C The following loop moves the pivot block to the top left +C hand corner of the uneliminated frontal matrix. + DO 860 KROW = NPIV,NPIV + PIVSIZ - 1 +C We jump if swop is not necessary. + IF (LPIV.EQ.KROW+1) GO TO 850 + +C Swop first part of rows (going down columns) +C JA1 is used as running index for row LPIV + JA1 = APOS + (LPIV-1) +C J1 is used as running index for row KROW+1 + J1 = APOS + KROW + DO 820 JJ = 1,KROW + SWOP = A(JA1) + A(JA1) = A(J1) + A(J1) = SWOP + JA1 = JA1 + NFRONT + J1 = J1 + NFRONT + 820 CONTINUE +C Swop middle part of rows (KROW+1 by rows, LPIV by columns) + JA1 = JA1 + NFRONT + J1 = J1 + 1 + DO 830 JJ = 1,LPIV - KROW - 2 + SWOP = A(JA1) + A(JA1) = A(J1) + A(J1) = SWOP + JA1 = JA1 + NFRONT + J1 = J1 + 1 + 830 CONTINUE +C Swop diagonals + SWOP = A(APOS+KROW* (NFRONT+1)) + A(APOS+KROW* (NFRONT+1)) = A(JA1) + A(JA1) = SWOP +C Swop last part of rows + DO 840 JJ = 1,NFRONT - LPIV + JA1 = JA1 + 1 + J1 = J1 + 1 + SWOP = A(JA1) + A(JA1) = A(J1) + A(J1) = SWOP + 840 CONTINUE +C Swop integer indexing information + IPOS = IWPOS + KROW + IEXCH = IWPOS + LPIV - 1 + ISWOP = IW(IPOS) + IW(IPOS) = IW(IEXCH) + IW(IEXCH) = ISWOP +C Set LPIV for the swop of the second row of block pivot. + 850 LPIV = MAX(IPIV,JMAX) + 860 CONTINUE + +C +C Set POSPV1 and POSPV2 to new position of pivots. + 811 POSPV1 = APOS + NPIV* (NFRONT+1) + POSPV2 = POSPV1 + NFRONT + 1 + IF (PIVSIZ.EQ.1) THEN +C Perform the elimination using entry A(POSPV1) as pivot. +C We store U and D inverse. +C Later we store D inverse U which is passed to the solution entry. + FLOPSB = FLOPSB + ONE + A(POSPV1) = ONE/A(POSPV1) + IF (A(POSPV1).LT.ZERO) NEIG = NEIG + 1 + J1 = POSPV1 + 1 + J2 = POSPV1 + NASS - (NPIV+1) + IBEG = POSPV1 + NFRONT + 1 + IEND = APOS + (NPIV+1)*NFRONT + NFRONT - 1 + DO 880 JJ = J1,J2 +C AMULT1 is used to hold the multiplier + AMULT1 = -A(JJ)*A(POSPV1) +C Hold original entry for GEMM multiply + IF (.NOT.LASTBK) A(POSPV1+(JJ-J1+1)*NFRONT) = A(JJ) + JCOL = JJ + FLOPSB = FLOPSB + (IEND-IBEG+1)*2 + 1 + IF (MPIV+JJ-J1+2.GT.PIVBLK) GO TO 871 +C The following special comment forces vectorization on +C Crays. +CDIR$ IVDEP + DO 870 IROW = IBEG,IEND + A(IROW) = A(IROW) + AMULT1*A(JCOL) + JCOL = JCOL + 1 + 870 CONTINUE + 871 A(JJ) = AMULT1 + IBEG = IBEG + NFRONT + 1 + IEND = IEND + NFRONT + 880 CONTINUE + NPIV = NPIV + 1 + MPIV = MPIV + 1 + NTOTPV = NTOTPV + 1 + +C IF (LCASE) THEN +C write(7,'(/A,I8/A,7I8)') '*** Frontal matrix at step',IASS, +C * 'NFRONT,NASS,NUMORG,APOS,IWPOS,NPIV,PIVSIZ', +C * NFRONT,NASS,NUMORG,APOS,IWPOS,NPIV,PIVSIZ +C write(7,'(/A/(10I8))') 'IW array', +C * (IW(IWPOS+I-1),I=1,NFRONT) +C write(7,'(/A/(5D16.8))') 'Frontal matrix', +C * ((A(APOS+I-1+(J-1)*NFRONT),I=1,NFRONT),J=1,NFRONT) +C write(7,'(/A/(5D16.8))') 'Frontal matrix', +C * (A(APOS+I-1),I=1,NFRONT*NFRONT) +C ENDIF + + IF (MPIV.EQ.SIZBLK) GO TO 930 + ELSE +C Perform elimination using block pivot of order two. +C Replace block pivot by its inverse. + OFFDAG = POSPV1 + 1 + FLOPSB = FLOPSB + 6.0 + + SWOP = A(POSPV2) + IF (DETPIV.LT.ZERO) THEN + NEIG = NEIG + 1 + ELSE + IF (SWOP.LT.ZERO) NEIG = NEIG + 2 + END IF + + A(POSPV2) = A(POSPV1)/DETPIV + A(POSPV1) = SWOP/DETPIV + A(OFFDAG) = -A(OFFDAG)/DETPIV + + J1 = POSPV1 + 2 + J2 = POSPV1 + NASS - (NPIV+1) +C J2 = POSPV1 + NFRONT - (NPIV+1) + IBEG = POSPV2 + NFRONT + 1 + IEND = APOS + (NPIV+2)*NFRONT + NFRONT - 1 + DO 900 JJ = J1,J2 + K1 = JJ + K2 = JJ + NFRONT + AMULT1 = - (A(POSPV1)*A(K1)+A(POSPV1+1)*A(K2)) + AMULT2 = - (A(POSPV1+1)*A(K1)+A(POSPV2)*A(K2)) + IF (.NOT.LASTBK) THEN + A(POSPV1 + (JJ-J1+2)*NFRONT) = A(K1) + A(POSPV1 + (JJ-J1+2)*NFRONT + 1) = A(K2) + ENDIF + FLOPSB = FLOPSB + (IEND-IBEG+1)*4 + 6 + IF (MPIV+JJ-J1+3.GT.PIVBLK) GO TO 891 +C The following special comment forces vectorization on +C Crays. +CDIR$ IVDEP + DO 890 IROW = IBEG,IEND + A(IROW) = A(IROW) + AMULT1*A(K1) + AMULT2*A(K2) + K1 = K1 + 1 + K2 = K2 + 1 + 890 CONTINUE + 891 A(JJ) = AMULT1 + A(JJ+NFRONT) = AMULT2 + IBEG = IBEG + NFRONT + 1 + IEND = IEND + NFRONT + 900 CONTINUE +C Flag column indices of 2 x 2 pivot. + IPOS = IWPOS + NPIV + IW(IPOS) = -IW(IPOS) + IW(IPOS+1) = -IW(IPOS+1) + NPIV = NPIV + 2 + MPIV = MPIV + 2 + NTOTPV = NTOTPV + 2 + NTWO = NTWO + 1 + +C IF (LCASE) THEN +C write(7,'(/A,I8/A,7I8)') '*** Frontal matrix at step',IASS, +C * 'NFRONT,NASS,NUMORG,APOS,IWPOS,NPIV,PIVSIZ', +C * NFRONT,NASS,NUMORG,APOS,IWPOS,NPIV,PIVSIZ +C write(7,'(/A/(10I8))') 'IW array', +C * (IW(IWPOS+I-1),I=1,NFRONT) +C write(7,'(/A/(5D16.8))') 'Frontal matrix', +C * ((A(APOS+I-1+(J-1)*NFRONT),I=1,NFRONT),J=1,NFRONT) +C write(7,'(/A/(5D16.8))') 'Frontal matrix', +C * (A(APOS+I-1),I=1,NFRONT*NFRONT) +C ENDIF + + IF (MPIV.EQ.SIZBLK) GO TO 930 + END IF + + GO TO 920 +C 920 CONTINUE + + 930 IF (LASTBK) THEN + IF (NPIV.EQ.NASS) GO TO 935 +C Jump if we do not have static pivoting switched on + IF (.NOT. LSTAT) GO TO 935 +C First reduce local value of threshold to see if we can find pivots + ULOC = ULOC/10.0D0 + IF (ULOC.LT.UTARG) THEN +C This stops us reducing it beyond UTARG +C At this point we stop looking for pivots in normal way and go to +C static pivoting option. + ULOC = ULOC * 10.0D0 + GO TO 9919 + ENDIF + KCT = SIZBLK + 1 - MPIV +C Search for pivots using new value of ULOC + GO TO 920 +C Some old experiments +C IF (ULOC.EQ.CNTL(4)) GO TO 9919 +C ULOC = MAX(ULOC*1.0D-2,CNTL(4)) +C IF (ABS(ULOC-CNTL(4))/CNTL(4) .LT. 10) ULOC = CNTL(4) +C KCT = SIZBLK + 1 - MPIV +C GO TO 920 + ENDIF + +C Check if any pivots chosen from this block. If not, increase PIVBLK +C and try again. + IF (MPIV.EQ.0) THEN + PIVBLK = 2*PIVBLK + GO TO 918 + ENDIF +C Finished pivoting on block BLK ... now update rest of pivot block +C using GEMM + KBLK = (NASS-(LASPIV+PIVBLK))/PIVBLK + L = NASS - (LASPIV+PIVBLK) + APOS4 = APOS+(LASPIV+PIVBLK)*(NFRONT+1) + DO 931 KB = 1,KBLK + FLOPSX = FLOPSX + PIVBLK*(PIVBLK-1)*MPIV + CALL DGEMM('N','N',L-(KB-1)*PIVBLK,PIVBLK,MPIV,ONE, + + A(APOSBK+PIVBLK*KB),NFRONT, + + A(APOSBK+PIVBLK*KB*NFRONT),NFRONT,ONE, + + A(APOS4+PIVBLK*(KB-1)*(NFRONT+1)),NFRONT) +C And now process the part of the pivot row outside the fs block + IF (NFRONT.GT.NASS) + + CALL DGEMM('N','T',NFRONT-NASS,PIVBLK,MPIV,ONE, + + A(APOSBK+NASS-LASPIV),NFRONT, + + A(APOSBK+PIVBLK*KB),NFRONT,ONE, + + A(APOSBK+KB*NFRONT*PIVBLK+NASS-LASPIV),NFRONT) + + 931 CONTINUE + + SIZC = NASS - (KBLK+1)*PIVBLK - LASPIV + SIZF = NFRONT - (KBLK+1)*PIVBLK - LASPIV + APOSA = APOSBK + (KBLK+1)*PIVBLK + DO 934 K = 1,MPIV + APOSB = APOSBK + NFRONT*PIVBLK*(KBLK+1) + K - 1 + APOSM = APOSBK + PIVBLK*(KBLK+1) + (K-1)*NFRONT + APOSC = APOSBK + PIVBLK*(KBLK+1)*(NFRONT+1) + DO 933 JJ = 1,SIZC + DO 932 J = JJ,SIZC + A(APOSC+J-1) = A(APOSC+J-1) + A(APOSA+J-1)*A(APOSB) + 932 CONTINUE +C And now process the part of the pivot row outside the fs block + DO 936 J = SIZC+1,SIZF + A(APOSC+J-1) = A(APOSC+J-1) + A(APOSA+J-1)*A(APOSM) + 936 CONTINUE + APOSC = APOSC + NFRONT + APOSB = APOSB + NFRONT + APOSM = APOSM + 1 + 933 CONTINUE + APOSA = APOSA + NFRONT + 934 CONTINUE + + APOSBK = APOSBK + MPIV*(NFRONT+1) + LASPIV = NPIV + +C IF (LCASE) THEN +C write(7,'(/A,I8/A,7I8)') '*** Frontal matrix at step',IASS, +C * 'NFRONT,NASS,APOS,IWPOS,NPIV', +C * NFRONT,NASS,APOS,IWPOS,NPIV +C write(7,'(/A,2I8)') 'After blocking .. APOSBK,LASPIV', +C * APOSBK,LASPIV +C write(7,'(/A/(10I8))') 'IW array', +C * (IW(IWPOS+I-1),I=1,NFRONT) +C write(7,'(/A/(5D16.8))') 'Frontal matrix', +C * ((A(APOS+I-1+(J-1)*NFRONT),I=1,NFRONT),J=1,NFRONT) +C write(7,'(/A/(5D16.8))') 'Frontal matrix', +C * (A(APOS+I-1),I=1,NFRONT*NFRONT) +C ENDIF + + 918 CONTINUE +C End of main elimination loop. +CCC +C IF (LP.GE.0) WRITE(LP,'(A)') '****** BE WORRIED LOOP 918' + +C SCHUR if set to .TRUE. then the Schur complement will be generated +C using level 3 BLAS at this step so an extra copy of pivot row is +C made. + + +C ************************* +C Do static pivoting * +C ************************* + 9919 IPIV = LASPIV+MPIV + 9920 IPIV = IPIV + 1 +CADD Probably not needed .. use only IPIV +C IF (KR.GT.SIZBLK) KR = MPIV + 1 +C Note that IPIV is the position within the complete current front. +C IPIV = LASPIV + KR +C APOSI is set to the beginning of row IPIV in working front. + APOSI = APOS + (IPIV-1)*NFRONT +C Set position and value of potential pivot. + POSPV1 = APOSI + IPIV - 1 + PIVOT = A(POSPV1) +CADD +C Although theses are not needed just now they are kept for when +C we use 2 x 2 static pivots. +CCC PIVSIZ = 1 +CCC LPIV = IPIV + +C Logic has changed so no need to calculate AMAX +C This is code from earlier experiments +CCC AMAX = ZERO +C Split loops in two because only upper triangle is held +C Scan lower triangle by scanning up column of upper triangle. +CCC DO 9876 K = 1, IPIV - NPIV - 1 +CCC AMAX = MAX(AMAX,ABS(A(POSPV1-K*NFRONT))) +CCC76 CONTINUE +C Scan upper triangle by scanning along row from first off-diagonal +CCC DO 9878 K = 1, NFRONT - IPIV +CCC AMAX = MAX(AMAX,ABS(A(POSPV1+K))) +CCC78 CONTINUE +C Check size of 1 x 1 pivot and adjust if necessary +C IF (ABS(A(POSPV1)).LT.CNTL(4)) THEN +C PIVOT = CNTL(4) +C IF (ABS(A(POSPV1)).LT.MAX(ULOC*AMAX,STCTOL)) THEN +C PIVOT = MAX(ULOC*AMAX,STCTOL) + + IF (ABS(A(POSPV1)).LT.STCTOL) THEN + PIVOT = STCTOL + IF (A(POSPV1) .LT. ZERO) THEN + A(POSPV1) = -PIVOT + PIVOT = -PIVOT + ELSE + A(POSPV1) = PIVOT + ENDIF + NBSTATIC = NBSTATIC + 1 + ENDIF + +C Perform the elimination using entry A(POSPV1) as pivot. +C We store U and D inverse. +C Later we store D inverse U which is passed to the solution entry. + FLOPSB = FLOPSB + ONE + A(POSPV1) = ONE/A(POSPV1) + IF (A(POSPV1).LT.ZERO) NEIG = NEIG + 1 + + J1 = POSPV1 + 1 + J2 = POSPV1 + NASS - (NPIV+1) + IBEG = POSPV1 + NFRONT + 1 + IEND = APOSI + 2*NFRONT - 1 + DO 9880 JJ = J1,J2 +C AMULT1 is used to hold the multiplier + AMULT1 = -A(JJ)*A(POSPV1) + JCOL = JJ + FLOPSB = FLOPSB + (IEND-IBEG+1)*2 + 1 +C The following special comment forces vectorization on +C Crays. +CDIR$ IVDEP + DO 9870 IROW = IBEG,IEND + A(IROW) = A(IROW) + AMULT1*A(JCOL) + JCOL = JCOL + 1 + 9870 CONTINUE + A(JJ) = AMULT1 + IBEG = IBEG + NFRONT + 1 + IEND = IEND + NFRONT + 9880 CONTINUE + NPIV = NPIV + 1 + MPIV = MPIV + 1 + NTOTPV = NTOTPV + 1 + +C IF (LCASE) THEN +C write(7,'(/A,I8/A,7I8)') '*** Frontal matrix at step',IASS, +C * 'NFRONT,NASS,NUMORG,APOS,IWPOS,NPIV,PIVSIZ', +C * NFRONT,NASS,NUMORG,APOS,IWPOS,NPIV,PIVSIZ +C write(7,'(/A/(10I8))') 'IW array', +C * (IW(IWPOS+I-1),I=1,NFRONT) +C write(7,'(/A/(5D16.8))') 'Frontal matrix', +C * ((A(APOS+I-1+(J-1)*NFRONT),I=1,NFRONT),J=1,NFRONT) +C write(7,'(/A/(5D16.8))') 'Frontal matrix', +C * (A(APOS+I-1),I=1,NFRONT*NFRONT) +C ENDIF + +C Get next static pivot + IF (MPIV.LT.SIZBLK) GO TO 9920 +C******************************** +C End of static pivoting loop * +C******************************** + + 935 SCHUR = (NBLOC.LT.(NFRONT-NASS) .AND. NPIV.GE.NBLOC) + IF (ICNTL(16).EQ.1) THEN +C Remove "zero" rows from fully summed rows within Schur complement +C ZCOUNT is count of "zero" rows + ZCOUNT = 0 +C APOS4 is beginning of block of fully summed uneliminated variables + APOS4 = APOS + NPIV*NFRONT + NPIV + +C Expand block so that lower triangle is included +C APOSB scans lower triangle by rows +C APOSC sweeps upper triangle by columns + APOSB = APOS4 + NFRONT + APOSC = APOS4 + 1 + DO 4444 I = 2,NASS-NPIV + DO 4443 J = 1,I-1 + A(APOSB) = A(APOSC) + APOSB = APOSB + 1 + APOSC = APOSC + NFRONT + 4443 CONTINUE + APOSB = APOS4 + NFRONT*I + APOSC = APOS4 + I + 4444 CONTINUE + +C Remove any zero rows by swopping with "first" row so that all zero +C rows will be swept to beginning of block +C Row I is the row currently being checked + I = NASS - NPIV +C Also exchange integer information accordingly + 4445 CONTINUE + IF (ZCOUNT.EQ.I) GO TO 4450 +C Check row I for zero +C APOSB is beginning of row I + APOSB = APOS4 + (I-1)*NFRONT + DO 4446 J = 1,NFRONT-NPIV + IF (ABS(A(APOSB+J-1)).GT.TOL) GO TO 4449 + 4446 CONTINUE +C Row is all zero + ZCOUNT = ZCOUNT + 1 +C Swop row ZCOUNT with row I + DO 4447 J = 1,NFRONT-NPIV + A(APOSB+J-1) = A(APOS4+NFRONT*(ZCOUNT-1)+J-1) + 4447 CONTINUE +C Zero row ZCOUNT + DO 4448 J = 1,NFRONT-NPIV + A(APOS4+NFRONT*(ZCOUNT-1)+J-1) = ZERO + 4448 CONTINUE +C Swop integers + ISWOP = IW(IWPOS+NPIV+ZCOUNT-1) + IW(IWPOS+NPIV+ZCOUNT-1) = IW(IWPOS+NPIV+I-1) + IW(IWPOS+NPIV+I-1) = ISWOP + GO TO 4445 + 4449 I = I - 1 + GO TO 4445 + 4450 CONTINUE + ELSE + ZCOUNT = 0 + ENDIF +C Set order of Schur complement (including rows of delayed pivots) +C But not including "zero" rows + NSC1 = NFRONT - NPIV - ZCOUNT + +C IF (LCASE) THEN +C write(7,'(/A,I8/A,5I8)') '*** Frontal matrix fter step',IASS, +C * 'NFRONT', +C * NFRONT +C write(7,'(/A/(10I8))') 'IW array', +C * (IW(IWPOS+I-1),I=1,NFRONT) +C write(7,'(/A/(5D16.8))') 'Frontal matrix', +C * ((A(APOS+I-1+(J-1)*NFRONT),I=1,NFRONT),J=1,NFRONT) +C write(7,'(/A/(5D16.8))') 'Frontal matrix', +C * (A(APOS+I-1),I=1,NFRONT*NFRONT) +C ENDIF + +C Accumulate total number of delayed pivots in INFO(23) +C Do not accumulate at last step where matrix is singular + IF (IASS.NE.NSTEPS) INFO(23) = INFO(23) + NASS - NPIV +C SET LSTAT + IF (CNTL(4).GT.ZERO .AND. INFO(23).GT.CNTL(5)*N) LSTAT = .TRUE. + +C Jump if no Schur complement to form ... just store factors. + IF (NSC1.EQ.0) GO TO 1830 + +C Save space for factors and Schur complement (if appropriate). + + IF (.NOT.SCHUR) THEN +C We now compute triangular Schur complement not using BLAS. +C This Schur complement is placed directly on the stack. + +C Remove these + RLSPA = MAX(RLSPA,INFO(40)+APOS+NFRONT*NFRONT-1+ + + NSTKAC(1)) + TRLSPA = MAX(TRLSPA,INFO(40)+APOS+NFRONT*NFRONT-1+ + + TOTSTA(1)) + NSTKAC(1) = NSTKAC(1) + ((NSC1+1)*NSC1)/2 + NSTACK(1) = NSTACK(1) + ((NSC1+1)*NSC1)/2 + TOTSTA(1) = TOTSTA(1) + ((NSC1+1)*NSC1)/2 + +C Initialize Schur complement +C Copying from the back to avoid overwriting important data + APOSI = APOS + NFRONT*NFRONT - 1 + DO 1370 JJ = 1,NFRONT-NPIV + J = APOSI + DO 1360 JJJ = 1,JJ + A(ASTK) = A(J) + ASTK = ASTK - 1 + J = J - 1 + 1360 CONTINUE + APOSI = APOSI - NFRONT + 1370 CONTINUE +C APOS4 is the position in A of the first entry in the Schur complement. + APOS4 = ASTK + 1 + + +C Perform pivoting operations. +C Initialize variables + J1 = IWPOS + LTWO = .FALSE. + POSPV1 = APOS + DO 1450 I1 = 1,NPIV + IF (LTWO) GO TO 1440 + APOSI = APOS + (I1-1)*NFRONT + NASS + J2 = APOS + NFRONT* (I1-1) + NFRONT - 1 +CCC What happens here ?? + APOSC = APOS4 + + * ((NASS-NPIV-ZCOUNT)*(2*NFRONT-NPIV-ZCOUNT-NASS+1))/2 +C Check to see if current pivot is 1 x 1 or 2 x 2. + IF (IW(J1).GT.0) THEN + FLOPSB = FLOPSB + (NFRONT-NASS) + + * (NFRONT-NASS)* (NFRONT-NASS+1) + DO 1410 JJ = APOSI,J2 + AMULT1 = -A(JJ)*A(POSPV1) + DO 1400 JJJ = JJ,J2 + A(APOSC) = A(APOSC) + AMULT1*A(JJJ) + APOSC = APOSC + 1 + 1400 CONTINUE + A(JJ) = AMULT1 + 1410 CONTINUE + J1 = J1 + 1 + ELSE + POSPV2 = POSPV1 + NFRONT + 1 + OFFDAG = POSPV1 + 1 + FLOPSB = FLOPSB + 6* (NFRONT-NASS) + + + 2* (NFRONT-NASS)* (NFRONT-NASS+1) + DO 1430 JJ = APOSI,J2 + AMULT1 = - (A(POSPV1)*A(JJ)+A(OFFDAG)*A(JJ+NFRONT)) + AMULT2 = -A(POSPV2)*A(JJ+NFRONT) - A(OFFDAG)*A(JJ) + DO 1420 JJJ = JJ,J2 + A(APOSC) = A(APOSC) + AMULT1*A(JJJ) + + + AMULT2*A(JJJ+NFRONT) + APOSC = APOSC + 1 + 1420 CONTINUE + A(JJ) = AMULT1 + A(JJ+NFRONT) = AMULT2 + 1430 CONTINUE + J1 = J1 + 2 + POSPV1 = POSPV2 + LTWO = .TRUE. + GO TO 1450 + END IF + + 1440 LTWO = .FALSE. +C Move to next pivot position + POSPV1 = POSPV1 + NFRONT + 1 + 1450 CONTINUE + +C IF (LCASE) THEN +C write(7,'(A,I8)') 'GEMM not used at stage',IASS +C write(7,'(A/(5D16.8))') 'Stacking Schur', +C * (A(I),I=APOS4,APOS4+(NSC1*(NSC1+1))/2-1) +C ENDIF + + ELSE + +C Action if SCHUR is true, We now use GEMM. + +C Since SCHUR is true, copy U, +C divide factors by D, and generate Schur complement using GEMM. +C Then compress factors (to upper trapezoidal), and stack +C half of the Schur complement. + +C APOS4 is position in A of first entry of Schur complement to be +C updated using GEMM. + APOS4 = APOS+NASS*(NFRONT+1) + +C APOS3 is the position in A of the first entry in the copy of U. + APOS3 = APOS+NASS*NFRONT + +C Copy U and divide factors by D +C Initialize variables + J1 = IWPOS + LTWO = .FALSE. + POSPV1 = APOS + DO 1490 I = 1,NPIV + IF (LTWO) GO TO 1480 + APOSI = APOS + (I-1)*NFRONT + NASS +C POSELT = APOS3 + (I-1)* (NFRONT-NASS) + POSELT = APOS3 + I - 1 +C Check to see if current pivot is 1 x 1 or 2 x 2. + IF (IW(J1).GT.0) THEN + FLOPSB = FLOPSB + (NFRONT-NASS) + DO 1460 JJ = APOSI,APOS + NFRONT*I - 1 + A(POSELT) = A(JJ) + A(JJ) = -A(JJ)*A(POSPV1) + POSELT = POSELT + NFRONT + 1460 CONTINUE + J1 = J1 + 1 + ELSE + POSPV2 = POSPV1 + NFRONT + 1 + OFFDAG = POSPV1 + 1 + FLOPSB = FLOPSB + 6* (NFRONT-NASS) + DO 1470 JJ = APOSI,APOS + NFRONT*I - 1 + A(POSELT) = A(JJ) +C A(POSELT+NFRONT-NASS) = A(JJ+NFRONT) + A(POSELT+1) = A(JJ+NFRONT) + A(JJ) = - (A(POSPV1)*A(JJ)+A(OFFDAG)*A(JJ+NFRONT)) + A(JJ+NFRONT) = -A(POSPV2)*A(JJ+NFRONT) - + + A(OFFDAG)*A(POSELT) + POSELT = POSELT + NFRONT + 1470 CONTINUE + J1 = J1 + 2 + POSPV1 = POSPV2 + LTWO = .TRUE. + GO TO 1490 + END IF + + 1480 LTWO = .FALSE. +C Move to next pivot position + POSPV1 = POSPV1 + NFRONT + 1 + 1490 CONTINUE + +C Now create Schur complement by using Level 3 BLAS GEMM. +C Jump if Schur complement is null. +C Increment FLOPSB + FLOPSB = FLOPSB + NPIV* (NFRONT-NASS)**2 + + * NPIV* (NFRONT-NASS) +C We divide the multiply into blocks to avoid too many extra +C computations when using GEMM with a symmetric result. +C Block formed by GEMM has NBLOC rows. + KBLK = ( NFRONT-NASS)/NBLOC + L = NFRONT - NASS + DO 1500 KB = 1,KBLK +C Accumulate extra flops caused by using GEMM + FLOPSX = FLOPSX + NBLOC* (NBLOC-1)* (NPIV) + CALL DGEMM('N','N',L-(KB-1)*NBLOC,NBLOC,NPIV,ONE, + + A(APOS+NASS+NBLOC*(KB-1)),NFRONT, + + A(APOS3+NBLOC*(KB-1)*NFRONT),NFRONT,ONE, + + A(APOS4+NBLOC*(NFRONT+1)*(KB-1)),NFRONT) + 1500 CONTINUE + +C Calculate the block upper triangular part of the Schur complement. + DO 1550 I = 1 + KBLK*NBLOC,L +C APOSA holds the index of the current entry of the matrix A used to +C form the Schur complement as C = A*B +C APOSB holds the index of the current entry of the matrix B used to +C form the Schur complement as C = A*B +C APOSC holds the index of the current entry of the matrix C used to +C form the Schur complement as C = A*B + APOSA = APOS + NASS + APOSB = APOS3 +(I-1)*NFRONT + APOSC = APOS4 + (I-1)*NFRONT - 1 + DO 1540 K = 1,NPIV + DO 1530 J = I,L + A(APOSC+J) = A(APOSC+J) + A(APOSA+J-1)*A(APOSB) + 1530 CONTINUE + APOSA = APOSA + NFRONT + APOSB = APOSB + 1 + 1540 CONTINUE + 1550 CONTINUE + +C Stack half of Schur complement. + +C Stack reals +C Stack in reverse order to avoid need for compresses. + JA1 = APOS+NFRONT*NFRONT-1 + NSTKAC(1) = NSTKAC(1) + ((NSC1+1)* (NSC1))/2 + NSTACK(1) = NSTACK(1) + ((NSC1+1)* (NSC1))/2 + TOTSTA(1) = TOTSTA(1) + ((NSC1+1)* (NSC1))/2 +C Stack by rows + DO 1710 I = NSC1,1,-1 + DO 1700 JJ = JA1,JA1-(NSC1-I),-1 + A(ASTK) = A(JJ) + ASTK = ASTK - 1 + 1700 CONTINUE + JA1 = JA1 - NFRONT + 1710 CONTINUE + +C IF (LCASE) THEN +C write(7,'(A,I8)') 'GEMM used at stage',IASS +C write(7,'(A/(5D16.8))') 'Stacking Schur', +C * (A(I),I=ASTK+1,ASTK+(NSC1*(NSC1+1))/2) +C ENDIF + +C END of SCHUR being true action (started after label 1450) + END IF + +C Stack integers + NSTKAC(2) = NSTKAC(2) + NSC1 + 1 + NSTACK(2) = NSTACK(2) + NSC1 + 1 + TOTSTA(2) = TOTSTA(2) + NSC1 + 1 +C Record space needed to this point + 1830 IF (IASS.EQ.NSTEPS) THEN + INTSPA = MAX(INTSPA,IWPOS+NFRONT-1+NSTKAC(2)) + TINSPA = MAX(TINSPA,IWPOS+NFRONT-1+TOTSTA(2)) + GO TO 2158 + ELSE + INTSPA = MAX(INTSPA,IWPOS+NFRONT-1+(N-NTOTPV+2)+NSTKAC(2)) + TINSPA = MAX(TINSPA,IWPOS+NFRONT-1+(N-NTOTPV+2)+TOTSTA(2)) + ENDIF + +C Check space and compress if necessary + 444 NST = 0 +C +1 for length of stacked entry + IF (NSC1.GT.0) NST = NSC1 + 1 + IF (IWPOS+NFRONT-1+(N-NTOTPV+2)+NST.GT.ISTK) THEN +C Compress integer storage + CALL MA57PD(A,IW,ISTK,IINPUT,PTRIRN,.FALSE.) + NCMPBI = NCMPBI + 1 + + IF (IWPOS+NFRONT-1+(N-NTOTPV+2)+NST.GT.ISTK) THEN +C Still insufficient space after compress + IF (ICNTL(8).NE.0) THEN + HOLD(1) = 2 + HOLD(2) = NBLK + HOLD(3) = NTWO + HOLD(4) = INFO(23) + HOLD(5) = NCMPBI + HOLD(6) = NEIG + HOLD(7) = MAXFRT + HOLD(8) = IWPOS + HOLD(9) = APOS + HOLD(10) = APOSBB + HOLD(11) = NSTKAC(1) + HOLD(12) = NSTKAC(2) + HOLD(13) = AINPUT + HOLD(14) = IINPUT + HOLD(15) = ISTK + HOLD(16) = ASTK + HOLD(17) = INTSPA + HOLD(18) = RLSPA + HOLD(19) = PTRIRN + HOLD(20) = PTRA + HOLD(21) = NTOTPV + HOLD(22) = NPOTPV + HOLD(23) = NUMORG + HOLD(24) = NFRONT + HOLD(25) = NASS +C HOLD(26) = NCOL + HOLD(27) = NPIV + HOLD(28) = IASS + HOLD(29) = TINSPA + HOLD(30) = TRLSPA + HOLD(31) = TOTSTA(1) + HOLD(32) = TOTSTA(2) + HOLD(33) = NSTACK(1) + HOLD(34) = NSTACK(2) + IF (ICNTL(7).GT.1) HOLD(35) = ISNPIV + IF (ICNTL(7).EQ.4) HOLD(36) = PHASE + HOLD(37) = INFO(32) + HOLD(38) = INFO(33) + HOLD(39) = INFO(34) + NSC1 = NFRONT-NPIV + RINFO(3) =FLOPSA + RINFO(4) =FLOPSB + RINFO(5) =FLOPSX + INFO(1) = 11 + HOLD(40) = NBSTATIC + INFO(35) = HOLD(40) + ELSE + INFO(1) = -4 + INFO(2) = LIW + INFO(18) = INTSPA + ENDIF + RETURN + END IF + END IF + + IF (NSC1.GT.0) THEN + DO 1720 I = 1,NSC1 + IW(ISTK) = IW(IWPOS+NFRONT-I) + ISTK = ISTK - 1 + 1720 CONTINUE +C write(11,'(A)') 'Stack integers' + IW(ISTK) = NSC1 +C write(11,'(A/(10I8))') 'IW ....',(IW(I),I=ISTK,ISTK+NSC1) + ISTK = ISTK - 1 + ENDIF + +C IF (LCASE) THEN +C write(7,'(/A,I8/A,5I8)') '*** Frontal matrix end step',IASS, +C * 'NFRONT', +C * NFRONT +C write(7,'(/A/(10I8))') 'IW array', +C * (IW(IWPOS+I-1),I=1,NFRONT) +C write(7,'(/A/(5D16.8))') 'Frontal matrix', +C * ((A(APOS+I-1+(J-1)*NFRONT),I=1,NFRONT),J=1,NFRONT) +C write(7,'(/A/(5D16.8))') 'Frontal matrix', +C * (A(APOS+I-1),I=1,NFRONT*NFRONT) +C ENDIF + +C Reset PPOS. + DO 1840 JJ = IWPOS + NPIV,IWPOS + NFRONT - 1 + J = ABS(IW(JJ)) + PPOS(J) = N + 1 + 1840 CONTINUE + + +C******************************** +C STORE FACTORS +C******************************** +C Complete the integer information in the factors + 2158 IF (NPIV.EQ.0) GO TO 2159 + NBLK = NBLK + 1 + + IW(IWPOS-2) = NFRONT + IW(IWPOS-1) = NPIV + IWPOS = IWPOS + NFRONT + 2 + +C Store information on the reals for the factors. +C We copy from A(JA1) to A(APOS2) ... the use of buffer space from +C APOSBB to APOS ensures no overwrites. + IF (INFO(1).EQ.-3) THEN + INFO(40) = INFO(40) + (NPIV * (2*NFRONT-NPIV+1))/2 + GO TO 2159 + END IF + + APOS2 = APOSBB +C Store reals from full pivot. + DO 2130 I = 1,NPIV +C JA1 points to the diagonal + JA1 = APOS + (I-1)* (NFRONT+1) + DO 2120 J = I,NPIV + A(APOS2) = A(JA1) + IF (A(APOS2).EQ.ZERO) INFO(32) = INFO(32) + 1 + APOS2 = APOS2 + 1 + JA1 = JA1 + 1 + 2120 CONTINUE + 2130 CONTINUE + RPOS = APOS2 +C Store rectangle + DO 2150 I = 1,NPIV + JA1 = APOS + (I-1)*NFRONT + NPIV + DO 2140 J = 1,NFRONT - NPIV + A(APOS2) = A(JA1) + APOS2 = APOS2 + 1 + JA1 = JA1 + 1 + 2140 CONTINUE + 2150 CONTINUE +C Set APOSBB for next block of factors + APOSBB = APOS2 + +C Check rectangle for zeros + DO 2152 J = 1,NFRONT-NPIV + APOS2 = RPOS+J-1 + ZCOL = 1 + DO 2151 I = 1,NPIV + IF (A(APOS2).EQ.ZERO) INFO(33) = INFO(33)+1 + IF (A(APOS2).NE.ZERO) ZCOL = 0 + APOS2 = APOS2 + NFRONT - NPIV + 2151 CONTINUE + IF (ZCOL.EQ.1) INFO(34) = INFO(34)+1 + 2152 CONTINUE + + 2159 IASS = IASS + 1 + IF (IASS.LE.NSTEPS) THEN +C Initialize to zero to avoid problem when calling MA57ED + IW(IWPOS-2) = 0 + IW(IWPOS-1) = 0 + GO TO 2160 + ENDIF +C2160 CONTINUE +C +C End of loop on tree nodes. +C + + INFO(35) = NBSTATIC + IF (INFO(1).EQ.-3) THEN + INFO(2) = LA + INFO(17) = MAX(INFO(17),RLSPA) + IF (ICNTL(7).EQ.4) INFO(17) = MAX(INFO(17),RLSPA + N) + RETURN + END IF + GO TO 1000 + 970 INFO(1) = -5 + INFO(2) = NTOTPV + 1 + IF (LDIAG.GT.0 .AND. LP.GE.0) + * WRITE(LP,99992) INFO(1),PIVOT,CNTL(2),INFO(2),ICNTL(7) +99992 FORMAT (/'*** Error message from routine MA57BD **', + * ' INFO(1) = ',I3/'Pivot has value ',D16.8,' when ', + * 'CNTL(2) has value ',D16.8/ + * 'at stage',I11,2X,'when ICNTL(7) =',I3) + RETURN + 980 INFO(1) = -6 + INFO(2) = NTOTPV + 1 + IF (LDIAG.GT.0 .AND. LP.GE.0) + * WRITE(LP,99993) INFO(1),INFO(2),ICNTL(7) +99993 FORMAT (/'*** Error message from routine MA57BD **', + * ' INFO(1) = ',I3/'Change in sign of pivot at stage', + * I10,2X,'when ICNTL(7) = ',I3) + RETURN + 1000 NRLBDU = APOSBB - 1 + NIRBDU = IWPOS - 3 + IF (NTOTPV.NE.N) THEN + INFO(1) = 4 + IF (LDIAG.GT.0 .AND. WP.GE.0) + * WRITE(WP,99994) INFO(1),NTOTPV +99994 FORMAT (/'*** Warning message from routine MA57BD **', + * ' INFO(1) =',I2/5X, 'Matrix is singular, rank =', I5) + ENDIF + +C Recent change was to remove condition that ICNTL(16) was equal to 1 +C More recent change to remove deficiency test. This change means that +C we now test there is sufficicent room to move the off-diagonal entries +C of the two by two pivots. +C 555 IF (NTOTPV.NE.N) THEN +C Check space (by this time there is nothing to compress) + 555 NRLBDU = APOSBB - 1 + NIRBDU = IWPOS - 3 + IF (NIRBDU+3*(N-NTOTPV) .GT. LIW + + .OR. NRLBDU+(N-NTOTPV)+NTWO .GT. LA) THEN +C I don't think this can happen ... at least I can't make it happen +C It is left in for "safety" :-) +C Still insufficient space after compress + IF (ICNTL(8).NE.0) THEN + HOLD(1) = 3 + HOLD(2) = NBLK + HOLD(3) = NTWO + HOLD(4) = INFO(23) + HOLD(5) = NCMPBI + HOLD(6) = NEIG + HOLD(7) = MAXFRT + HOLD(8) = IWPOS + HOLD(9) = APOS + HOLD(10) = APOSBB + HOLD(11) = NSTKAC(1) + HOLD(12) = NSTKAC(2) + HOLD(13) = AINPUT + HOLD(14) = IINPUT + HOLD(15) = ISTK + HOLD(16) = ASTK + HOLD(17) = INTSPA + HOLD(18) = RLSPA + HOLD(19) = PTRIRN + HOLD(20) = PTRA + HOLD(21) = NTOTPV + HOLD(22) = NPOTPV + HOLD(23) = NUMORG + HOLD(24) = NFRONT + HOLD(25) = NASS +C HOLD(26) = NCOL + HOLD(27) = NPIV + HOLD(28) = IASS + HOLD(29) = TINSPA + HOLD(30) = TRLSPA + HOLD(31) = TOTSTA(1) + HOLD(32) = TOTSTA(2) + HOLD(33) = NSTACK(1) + HOLD(34) = NSTACK(2) + IF (ICNTL(7).GT.1) HOLD(35) = ISNPIV + IF (ICNTL(7).EQ.4) HOLD(36) = PHASE + HOLD(37) = INFO(32) + HOLD(38) = INFO(33) + HOLD(39) = INFO(34) + NSC1 = NFRONT-NPIV + RINFO(3) =FLOPSA + RINFO(4) =FLOPSB + RINFO(5) =FLOPSX + IF (NRLBDU+(N-NTOTPV)+NTWO .GT. LA) INFO(1) = 10 + IF (NIRBDU+3*(N-NTOTPV) .GT. LIW) INFO(1) = 11 + HOLD(40) = NBSTATIC + INFO(35) = HOLD(40) + ELSE + IF (NIRBDU+3*(N-NTOTPV) .GT. LIW) THEN + INFO(1) = -4 + INFO(2) = LIW + INFO(18) = MAX(INTSPA,NIRBDU+3*(N-NTOTPV)) + ELSE + INFO(1) = -3 + INFO(2) = LA + INFO(17) = MAX(INFO(17),RLSPA,NRLBDU+(N-NTOTPV)+NTWO) + IF (ICNTL(7).EQ.4) INFO(17) = + + MAX(INFO(17),RLSPA + N,NRLBDU+(N-NTOTPV)+NTWO) + ENDIF + ENDIF + RETURN + ENDIF +C ENDIF + +C Add explicit entries in factors for zero pivots (now set to 1.0) +C Initialize flag array to identify indices of zero pivots + IF (N.NE.NTOTPV) THEN + DO 3331 I = 1,N + PPOS(I) = 0 + 3331 CONTINUE + IWPOS = 4 + DO 3332 I = 1,NBLK + NFRONT = IW(IWPOS) + NPIV = IW(IWPOS+1) + DO 3330 J = IWPOS+2,IWPOS+NPIV+1 + PPOS(ABS(IW(J))) = 1 + 3330 CONTINUE + IWPOS = IWPOS + NFRONT + 2 + 3332 CONTINUE + K= 0 + DO 3333 I=1,N + IF (PPOS(I).EQ.0) THEN + K=K+1 + NBLK = NBLK + 1 + NRLBDU = NRLBDU+1 + A(NRLBDU) = ONE + IW(NIRBDU+1) = 1 + IW(NIRBDU+2) = 1 + IW(NIRBDU+3) = I + NIRBDU = NIRBDU+3 + ENDIF + 3333 CONTINUE + ENDIF + +C + INFO(14) = NRLBDU +C Move the off-diagonal entries of the 2x2 pivots within full blocks +C to the end of A. + IW(1) = NRLBDU + 1 + IW(2) = NRLBDU + NTWO + INFO(15) = IW(2) + IW(3) = NBLK + INFO(31) = NBLK +C Negate the entries of L, move the off-diagonal entries of the 2x2 +C pivots within full blocks to the end of A and update NRLBDU to +C correspond + CALL MA57WD(A,LA,IW,LIW,NRLBDU) + INFO(16) = NIRBDU + INFO(18) = INTSPA + INFO(20) = TINSPA + INFO(17) = RLSPA + INFO(19) = TRLSPA + INFO(21) = MAXFRT + INFO(22) = NTWO +C INFO(23) .. computed as sum of NASS-NPIV + INFO(24) = NEIG + INFO(25) = NTOTPV + INFO(28) = NCMPBR + INFO(29) = NCMPBI + RINFO(3) = FLOPSA + RINFO(4) = FLOPSB + RINFO(5) = FLOPSX + IF (INFO(27).GT.0) THEN + RINFO(14) = ZERO + DO 332 I = 1,N + RINFO(14) = MAX(RINFO(14),DIAG(I)) + 332 CONTINUE + ENDIF + + RETURN + + END + + + SUBROUTINE MA57PD(A,IW,J1,J2,ITOP,REAL) +C This subroutine performs a very simple compress (block move). +C Entries J1+1 to J2-1 (incl.) in A or IW as appropriate are moved +C to occupy the positions immediately prior to position ITOP. +C A/IW hold the array being compressed. +C J1/J2 define the entries being moved. +C ITOP defines the position immediately after the positions to which +C J1 to J2 are moved. +C REAL must be set by the user to .TRUE. if the move is on array A, +C a value of .FALSE. will perform the move on A. +C .. Scalar Arguments .. + INTEGER ITOP,J1,J2 + LOGICAL REAL +C .. +C .. Array Arguments .. + DOUBLE PRECISION A(*) + INTEGER IW(*) +C .. +C .. Local Scalars .. + INTEGER IPOS,JJ +C .. +C .. Executable Statements .. + IF (J2.EQ.ITOP) GO TO 50 + IPOS = ITOP - 1 + IF (REAL) THEN + DO 10 JJ = J2-1,J1+1,-1 + A(IPOS) = A(JJ) + IPOS = IPOS - 1 + 10 CONTINUE + ELSE + DO 20 JJ = J2-1,J1+1,-1 + IW(IPOS) = IW(JJ) + IPOS = IPOS - 1 + 20 CONTINUE + ENDIF + J2 = ITOP + J1 = IPOS + 50 RETURN + END + SUBROUTINE MA57WD(A,LA,IW,LIW,NRLBDU) +C Negate the entries of L, move the off-diagonal entries of the 2x2 +C pivots within full blocks to the end of A and update NRLBDU to +C correspond. + INTEGER LA,LIW + DOUBLE PRECISION A(LA) + INTEGER IW(LIW) + + INTEGER NRLBDU + +C Constants + DOUBLE PRECISION ZERO + PARAMETER (ZERO=0.0D0) +C Local variables + INTEGER APOS,IBLK,IROW,IWPOS,J,JPIV,NCOLS,NROWS +C APOS Position in A of current diagonal entry. +C IBLK Current block. +C IROW Current row. +C IWPOS Current position in IW. +C J Do loop variable +C JPIV Used as a flag so that IPIV is incremented correctly after the +C use of a 2 by 2 pivot. +C NCOLS Number of columns in the block. +C NROWS Number of rows in the block. + + APOS = 1 + IWPOS = 6 + DO 40 IBLK = 1,IW(3) + NCOLS = IW(IWPOS-2) + NROWS = IW(IWPOS-1) + JPIV = 1 + DO 30 IROW = 1,NROWS + JPIV = JPIV - 1 + IF (JPIV.EQ.1) GO TO 10 + IF (IW(IWPOS+IROW-1).LT.0) THEN + JPIV = 2 + NRLBDU = NRLBDU + 1 + A(NRLBDU) = A(APOS+1) + A(APOS+1) = ZERO + END IF + + 10 DO 20 J = APOS + 1,APOS + NROWS - IROW + A(J) = -A(J) + 20 CONTINUE + APOS = APOS + NROWS - IROW + 1 + 30 CONTINUE +C Negate entries in rectangular block (was done earlier by MA47OD) +C DO 35 J = APOS,APOS+NROWS*(NCOLS-NROWS)-1 +C A(J) = -A(J) +C 35 CONTINUE + APOS = APOS + NROWS* (NCOLS-NROWS) + IWPOS = IWPOS + NCOLS + 2 + 40 CONTINUE + END + SUBROUTINE MA57XD(N,FACT,LFACT,IFACT,LIFACT,RHS,LRHS, + * W,LW,IW1,ICNTL) +C This subroutine performs forward elimination using the factors +C stored in FACT/IFACT by MA57BD. +C It is designed for efficiency on one right-hand side. + INTEGER N,LFACT + DOUBLE PRECISION FACT(LFACT) + INTEGER LIFACT,IFACT(LIFACT),LRHS,LW + DOUBLE PRECISION W(LW),RHS(LRHS) + INTEGER IW1(N),ICNTL(20) +C N must be set to the order of the matrix. It is not altered. +C FACT must be set to hold the real values corresponding to the +C factors. This must be unchanged since the preceding call to +C MA57BD. It is not altered. +C LFACT length of array FACT. It is not altered. +C IFACT holds the integer indexing information for the matrix factors +C in FACT. This must be unchanged since the preceding call to +C MA57BD. It is not altered. +C LIFACT length of array IFACT. It is not altered. +C RHS on input, must be set to hold the right hand side vector. On +C return, it will hold the modified vector following forward +C elimination. +C LHS must be set to the leading dimension of array RHS. +C W used as workspace to hold the components of the right hand +C sides corresponding to current block pivotal rows. +C LW must be set as the leading dimension of array W. It need not be +C larger than INFO(21) as returned from MA57BD. +C IW1 need not be set on entry. On exit IW1(I) (I = 1,NBLK), where +C NBLK = IFACT(3) is the number of block pivots, will +C hold pointers to the beginning of each block pivot in array IFACT. +C ICNTL Not referenced except: +C ICNTL(13) Threshold on number of columns in a block for using +C addressing using Level 2 and Level 3 BLAS. +C + +C Procedures + INTRINSIC ABS + EXTERNAL DGEMV,DTPSV + +C Constant + DOUBLE PRECISION ONE + PARAMETER (ONE=1.0D0) +C +C Local variables + INTEGER APOS,I,IBLK,II,IPIV,IRHS,IWPOS,J,J1,J2,K,K1,K2, + + NCOLS,NROWS + DOUBLE PRECISION W1,W2 +C +C APOS Current position in array FACT. +C I Temporary DO index +C IBLK Index of block pivot. +C II Temporary index. +C IPIV Pivot index. +C IRHS RHS index. +C IWPOS Position in IFACT of start of current index list. +C J Temporary DO index +C K Temporary pointer to position in real array. +C J1 Position in IFACT of index of leading entry of row. +C J2 Position in IFACT of index of trailing entry of row. +C NCOLS Number of columns in the block pivot. +C NROWS Number of rows in the block pivot. +C W1 RHS value. + + APOS = 1 + IWPOS = 4 + DO 270 IBLK = 1,IFACT(3) + +C Find the number of rows and columns in the block. + IW1(IBLK) = IWPOS + NCOLS = IFACT(IWPOS) + NROWS = IFACT(IWPOS+1) + IWPOS = IWPOS + 2 + + IF (NROWS.GT.4 .AND. NCOLS.GT.ICNTL(13)) THEN + +C Perform operations using direct addressing. + +C Load appropriate components of right-hand sides into W. + DO 10 I = 1,NCOLS + II = ABS(IFACT(IWPOS+I-1)) + W(I) = RHS(II) + 10 CONTINUE + + +C Treat diagonal block (direct addressing) + CALL DTPSV('L','N','U',NROWS,FACT(APOS),W,1) + APOS = APOS + (NROWS* (NROWS+1))/2 + +C Treat off-diagonal block (direct addressing) +C IF (NCOLS.GT.NROWS) CALL DGEMM('N','N',NCOLS-NROWS,1,NROWS, +C + ONE,FACT(APOS),NCOLS-NROWS, +C + W,LW,ONE,W(NROWS+1),LW) + IF (NCOLS.GT.NROWS) CALL DGEMV('N',NCOLS-NROWS,NROWS, + + ONE,FACT(APOS),NCOLS-NROWS, + + W,1,ONE,W(NROWS+1),1) + APOS = APOS + NROWS* (NCOLS-NROWS) + +C Reload W back into RHS. + DO 35 I = 1,NCOLS + II = ABS(IFACT(IWPOS+I-1)) + RHS(II) = W(I) + 35 CONTINUE + + ELSE + +C Perform operations using indirect addressing. + + J1 = IWPOS + J2 = IWPOS + NROWS - 1 + + +C Treat diagonal block (indirect addressing) + DO 130 IPIV = 1,NROWS + APOS = APOS + 1 + W1 = RHS(ABS(IFACT(J1))) + K = APOS + DO 100 J = J1+1,J2 + IRHS = ABS(IFACT(J)) + RHS(IRHS) = RHS(IRHS) - FACT(K)*W1 + K = K + 1 + 100 CONTINUE + APOS = K + J1 = J1 + 1 + 130 CONTINUE + +C Treat off-diagonal block (indirect addressing) +C J2 = IWPOS + NCOLS - 1 +C DO 136 IPIV = 1,NROWS +C K = APOS +C W1 = RHS(ABS(IFACT(IWPOS+IPIV-1))) +C DO 133 J = J1,J2 +C IRHS = ABS(IFACT(J)) +C RHS(IRHS) = RHS(IRHS) + W1*FACT(K) +C K = K + 1 +C 133 CONTINUE +C APOS = K +C 136 CONTINUE + +C Loop unrolling + J2 = IWPOS + NCOLS - 1 + DO 136 IPIV = 1,NROWS-1,2 + K1 = APOS + K2 = APOS+NCOLS-NROWS + W1 = RHS(ABS(IFACT(IWPOS+IPIV-1))) + W2 = RHS(ABS(IFACT(IWPOS+IPIV))) + DO 133 J = J1,J2 + IRHS = ABS(IFACT(J)) + RHS(IRHS) = RHS(IRHS) + W1*FACT(K1) + W2*FACT(K2) + K1 = K1 + 1 + K2 = K2 + 1 + 133 CONTINUE + APOS = K2 + 136 CONTINUE + + IF (MOD(NROWS,2).EQ.1) THEN + K = APOS + W1 = RHS(ABS(IFACT(IWPOS+IPIV-1))) + DO 137 J = J1,J2 + IRHS = ABS(IFACT(J)) + RHS(IRHS) = RHS(IRHS) + W1*FACT(K) + K = K + 1 + 137 CONTINUE + APOS = K + ENDIF + END IF + + IWPOS = IWPOS + NCOLS + 270 CONTINUE + + END + + + SUBROUTINE MA57YD(N,FACT,LFACT,IFACT,LIFACT,RHS,LRHS, + * W,LW,IW1,ICNTL) +C This subroutine performs backward elimination operations +C using the factors stored in FACT/IFACT by MA57BD. +C It is designed for efficiency on one right-hand side. + INTEGER N,LFACT + DOUBLE PRECISION FACT(LFACT) + INTEGER LIFACT,IFACT(LIFACT),LRHS,LW + DOUBLE PRECISION W(LW),RHS(LRHS) + INTEGER IW1(N),ICNTL(20) +C N must be set to the order of the matrix. It is not altered. +C FACT must be set to hold the real values corresponding to the +C factors. This must be unchanged since the +C preceding call to MA57BD. It is not altered. +C LFACT length of array FACT. It is not altered. +C IFACT holds the integer indexing information for the matrix factors +C in FACT. This must be unchanged since the preceding call to +C MA57BD. It is not altered. +C LIFACT length of array IFACT. It is not altered. +C RHS on entry, must be set to hold the right hand side modified by +C the forward substitution operations. On exit, holds the +C solution vector. +C LHS must be set to the leading dimension of array RHS. +C W used as workspace to hold the components of the right hand +C sides corresponding to current block pivotal rows. +C LW must be set as the leading dimension of array W. It need not be +C larger than INFO(21) as returned from MA57BD. +C IW1 on entry IW1(I) (I = 1,NBLK), where NBLK = IFACT(3) is the +C number of block pivots, must hold pointers to the beginning of +C each block pivot in array IFACT, as set by MA57X/XD. It is not +C altered. +C ICNTL Not referenced except: +C ICNTL(13) Threshold on number of columns in a block for using +C addressing using Level 2 and Level 3 BLAS. + +C Procedures + INTRINSIC ABS + EXTERNAL DGEMV,DTPSV + +C Constants + DOUBLE PRECISION ONE + PARAMETER (ONE=1.0D0) +C +C Local variables. + INTEGER APOS,APOS2,I,IBLK,II,IPIV,IRHS,IRHS1, + + IRHS2,IWPOS,J,JPIV,J1,J2,K,K2,LROW,NCOLS,NROWS + DOUBLE PRECISION W1,W2 +C APOS Current position in array FACT. +C APOS2 Current position in array FACT for off-diagonal entry of 2x2 +C pivot. +C I Temporary DO index +C IBLK Index of block pivot. +C II Temporary index. +C IPIV Pivot index. +C IRHS RHS index. +C IRHS1 RHS index. +C IRHS2 RHS index. +C IWPOS Position in IFACT of start of current index list. +C J Temporary DO index +C JPIV Has the value -1 for the first row of a 2 by 2 pivot and 1 for +C the second. +C K Temporary pointer to position in real array. +C J1 Position in IFACT of index of leading entry of row. +C J2 Position in IFACT of index of trailing entry of row. +C K Temporary variable. +C LROW Length of current row. +C NCOLS Number of columns in the block pivot. +C NROWS Number of rows in the block pivot. +C W1 RHS value. +C + APOS = IFACT(1) + APOS2 = IFACT(2) +C Run through block pivot rows in the reverse order. + DO 380 IBLK = IFACT(3),1,-1 + +C Find the number of rows and columns in the block. + IWPOS = IW1(IBLK) + NCOLS = ABS(IFACT(IWPOS)) + NROWS = ABS(IFACT(IWPOS+1)) + APOS = APOS - NROWS* (NCOLS-NROWS) + IWPOS = IWPOS + 2 + + IF (NROWS.GT.4 .AND. NCOLS.GT.ICNTL(13)) THEN + +C Perform operations using direct addressing. + +C Load latter part of right-hand side into W. + DO 5 I = NROWS + 1,NCOLS + II = ABS(IFACT(IWPOS+I-1)) + W(I) = RHS(II) + 5 CONTINUE + + +C Multiply by the diagonal matrix (direct addressing) + DO 10 IPIV = NROWS,1,-1 + IRHS = ABS(IFACT(IWPOS+IPIV-1)) + APOS = APOS - (NROWS+1-IPIV) + W(IPIV) = RHS(IRHS)*FACT(APOS) + 10 CONTINUE + JPIV = -1 + DO 20 IPIV = NROWS,1,-1 + IRHS = IFACT(IWPOS+IPIV-1) + IF (IRHS.LT.0) THEN + IRHS1 = -IFACT(IWPOS+IPIV-1+JPIV) + W(IPIV) = RHS(IRHS1)*FACT(APOS2) + W(IPIV) + IF (JPIV.EQ.1) APOS2 = APOS2 - 1 + JPIV = -JPIV + END IF + + 20 CONTINUE + +C Treat off-diagonal block (direct addressing) + K = NCOLS - NROWS + IF (K.GT.0) CALL DGEMV('T',K,NROWS,ONE, + + FACT(APOS+(NROWS*(NROWS+1))/2),K, + + W(NROWS+1),1,ONE,W,1) +C IF (K.GT.0) CALL DGEMM('T','N',NROWS,1,K,ONE, +C + FACT(APOS+(NROWS*(NROWS+1))/2),K, +C + W(NROWS+1),LW,ONE,W,LW) + +C Treat diagonal block (direct addressing) + CALL DTPSV('L','T','U',NROWS,FACT(APOS),W,1) +C Reload W back into RHS. + DO 60 I = 1,NROWS + II = ABS(IFACT(IWPOS+I-1)) + RHS(II) = W(I) + 60 CONTINUE + + ELSE +C +C Perform operations using indirect addressing. + J1 = IWPOS + J2 = IWPOS + NCOLS - 1 + + +C Multiply by the diagonal matrix (indirect addressing) + JPIV = -1 + DO 210 IPIV = NROWS,1,-1 + IRHS = IFACT(IWPOS+IPIV-1) + LROW = NROWS + 1 - IPIV + + IF (IRHS.GT.0) THEN +C 1 by 1 pivot. + APOS = APOS - LROW + RHS(IRHS) = RHS(IRHS)*FACT(APOS) + ELSE +C 2 by 2 pivot + IF (JPIV.EQ.-1) THEN + IRHS1 = -IFACT(IWPOS+IPIV-2) + IRHS2 = -IRHS + APOS = APOS - LROW - LROW - 1 + W1 = RHS(IRHS1)*FACT(APOS) + + + RHS(IRHS2)*FACT(APOS2) + RHS(IRHS2) = RHS(IRHS1)*FACT(APOS2) + + + RHS(IRHS2)*FACT(APOS+LROW+1) + RHS(IRHS1) = W1 + APOS2 = APOS2 - 1 + END IF + JPIV = -JPIV + END IF + + 210 CONTINUE + APOS = APOS + (NROWS* (NROWS+1))/2 + +C Treat off-diagonal block (indirect addressing) +C KK = APOS +C J1 = IWPOS + NROWS +C DO 220 IPIV = 1,NROWS +C IRHS = ABS(IFACT(IWPOS+IPIV-1)) +C W1 = RHS(IRHS) +C K = KK +C DO 215 J = J1,J2 +C W1 = W1 + FACT(K)*RHS(ABS(IFACT(J))) +C K = K + 1 +C 215 CONTINUE +C RHS(IRHS) = W1 +C KK = K +C 220 CONTINUE + +C Loop unrolling + K = APOS + J1 = IWPOS + NROWS + DO 220 IPIV = 1,NROWS-1,2 + IRHS = ABS(IFACT(IWPOS+IPIV-1)) + W1 = RHS(IRHS) + IRHS1 = ABS(IFACT(IWPOS+IPIV)) + W2 = RHS(IRHS1) + K2 = K+(NCOLS-NROWS) + DO 215 J = J1,J2 + II = ABS(IFACT(J)) + W1 = W1 + FACT(K)*RHS(II) + W2 = W2 + FACT(K2)*RHS(II) + K = K + 1 + K2 = K2 + 1 + 215 CONTINUE + RHS(IRHS) = W1 + RHS(IRHS1) = W2 + K = K2 + 220 CONTINUE + + IF (MOD(NROWS,2).EQ.1) THEN + IRHS = ABS(IFACT(IWPOS+IPIV-1)) + W1 = RHS(IRHS) + DO 216 J = J1,J2 + W1 = W1 + FACT(K)*RHS(ABS(IFACT(J))) + K = K + 1 + 216 CONTINUE + RHS(IRHS) = W1 + ENDIF + +C Treat diagonal block (indirect addressing) + J2 = IWPOS + NROWS - 1 + DO 260 IPIV = 1,NROWS + IRHS = ABS(IFACT(J1-1)) + APOS = APOS - IPIV + W1 = RHS(IRHS) + K = APOS + 1 + DO 230 J = J1,J2 + W1 = W1 - FACT(K)*RHS(ABS(IFACT(J))) + K = K + 1 + 230 CONTINUE + RHS(IRHS) = W1 + J1 = J1 - 1 + 260 CONTINUE + + END IF + + 380 CONTINUE + + END + + SUBROUTINE MA57VD(N,NZ,IRN,ICN,IW,LW,IPE,IQ,FLAG,IWFR, + + ICNTL,INFO) +C Is identical to subroutine MA27GD. Internal version for MA57. +C +C SORT PRIOR TO CALLING ANALYSIS ROUTINE MA27H/HD (internal MA57 +C subroutine MA57H/HD). +C +C GIVEN THE POSITIONS OF THE OFF-DIAGONAL NON-ZEROS OF A SYMMETRIC +C MATRIX, CONSTRUCT THE SPARSITY PATTERN OF THE OFF-DIAGONAL +C PART OF THE WHOLE MATRIX (UPPER AND LOWER TRIANGULAR PARTS). +C EITHER ONE OF A PAIR (I,J),(J,I) MAY BE USED TO REPRESENT +C THE PAIR. DIAGONAL ELEMENTS AND DUPLICATES ARE IGNORED. +C +C N MUST BE SET TO THE MATRIX ORDER. IT IS NOT ALTERED. +C NZ MUST BE SET TO THE NUMBER OF NON-ZEROS INPUT. IT IS NOT +C ALTERED. +C IRN(I),I=1,2,...,NZ MUST BE SET TO THE ROW NUMBERS OF THE +C NON-ZEROS ON INPUT. IT IS NOT ALTERED UNLESS IT IS EQUIVALENCED +C TO IW (SEE DESCRIPTION OF IW). +C ICN(I),I=1,2,...,NZ MUST BE SET TO THE COLUMN NUMBERS OF THE +C NON-ZEROS ON INPUT. IT IS NOT ALTERED UNLESS IT IS EQUIVALENCED +C TO IW (SEE DESCRIPTION OF IW). +C IW NEED NOT BE SET ON INPUT. ON OUTPUT IT CONTAINS LISTS OF +C COLUMN INDICES, EACH LIST BEING HEADED BY ITS LENGTH. +C IRN(1) MAY BE EQUIVALENCED TO IW(1) AND ICN(1) MAY BE +C EQUIVALENCED TO IW(K), WHERE K.GT.NZ. +C LW MUST BE SET TO THE LENGTH OF IW. IT MUST BE AT LEAST 2*NZ+N. +C IT IS NOT ALTERED. +C IPE NEED NOT BE SET ON INPUT. ON OUTPUT IPE(I) POINTS TO THE START OF +C THE ENTRY IN IW FOR ROW I, OR IS ZERO IF THERE IS NO ENTRY. +C IQ NEED NOT BE SET. ON OUTPUT IQ(I),I=1,N CONTAINS THE NUMBER OF +C OFF-DIAGONAL N0N-ZEROS IN ROW I INCLUDING DUPLICATES. +C FLAG IS USED FOR WORKSPACE TO HOLD FLAGS TO PERMIT DUPLICATE ENTRIES +C TO BE IDENTIFIED QUICKLY. +C IWFR NEED NOT BE SET ON INPUT. ON OUTPUT IT POINTS TO THE FIRST +C UNUSED LOCATION IN IW. +C ICNTL is an INTEGER array of assumed size. +C INFO is an INTEGER array of assumed size. +C +C .. Scalar Arguments .. + INTEGER IWFR,LW,N,NZ +C .. +C .. Array Arguments .. + INTEGER FLAG(N),ICN(*),IPE(N),IQ(N),IRN(*),IW(LW) + INTEGER ICNTL(*),INFO(*) +C .. +C .. Local Scalars .. + INTEGER I,ID,J,JN,K,K1,K2,L,LAST,LR,N1,NDUP +C .. +C .. Executable Statements .. +C +C INITIALIZE INFO(2) AND COUNT IN IPE THE +C NUMBERS OF NON-ZEROS IN THE ROWS AND MOVE ROW AND COLUMN +C NUMBERS INTO IW. + INFO(2) = 0 + DO 10 I = 1,N + IPE(I) = 0 + 10 CONTINUE + LR = NZ + IF (NZ.EQ.0) GO TO 120 + DO 110 K = 1,NZ + I = IRN(K) + J = ICN(K) + IF (I.LT.J) THEN + IF (I.GE.1 .AND. J.LE.N) GO TO 90 + ELSE IF (I.GT.J) THEN + IF (J.GE.1 .AND. I.LE.N) GO TO 90 + ELSE + IF (I.GE.1 .AND. I.LE.N) GO TO 80 + END IF + INFO(2) = INFO(2) + 1 + INFO(1) = 1 + IF (INFO(2).LE.1 .AND. ICNTL(2).GT.0) THEN + WRITE (ICNTL(2),FMT=60) INFO(1) + END IF + + 60 FORMAT (' *** WARNING MESSAGE FROM SUBROUTINE MA57AD', + + ' *** INFO(1) =',I2) + + IF (INFO(2).LE.10 .AND. ICNTL(2).GT.0) THEN + WRITE (ICNTL(2),FMT=70) K,I,J + END IF + + 70 FORMAT (I6,'TH NON-ZERO (IN ROW',I6,' AND COLUMN',I6, + + ') IGNORED') + + 80 I = 0 + J = 0 + GO TO 100 + + 90 IPE(I) = IPE(I) + 1 + IPE(J) = IPE(J) + 1 + 100 IW(K) = J + LR = LR + 1 + IW(LR) = I + 110 CONTINUE +C +C ACCUMULATE ROW COUNTS TO GET POINTERS TO ROW STARTS IN BOTH IPE AND IQ +C AND INITIALIZE FLAG + 120 IQ(1) = 1 + N1 = N - 1 + IF (N1.LE.0) GO TO 140 + DO 130 I = 1,N1 + FLAG(I) = 0 + IF (IPE(I).EQ.0) IPE(I) = -1 + IQ(I+1) = IPE(I) + IQ(I) + 1 + IPE(I) = IQ(I) + 130 CONTINUE + 140 LAST = IPE(N) + IQ(N) + FLAG(N) = 0 + IF (LR.GE.LAST) GO TO 160 + K1 = LR + 1 + DO 150 K = K1,LAST + IW(K) = 0 + 150 CONTINUE + 160 IPE(N) = IQ(N) + IWFR = LAST + 1 + IF (NZ.EQ.0) GO TO 230 +C +C RUN THROUGH PUTTING THE MATRIX ELEMENTS IN THE RIGHT PLACE +C BUT WITH SIGNS INVERTED. IQ IS USED FOR HOLDING RUNNING POINTERS +C AND IS LEFT HOLDING POINTERS TO ROW ENDS. + DO 220 K = 1,NZ + J = IW(K) + IF (J.LE.0) GO TO 220 + L = K + IW(K) = 0 + DO 210 ID = 1,NZ + IF (L.GT.NZ) GO TO 170 + L = L + NZ + GO TO 180 + + 170 L = L - NZ + 180 I = IW(L) + IW(L) = 0 + IF (I.LT.J) GO TO 190 + L = IQ(J) + 1 + IQ(J) = L + JN = IW(L) + IW(L) = -I + GO TO 200 + + 190 L = IQ(I) + 1 + IQ(I) = L + JN = IW(L) + IW(L) = -J + 200 J = JN + IF (J.LE.0) GO TO 220 + 210 CONTINUE + 220 CONTINUE +C +C RUN THROUGH RESTORING SIGNS, REMOVING DUPLICATES AND SETTING THE +C MATE OF EACH NON-ZERO. +C NDUP COUNTS THE NUMBER OF DUPLICATE ELEMENTS. + 230 NDUP = 0 + DO 280 I = 1,N + K1 = IPE(I) + 1 + K2 = IQ(I) + IF (K1.LE.K2) GO TO 240 +C ROW IS EMPTY. SET POINTER TO ZERO. + IPE(I) = 0 + IQ(I) = 0 + GO TO 280 +C ON ENTRY TO THIS LOOP FLAG(J).LT.I FOR J=1,2,...,N. DURING THE LOOP +C FLAG(J) IS SET TO I IF A NON-ZERO IN COLUMN J IS FOUND. THIS +C PERMITS DUPLICATES TO BE RECOGNIZED QUICKLY. + 240 DO 260 K = K1,K2 + J = -IW(K) + IF (J.LE.0) GO TO 270 + L = IQ(J) + 1 + IQ(J) = L + IW(L) = I + IW(K) = J + IF (FLAG(J).NE.I) GO TO 250 + NDUP = NDUP + 1 + IW(L) = 0 + IW(K) = 0 + 250 FLAG(J) = I + 260 CONTINUE + 270 IQ(I) = IQ(I) - IPE(I) + IF (NDUP.EQ.0) IW(K1-1) = IQ(I) + 280 CONTINUE + IF (NDUP.EQ.0) GO TO 310 +C +C COMPRESS IW TO REMOVE DUMMY ENTRIES CAUSED BY DUPLICATES. + IWFR = 1 + DO 300 I = 1,N + K1 = IPE(I) + 1 + IF (K1.EQ.1) GO TO 300 + K2 = IQ(I) + IPE(I) + L = IWFR + IPE(I) = IWFR + IWFR = IWFR + 1 + DO 290 K = K1,K2 + IF (IW(K).EQ.0) GO TO 290 + IW(IWFR) = IW(K) + IWFR = IWFR + 1 + 290 CONTINUE + IW(L) = IWFR - L - 1 + 300 CONTINUE + 310 RETURN + + END + SUBROUTINE MA57HD(N,IPE,IW,LW,IWFR,NV,NXT,LST,IPD,FLAG,IOVFLO, + + NCMPA,FRATIO) +C Was identical to subroutine MA27HD. Internal version for MA57. +C Changes made in September 2009 because of bug in compress control +C found by Nick. +C +C ANALYSIS SUBROUTINE +C +C GIVEN REPRESENTATION OF THE WHOLE MATRIX (EXCLUDING DIAGONAL) +C PERFORM MINIMUM DEGREE ORDERING, CONSTRUCTING TREE POINTERS. +C IT WORKS WITH SUPERVARIABLES WHICH ARE COLLECTIONS OF ONE OR MORE +C VARIABLES, STARTING WITH SUPERVARIABLE I CONTAINING VARIABLE I FOR +C I = 1,2,...,N. ALL VARIABLES IN A SUPERVARIABLE ARE ELIMINATED +C TOGETHER. EACH SUPERVARIABLE HAS AS NUMERICAL NAME THAT OF ONE +C OF ITS VARIABLES (ITS PRINCIPAL VARIABLE). +C +C N MUST BE SET TO THE MATRIX ORDER. IT IS NOT ALTERED. +C IPE(I) MUST BE SET TO POINT TO THE POSITION IN IW OF THE +C START OF ROW I OR HAVE THE VALUE ZERO IF ROW I HAS NO OFF- +C DIAGONAL NON-ZEROS. DURING EXECUTION IT IS USED AS FOLLOWS. IF +C SUPERVARIABLE I IS ABSORBED INTO SUPERVARIABLE J THEN IPE(I)=-J. +C IF SUPERVARIABLE I IS ELIMINATED THEN IPE(I) EITHER POINTS TO THE +C LIST OF SUPERVARIABLES FOR CREATED ELEMENT I OR IS ZERO IF +C THE CREATED ELEMENT IS NULL. IF ELEMENT I +C IS ABSORBED INTO ELEMENT J THEN IPE(I)=-J. +C IW MUST BE SET ON ENTRY TO HOLD LISTS OF VARIABLES BY +C ROWS, EACH LIST BEING HEADED BY ITS LENGTH. +C DURING EXECUTION THESE LISTS ARE REVISED AND HOLD +C LISTS OF ELEMENTS AND SUPERVARIABLES. THE ELEMENTS +C ALWAYS HEAD THE LISTS. WHEN A SUPERVARIABLE +C IS ELIMINATED ITS LIST IS REPLACED BY A LIST OF SUPERVARIABLES +C IN THE NEW ELEMENT. +C LW MUST BE SET TO THE LENGTH OF IW. IT IS NOT ALTERED. +C IWFR MUST BE SET TO THE POSITION IN IW OF THE FIRST FREE VARIABLE. +C IT IS REVISED DURING EXECUTION AND CONTINUES TO HAVE THIS MEANING. +C NV(JS) NEED NOT BE SET. DURING EXECUTION IT IS ZERO IF +C JS IS NOT A PRINCIPAL VARIABLE AND IF IT IS IT HOLDS +C THE NUMBER OF VARIABLES IN SUPERVARIABLE JS. FOR ELIMINATED +C VARIABLES IT IS SET TO THE DEGREE AT THE TIME OF ELIMINATION. +C NXT(JS) NEED NOT BE SET. DURING EXECUTION IT IS THE NEXT +C SUPERVARIABLE HAVING THE SAME DEGREE AS JS, OR ZERO +C IF IT IS LAST IN ITS LIST. +C LST(JS) NEED NOT BE SET. DURING EXECUTION IT IS THE +C LAST SUPERVARIABLE HAVING THE SAME DEGREE AS JS OR +C -(ITS DEGREE) IF IT IS FIRST IN ITS LIST. +C IPD(ID) NEED NOT BE SET. DURING EXECUTION IT +C IS THE FIRST SUPERVARIABLE WITH DEGREE ID OR ZERO +C IF THERE ARE NONE. +C FLAG IS USED AS WORKSPACE FOR ELEMENT AND SUPERVARIABLE FLAGS. +C WHILE THE CODE IS FINDING THE DEGREE OF SUPERVARIABLE IS +C FLAG HAS THE FOLLOWING VALUES. +C A) FOR THE CURRENT PIVOT/NEW ELEMENT ME +C FLAG(ME)=-1 +C B) FOR VARIABLES JS +C FLAG(JS)=-1 IF JS IS NOT A PRINCIPAL VARIABLE +C FLAG(JS)=0 IF JS IS A SUPERVARIABLE IN THE NEW ELEMENT +C FLAG(JS)=NFLG IF JS IS A SUPERVARIABLE NOT IN THE NEW +C ELEMENT THAT HAS BEEN COUNTED IN THE DEGREE +C CALCULATION +C FLAG(JS).GT.NFLG IF JS IS A SUPERVARIABLE NOT IN THE NEW +C ELEMENT THAT HAS NOT BEEN COUNTED IN THE DEGREE +C CALCULATION +C C) FOR ELEMENTS IE +C FLAG(IE)=-1 IF ELEMENT IE HAS BEEN MERGED INTO ANOTHER +C FLAG(IE)=-NFLG IF ELEMENT IE HAS BEEN USED IN THE DEGREE +C CALCULATION FOR IS. +C FLAG(IE).LT.-NFLG IF ELEMENT IE HAS NOT BEEN USED IN THE +C DEGREE CALCULATION FOR IS +C IOVFLO should be set to a high legitimate integer. It is used as a +C flag. +C NCMPA number of compresses. +C FRATIO is set to ICNTL(14)/100 and is the density of rows regarded as +C dense. +C +C .. Scalar Arguments .. + DOUBLE PRECISION FRATIO + INTEGER IWFR,LW,N,IOVFLO,NCMPA +C .. +C .. Array Arguments .. + INTEGER FLAG(N),IPD(N),IPE(N),IW(LW),LST(N),NV(N),NXT(N) +C .. +C .. Local Scalars .. + INTEGER I,ID,IDL,IDN,IE,IP,IS,JP,JP1,JP2,JS,K,K1,K2,KE,KP,KP0,KP1, + + KP2,KS,L,LEN,LIMIT,LN,LS,LWFR,MD,ME,ML,MS,NEL,NFLG,NP, + + NP0,NS,NVPIV,NVROOT,ROOT +C LIMIT Limit on number of variables for putting node in root. +C NVROOT Number of variables in the root node +C ROOT Index of the root node (N+1 if none chosen yet). +C .. +C .. External Subroutines .. + EXTERNAL MA57ZD +C .. +C .. Intrinsic Functions .. + INTRINSIC ABS,MIN +C .. +C If a column of the reduced matrix has relative density greater than +C CNTL(2), it is forced into the root. All such columns are taken to +C have sparsity pattern equal to their merged patterns, so the fill +C and operation counts may be overestimated. +C +C IS,JS,KS,LS,MS,NS are used to refer to supervariables. +C IE,JE,KE are used to refer to elements. +C IP,JP,KP,K,NP are used to point to lists of elements +C or supervariables. +C ID is used for the degree of a supervariable. +C MD is used for the current minimum degree. +C IDN is used for the no. of variables in a newly created element +C NEL is used to hold the no. of variables that have been +C eliminated. +C ME=MS is the name of the supervariable eliminated and +C of the element created in the main loop. +C NFLG is used for the current flag value in array FLAG. It starts +C with the value IOVFLO and is reduced by 1 each time it is used +C until it has the value 2 when it is reset to the value IOVFLO. +C +C .. Executable Statements .. +C Initializations + DO 10 I = 1,N + IPD(I) = 0 + NV(I) = 1 + FLAG(I) = IOVFLO + 10 CONTINUE + MD = 1 + NCMPA = 0 + NFLG = IOVFLO + NEL = 0 + ROOT = N+1 + NVROOT = 0 +C +C Link together variables having same degree + DO 30 IS = 1,N + K = IPE(IS) + IF (K.GT.0) THEN + ID = IW(K) + 1 + NS = IPD(ID) + IF (NS.GT.0) LST(NS) = IS + NXT(IS) = NS + IPD(ID) = IS + LST(IS) = -ID + ELSE +C We have a variable that can be eliminated at once because there is +C no off-diagonal nonzero in its row. + NEL = NEL + 1 + FLAG(IS) = -1 + NXT(IS) = 0 + LST(IS) = 0 + ENDIF + 30 CONTINUE + +C +C Start of main loop +C + DO 340 ML = 1,N + +C Leave loop if all variables have been eliminated. + IF (NEL+NVROOT+1.GE.N) GO TO 350 +C +C Find next supervariable for elimination. + DO 40 ID = MD,N + MS = IPD(ID) + IF (MS.GT.0) GO TO 50 + 40 CONTINUE + 50 MD = ID +C Nvpiv holds the number of variables in the pivot. + NVPIV = NV(MS) +C +C Remove chosen variable from linked list + NS = NXT(MS) + NXT(MS) = 0 + LST(MS) = 0 + IF (NS.GT.0) LST(NS) = -ID + IPD(ID) = NS + ME = MS + NEL = NEL + NVPIV +C IDN holds the degree of the new element. + IDN = 0 +C +C Run through the list of the pivotal supervariable, setting tree +C pointers and constructing new list of supervariables. +C KP is a pointer to the current position in the old list. + KP = IPE(ME) + FLAG(MS) = -1 +C IP points to the start of the new list. + IP = IWFR +C LEN holds the length of the list associated with the pivot. + LEN = IW(KP) + DO 140 KP1 = 1,LEN + KP = KP + 1 + KE = IW(KP) +C Jump if KE is an element that has not been merged into another. + IF (FLAG(KE).LE.-2) GO TO 60 +C Jump if KE is an element that has been merged into another or is +C a supervariable that has been eliminated. + IF (FLAG(KE).LE.0) THEN + IF (IPE(KE).NE.-ROOT) GO TO 140 +C KE has been merged into the root + KE = ROOT + IF (FLAG(KE).LE.0) GO TO 140 + END IF +C We have a supervariable. Prepare to search rest of list. + JP = KP - 1 + LN = LEN - KP1 + 1 + IE = MS + GO TO 70 +C Search variable list of element KE, using JP as a pointer to it. + 60 IE = KE + JP = IPE(IE) + LN = IW(JP) +C +C Search for different supervariables and add them to the new list, +C compressing when necessary. This loop is executed once for +C each element in the list and once for all the supervariables +C in the list. + 70 DO 130 JP1 = 1,LN + JP = JP + 1 + IS = IW(JP) +C Jump if IS is not a principal variable or has already been counted. + IF (FLAG(IS).LE.0) THEN + IF (IPE(IS).EQ.-ROOT) THEN +C IS has been merged into the root + IS = ROOT + IW(JP) = ROOT + IF (FLAG(IS).LE.0) GO TO 130 + ELSE + GO TO 130 + END IF + END IF + FLAG(IS) = 0 + +C To fix Nick bug need to add one here to store (eventually) length +C of new row + IF (IWFR .GE. LW-1) THEN +C Logic was previously as below +CCC IF (IWFR.LT.LW) GO TO 100 +C Prepare for compressing IW by adjusting pointers and +C lengths so that the lists being searched in the inner and outer +C loops contain only the remaining entries. + IPE(MS) = KP + IW(KP) = LEN - KP1 + IPE(IE) = JP + IW(JP) = LN - JP1 +C Compress IW + CALL MA57ZD(N,IPE,IW,IP-1,LWFR,NCMPA) +C Copy new list forward + JP2 = IWFR - 1 + IWFR = LWFR + IF (IP.GT.JP2) GO TO 90 + DO 80 JP = IP,JP2 + IW(IWFR) = IW(JP) + IWFR = IWFR + 1 + 80 CONTINUE +C Adjust pointers for the new list and the lists being searched. + 90 IP = LWFR + JP = IPE(IE) + KP = IPE(ME) + ENDIF + +C Store IS in new list. + IW(IWFR) = IS + IDN = IDN + NV(IS) + IWFR = IWFR + 1 +C Remove IS from degree linked list + LS = LST(IS) + LST(IS) = 0 + NS = NXT(IS) + NXT(IS) = 0 + IF (NS.GT.0) LST(NS) = LS + IF (LS.LT.0) THEN + LS = -LS + IPD(LS) = NS + ELSE IF (LS.GT.0) THEN + NXT(LS) = NS + END IF + 130 CONTINUE +C Jump if we have just been searching the variables at the end of +C the list of the pivot. + IF (IE.EQ.MS) GO TO 150 +C Set tree pointer and flag to indicate element IE is absorbed into +C new element ME. + IPE(IE) = -ME + FLAG(IE) = -1 + 140 CONTINUE + +C Store the degree of the pivot. + 150 NV(MS) = IDN + NVPIV + +C Jump if new element is null. + IF (IWFR.EQ.IP) THEN + IPE(ME) = 0 + GO TO 340 + ENDIF + + K1 = IP + K2 = IWFR - 1 +C +C Run through new list of supervariables revising each associated list, +C recalculating degrees and removing duplicates. + LIMIT = NINT(FRATIO*(N-NEL)) + DO 310 K = K1,K2 + IS = IW(K) + IF (IS.EQ.ROOT) GO TO 310 + IF (NFLG.GT.2) GO TO 170 +C Reset FLAG values to +/-IOVFLO. + DO 160 I = 1,N + IF (FLAG(I).GT.0) FLAG(I) = IOVFLO + IF (FLAG(I).LE.-2) FLAG(I) = -IOVFLO + 160 CONTINUE + NFLG = IOVFLO +C Reduce NFLG by one to cater for this supervariable. + 170 NFLG = NFLG - 1 +C Begin with the degree of the new element. Its variables must always +C be counted during the degree calculation and they are already +C flagged with the value 0. + ID = IDN +C Run through the list associated with supervariable IS + KP1 = IPE(IS) + 1 +C NP points to the next entry in the revised list. + NP = KP1 + KP2 = IW(KP1-1) + KP1 - 1 + DO 220 KP = KP1,KP2 + KE = IW(KP) +C Test whether KE is an element, a redundant entry or a supervariable. + IF (FLAG(KE).EQ.-1) THEN + IF (IPE(KE).NE.-ROOT) GO TO 220 +C KE has been merged into the root + KE = ROOT + IW(KP) = ROOT + IF (FLAG(KE).EQ.-1) GO TO 220 + END IF + IF (FLAG(KE).GE.0) GO TO 230 +C Search list of element KE, revising the degree when new variables +C found. + JP1 = IPE(KE) + 1 + JP2 = IW(JP1-1) + JP1 - 1 + IDL = ID + DO 190 JP = JP1,JP2 + JS = IW(JP) +C Jump if JS has already been counted. + IF (FLAG(JS).LE.NFLG) GO TO 190 + ID = ID + NV(JS) + FLAG(JS) = NFLG + 190 CONTINUE +C Jump if one or more new supervariables were found. + IF (ID.GT.IDL) GO TO 210 +C Check whether every variable of element KE is in new element ME. + DO 200 JP = JP1,JP2 + JS = IW(JP) + IF (FLAG(JS).NE.0) GO TO 210 + 200 CONTINUE +C Set tree pointer and FLAG to indicate that element KE is absorbed +C into new element ME. + IPE(KE) = -ME + FLAG(KE) = -1 + GO TO 220 +C Store element KE in the revised list for supervariable IS and flag it. + 210 IW(NP) = KE + FLAG(KE) = -NFLG + NP = NP + 1 + 220 CONTINUE + NP0 = NP + GO TO 250 +C Treat the rest of the list associated with supervariable IS. It +C consists entirely of supervariables. + 230 KP0 = KP + NP0 = NP + DO 240 KP = KP0,KP2 + KS = IW(KP) + IF (FLAG(KS).LE.NFLG) THEN + IF (IPE(KS).EQ.-ROOT) THEN + KS = ROOT + IW(KP) = ROOT + IF (FLAG(KS).LE.NFLG) GO TO 240 + ELSE + GO TO 240 + END IF + END IF +C Add to degree, flag supervariable KS and add it to new list. + ID = ID + NV(KS) + FLAG(KS) = NFLG + IW(NP) = KS + NP = NP + 1 + 240 CONTINUE +C Move first supervariable to end of list, move first element to end +C of element part of list and add new element to front of list. + 250 IF (ID.GE.LIMIT) GO TO 295 + IW(NP) = IW(NP0) + IW(NP0) = IW(KP1) + IW(KP1) = ME +C Store the new length of the list. + IW(KP1-1) = NP - KP1 + 1 +C +C Check whether row is is identical to another by looking in linked +C list of supervariables with degree ID at those whose lists have +C first entry ME. Note that those containing ME come first so the +C search can be terminated when a list not starting with ME is +C found. + JS = IPD(ID) + DO 280 L = 1,N + IF (JS.LE.0) GO TO 300 + KP1 = IPE(JS) + 1 + IF (IW(KP1).NE.ME) GO TO 300 +C JS has same degree and is active. Check if identical to IS. + KP2 = KP1 - 1 + IW(KP1-1) + DO 260 KP = KP1,KP2 + IE = IW(KP) +C Jump if IE is a supervariable or an element not in the list of IS. + IF (ABS(FLAG(IE)+0).GT.NFLG) GO TO 270 + 260 CONTINUE + GO TO 290 + + 270 JS = NXT(JS) + 280 CONTINUE +C Supervariable amalgamation. Row IS is identical to row JS. +C Regard all variables in the two supervariables as being in IS. Set +C tree pointer, FLAG and NV entries. + 290 IPE(JS) = -IS + NV(IS) = NV(IS) + NV(JS) + NV(JS) = 0 + FLAG(JS) = -1 +C Replace JS by IS in linked list. + NS = NXT(JS) + LS = LST(JS) + IF (NS.GT.0) LST(NS) = IS + IF (LS.GT.0) NXT(LS) = IS + LST(IS) = LS + NXT(IS) = NS + LST(JS) = 0 + NXT(JS) = 0 + IF (IPD(ID).EQ.JS) IPD(ID) = IS + GO TO 310 +C Treat IS as full. Merge it into the root node. + 295 IF (NVROOT.EQ.0) THEN + ROOT = IS + IPE(IS) = 0 + ELSE + IW(K) = ROOT + IPE(IS) = -ROOT + NV(ROOT) = NV(ROOT) + NV(IS) + NV(IS) = 0 + FLAG(IS) = -1 + END IF + NVROOT = NV(ROOT) + GO TO 310 +C Insert IS into linked list of supervariables of same degree. + 300 NS = IPD(ID) + IF (NS.GT.0) LST(NS) = IS + NXT(IS) = NS + IPD(ID) = IS + LST(IS) = -ID + MD = MIN(MD,ID) + 310 CONTINUE + +C +C Reset flags for supervariables in newly created element and +C remove those absorbed into others. + DO 320 K = K1,K2 + IS = IW(K) + IF (NV(IS).EQ.0) GO TO 320 + FLAG(IS) = NFLG + IW(IP) = IS + IP = IP + 1 + 320 CONTINUE + + FLAG(ME) = -NFLG +C Move first entry to end to make room for length. + IW(IP) = IW(K1) + IW(K1) = IP - K1 +C Set pointer for new element and reset IWFR. + IPE(ME) = K1 + IWFR = IP + 1 + +C End of main loop + 340 CONTINUE +C + +C Absorb any remaining variables into the root + 350 DO 360 IS = 1,N + IF(NXT(IS).NE.0 .OR. LST(IS).NE.0) THEN + IF (NVROOT.EQ.0) THEN + ROOT = IS + IPE(IS) = 0 + ELSE + IPE(IS) = -ROOT + END IF + NVROOT = NVROOT + NV(IS) + NV(IS) = 0 + END IF + 360 CONTINUE +C Link any remaining elements to the root + DO 370 IE = 1,N + IF (IPE(IE).GT.0) IPE(IE) = -ROOT + 370 CONTINUE + IF(NVROOT.GT.0)NV(ROOT)=NVROOT + END + SUBROUTINE MA57ZD(N,IPE,IW,LW,IWFR,NCMPA) +C Is identical to subroutine MA27UD. Internal version for MA57. +C COMPRESS LISTS HELD BY MA27H/HD (MA57H/HD) IN IW AND ADJUST POINTERS +C IN IPE TO CORRESPOND. +C N IS THE MATRIX ORDER. IT IS NOT ALTERED. +C IPE(I) POINTS TO THE POSITION IN IW OF THE START OF LIST I OR IS +C ZERO IF THERE IS NO LIST I. ON EXIT IT POINTS TO THE NEW POSITION. +C IW HOLDS THE LISTS, EACH HEADED BY ITS LENGTH. ON OUTPUT THE SAME +C LISTS ARE HELD, BUT THEY ARE NOW COMPRESSED TOGETHER. +C LW HOLDS THE LENGTH OF IW. IT IS NOT ALTERED. +C IWFR NEED NOT BE SET ON ENTRY. ON EXIT IT POINTS TO THE FIRST FREE +C LOCATION IN IW. +C ON RETURN IT IS SET TO THE FIRST FREE LOCATION IN IW. +C NCMPA is number of compresses. +C +C .. Scalar Arguments .. + INTEGER IWFR,LW,N,NCMPA +C .. +C .. Array Arguments .. + INTEGER IPE(N),IW(LW) +C .. +C .. Local Scalars .. + INTEGER I,IR,K,K1,K2,LWFR +C .. +C .. Executable Statements .. + NCMPA = NCMPA + 1 +C PREPARE FOR COMPRESSING BY STORING THE LENGTHS OF THE +C LISTS IN IPE AND SETTING THE FIRST ENTRY OF EACH LIST TO +C -(LIST NUMBER). + DO 10 I = 1,N + K1 = IPE(I) + IF (K1.LE.0) GO TO 10 + IPE(I) = IW(K1) + IW(K1) = -I + 10 CONTINUE +C +C COMPRESS +C IWFR POINTS JUST BEYOND THE END OF THE COMPRESSED FILE. +C LWFR POINTS JUST BEYOND THE END OF THE UNCOMPRESSED FILE. + IWFR = 1 + LWFR = IWFR + DO 60 IR = 1,N + IF (LWFR.GT.LW) GO TO 70 +C SEARCH FOR THE NEXT NEGATIVE ENTRY. + DO 20 K = LWFR,LW + IF (IW(K).LT.0) GO TO 30 + 20 CONTINUE + GO TO 70 +C PICK UP ENTRY NUMBER, STORE LENGTH IN NEW POSITION, SET NEW POINTER +C AND PREPARE TO COPY LIST. + 30 I = -IW(K) + IW(IWFR) = IPE(I) + IPE(I) = IWFR + K1 = K + 1 + K2 = K + IW(IWFR) + IWFR = IWFR + 1 + IF (K1.GT.K2) GO TO 50 +C COPY LIST TO NEW POSITION. + DO 40 K = K1,K2 + IW(IWFR) = IW(K) + IWFR = IWFR + 1 + 40 CONTINUE + 50 LWFR = K2 + 1 + 60 CONTINUE + 70 RETURN + + END diff --git a/coinhsl/ma57/ma57d.lo b/coinhsl/ma57/ma57d.lo new file mode 100644 index 0000000..e796066 --- /dev/null +++ b/coinhsl/ma57/ma57d.lo @@ -0,0 +1,12 @@ +# coinhsl/ma57/ma57d.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4.6 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/ma57d.o' + +# Name of the non-PIC object +non_pic_object=none + diff --git a/coinhsl/mc19/.deps/.dirstamp b/coinhsl/mc19/.deps/.dirstamp new file mode 100644 index 0000000..e69de29 diff --git a/coinhsl/mc19/.dirstamp b/coinhsl/mc19/.dirstamp new file mode 100644 index 0000000..e69de29 diff --git a/coinhsl/mc19/.libs/mc19d.o b/coinhsl/mc19/.libs/mc19d.o new file mode 100644 index 0000000000000000000000000000000000000000..5d19c4bfb9eaab92330c27185409c80a6de2bf65 GIT binary patch literal 5176 zcmbtYeQZlt zRThN+b3ETaxBtEDQeBVEUrH()HScg}tH zIS(iKYZv)`{O&pDp09iE3;X=arXq`lGn$3_CO5q@P>!o`PS308w2E_bgcBRZ=fnmv z+^|hP@OecM$0^Y@vO2&!Wi`&1$muuu?;w~y&hLTIpZX^m{^|k*oS$z=FR=kPZ zfqPdJ&394`EGplC?OmoIrod>dibN%|PUb5k{-q zfl;-B1W9e@l|XXTqWE~8r2h70E+;1U*}$zIDC%TTy``kV<8m6DT$ns$=mzLOBi89B zH{X@hao$;{4XozU&nl2|CF!TL5?S?!)LjSx%$mOf=W%5CU*L)WB$}j!a-a;&r_Gvc z4J3_*MiI|nLYjSJo#r|i)a)k%TIEr1hO8VyZZ0blr`<(_OZ|@~9)U%%%SAjFK#Xlk zmb9KmL|SYE7sDDzm0}yx+7pX#rv+A?i$E+b2NIwL;^j8X;ehY`#PPI?H?k*{8SKCm zQNSj*lwQG~z?>p0AqfR({C5`%Hg4_?$7b0GdMu1D}1qI0$9a>VlmB%f2( zDk&nT!+b?hD?f@8cfj(epyoPSr>%H{-V+H<@@D+0+~5XwZ-nx#V7@yTEp;l<%HojL z{U(iye=1u|nxwbU^kP5i4PJdO@%z+WGVFy^164lsX3+Udk-qgTX*@?f@8DEf2H|MN za41VzN%=Ea{6XS9Oq&mh=Pa0Whq?*K&zznQ%YVRD>t|U%Y5BKA!q@Zpq5BVfcMeF= zff(c?%#C|L1{Yo=$y$h}lr9C!KtS{7PzDDp^t#ju1U58qr4lVI4n`}TA+7Y6Aj-+? zJ2jhq--D1~B&mHg^IFf7#xZ7|-Nmf4FF~)!J~VDT@kfbxKEXI)SW%Bp(WI-fMQGGV z2xM7iNP6DeFvY+w@bWR#qV+s<#T0F_y-epX>*=z09A(CQCVw}NBC~{^E`|s&MG_Oq zZr*MoDHmLPZ7@eu(>b^bQX!upc=@0t;tc}{HZTS*m%;yc$dCM`$qjDTa}MrJ3-4Am z7tJtlrc*HD1NVoz_i-6=2a@vb0Js?B!evn`6EJDApM)N644x41WfGUuHaCK-9 zP8fk`oKIxr1Ecs>etWyvB5oI3#mHGhU*lnfa)}i{OfN`{435hhQ=o<43X0J}ejK)0 z<$eN{f;R$cx=yD~Oc(Nl(}g^sy=arw30kK0I<8L8aq6H7Qy?p7?GZ3eJlySP-KRtz6 zZB5Nax2Iu8q9>kkZxGfCWvkaE=*m0jtq{t}pVCprz63US>fMo%?grcYgUea49(cGaz?Zt-m-G=g*r>K za_ESe&B`sB2?Ao}W?KFTrJO0pLGhV-(yw07r_izzNxsnT zkr(@R#XC$8;<3(-zR0egc*jl{3keLKNPBNj2NfIz!K`g$Bl;C%ihrVD6Y&B-gV%s& zi-FU>DFDN`;~h2dADigyCj68M$E-H!KV~?}!7pC}zhlCenQ$8_0uAZS__8_hubc4Y zz+=dNh2c2hn`Gd>GU1r>27ZHGY1}3zJZHkq^w-(dEu`PZu0)}qcQG94&3-#Vc%k1;m~gXy&X{nsA4Ha@c&=Ihopa!BJRBO*<1gQY*mrlw+jek5EZ(P&UB;}h zqq|LrckGFCLVH`hjT3gnVw}*|iwh+83SMJrj6yUPFE=l|Pjf=FclYj&9+1-08}ATm zLk+8A@wVs-K!yi&bVWM*+IDy3HTu6MZs5igEUds)fMGN0kiME(iyngwj7^n6z{W26 z0R-}79HU<7b(7, 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try '$0 --help' for more information" + exit 1 +fi + +case $1 in + + --is-lightweight) + # Used by our autoconf macros to check whether the available missing + # script is modern enough. + exit 0 + ;; + + --run) + # Back-compat with the calling convention used by older automake. + shift + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due +to PROGRAM being missing or too old. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + +Supported PROGRAM values: + aclocal autoconf autoheader autom4te automake makeinfo + bison yacc flex lex help2man + +Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and +'g' are ignored when checking the name. + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: unknown '$1' option" + echo 1>&2 "Try '$0 --help' for more information" + exit 1 + ;; + +esac + +# Run the given program, remember its exit status. +"$@"; st=$? + +# If it succeeded, we are done. +test $st -eq 0 && exit 0 + +# Also exit now if we it failed (or wasn't found), and '--version' was +# passed; such an option is passed most likely to detect whether the +# program is present and works. +case $2 in --version|--help) exit $st;; esac + +# Exit code 63 means version mismatch. This often happens when the user +# tries to use an ancient version of a tool on a file that requires a +# minimum version. +if test $st -eq 63; then + msg="probably too old" +elif test $st -eq 127; then + # Program was missing. + msg="missing on your system" +else + # Program was found and executed, but failed. Give up. + exit $st +fi + +perl_URL=http://www.perl.org/ +flex_URL=http://flex.sourceforge.net/ +gnu_software_URL=http://www.gnu.org/software + +program_details () +{ + case $1 in + aclocal|automake) + echo "The '$1' program is part of the GNU Automake package:" + echo "<$gnu_software_URL/automake>" + echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/autoconf>" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + autoconf|autom4te|autoheader) + echo "The '$1' program is part of the GNU Autoconf package:" + echo "<$gnu_software_URL/autoconf/>" + echo "It also requires GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + esac +} + +give_advice () +{ + # Normalize program name to check for. + normalized_program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + + printf '%s\n' "'$1' is $msg." + + configure_deps="'configure.ac' or m4 files included by 'configure.ac'" + case $normalized_program in + autoconf*) + echo "You should only need it if you modified 'configure.ac'," + echo "or m4 files included by it." + program_details 'autoconf' + ;; + autoheader*) + echo "You should only need it if you modified 'acconfig.h' or" + echo "$configure_deps." + program_details 'autoheader' + ;; + automake*) + echo "You should only need it if you modified 'Makefile.am' or" + echo "$configure_deps." + program_details 'automake' + ;; + aclocal*) + echo "You should only need it if you modified 'acinclude.m4' or" + echo "$configure_deps." + program_details 'aclocal' + ;; + autom4te*) + echo "You might have modified some maintainer files that require" + echo "the 'autom4te' program to be rebuilt." + program_details 'autom4te' + ;; + bison*|yacc*) + echo "You should only need it if you modified a '.y' file." + echo "You may want to install the GNU Bison package:" + echo "<$gnu_software_URL/bison/>" + ;; + lex*|flex*) + echo "You should only need it if you modified a '.l' file." + echo "You may want to install the Fast Lexical Analyzer package:" + echo "<$flex_URL>" + ;; + help2man*) + echo "You should only need it if you modified a dependency" \ + "of a man page." + echo "You may want to install the GNU Help2man package:" + echo "<$gnu_software_URL/help2man/>" + ;; + makeinfo*) + echo "You should only need it if you modified a '.texi' file, or" + echo "any other file indirectly affecting the aspect of the manual." + echo "You might want to install the Texinfo package:" + echo "<$gnu_software_URL/texinfo/>" + echo "The spurious makeinfo call might also be the consequence of" + echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" + echo "want to install GNU make:" + echo "<$gnu_software_URL/make/>" + ;; + *) + echo "You might have modified some files without having the proper" + echo "tools for further handling them. Check the 'README' file, it" + echo "often tells you about the needed prerequisites for installing" + echo "this package. You may also peek at any GNU archive site, in" + echo "case some other package contains this missing '$1' program." + ;; + esac +} + +give_advice "$1" | sed -e '1s/^/WARNING: /' \ + -e '2,$s/^/ /' >&2 + +# Propagate the correct exit status (expected to be 127 for a program +# not found, 63 for a program that failed due to version mismatch). +exit $st + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/compile b/compile new file mode 100755 index 0000000..209573f --- /dev/null +++ b/compile @@ -0,0 +1,384 @@ +#! /bin/sh +# Wrapper for compilers which do not understand '-c -o'. + +scriptversion=2018-03-07.03; # UTC + +# Copyright (C) 1999-2020 Free Software Foundation, Inc. +# Written by Tom Tromey . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +nl=' +' + +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent tools from complaining about whitespace usage. +IFS=" "" $nl" + +file_conv= + +# func_file_conv build_file lazy +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. If the determined conversion +# type is listed in (the comma separated) LAZY, no conversion will +# take place. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN* | MSYS*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv/,$2, in + *,$file_conv,*) + ;; + mingw/*) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin/* | msys/*) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine/*) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_cl_dashL linkdir +# Make cl look for libraries in LINKDIR +func_cl_dashL () +{ + func_file_conv "$1" + if test -z "$lib_path"; then + lib_path=$file + else + lib_path="$lib_path;$file" + fi + linker_opts="$linker_opts -LIBPATH:$file" +} + +# func_cl_dashl library +# Do a library search-path lookup for cl +func_cl_dashl () +{ + lib=$1 + found=no + save_IFS=$IFS + IFS=';' + for dir in $lib_path $LIB + do + IFS=$save_IFS + if $shared && test -f "$dir/$lib.dll.lib"; then + found=yes + lib=$dir/$lib.dll.lib + break + fi + if test -f "$dir/$lib.lib"; then + found=yes + lib=$dir/$lib.lib + break + fi + if test -f "$dir/lib$lib.a"; then + found=yes + lib=$dir/lib$lib.a + break + fi + done + IFS=$save_IFS + + if test "$found" != yes; then + lib=$lib.lib + fi +} + +# func_cl_wrapper cl arg... +# Adjust compile command to suit cl +func_cl_wrapper () +{ + # Assume a capable shell + lib_path= + shared=: + linker_opts= + outfile= + implib= + linking=1 + for arg + do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + eat=1 + case $2 in + *.o | *.[oO][bB][jJ]) + func_file_conv "$2" + set x "$@" -Fo"$file" + shift + outfile="$file" + ;; + *) + func_file_conv "$2" + set x "$@" -Fe"$file" + shift + outfile="$file" + ;; + esac + ;; + -I) + eat=1 + func_file_conv "$2" mingw + set x "$@" -I"$file" + shift + ;; + -I*) + func_file_conv "${1#-I}" mingw + set x "$@" -I"$file" + shift + ;; + -l) + eat=1 + func_cl_dashl "$2" + set x "$@" "$lib" + shift + ;; + -l*) + func_cl_dashl "${1#-l}" + set x "$@" "$lib" + shift + ;; + -L) + eat=1 + func_cl_dashL "$2" + ;; + -L*) + func_cl_dashL "${1#-L}" + ;; + -static) + shared=false + ;; + -Wl,*) + arg=${1#-Wl,} + save_ifs="$IFS"; IFS=',' + for flag in $arg; do + IFS="$save_ifs" + linker_opts="$linker_opts $flag" + case "$flag" in -IMPLIB:*) implib=${flag#-IMPLIB:} ;; esac + done + IFS="$save_ifs" + ;; + -Xlinker) + eat=1 + linker_opts="$linker_opts $2" + ;; + -std=*) + set x "$@" -std:"${1#-std=}" + shift + ;; + -*) + set x "$@" "$1" + shift + ;; + *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) + func_file_conv "$1" + set x "$@" -Tp"$file" + shift + ;; + *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) + func_file_conv "$1" mingw + set x "$@" "$file" + shift + ;; + -c) + linking=0 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift + done + if test -n "$linker_opts"; then + linker_opts="-link$linker_opts" + fi + # remove old $implib, so we can distinguish between generated and not-generated implib below + if test -n "$implib" && test -f "$implib" ; then rm "$implib" ; fi + + # add path to MSVC link in front on PATH if we seem to link (check isn't so accurate, but some false-positives shouldn't matter) + # compiler will call the link it finds in the PATH, and we don't want it to use MSYS' /bin/link + # we assume that MSVC link is in same directory as cl and that cl is found in PATH + if test "$linking" = 1 && comppath=`which cl 2>/dev/null` ; then + comppath=`dirname "$comppath"` + #echo "Adding $comppath to front of PATH" + PATH="$comppath:$PATH" + fi + + #echo "compile: $@ $linker_opts" + "$@" $linker_opts || exit $? + + # if -implib got lost or ignored, then the lib should be named ${outfile/.dll/.lib} and we rename that file + if test -n "$implib" && test ! -f "$implib" ; then + echo "compile: mv ${outfile/.dll/.lib} $implib" + mv "${outfile/.dll/.lib}" "$implib" + fi + + exit 0 +} + +eat= + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand '-c -o'. +Remove '-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file 'INSTALL'. + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ + icl | *[/\\]icl | icl.exe | *[/\\]icl.exe | \ + ifort | *[/\\]ifort | ifort.exe | *[/\\]ifort.exe ) + func_cl_wrapper "$@" # Doesn't return... + ;; +esac + +ofile= +cfile= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + # So we strip '-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no '-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # '.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use '[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/config.guess b/config.guess new file mode 100755 index 0000000..45001cf --- /dev/null +++ b/config.guess @@ -0,0 +1,1667 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright 1992-2020 Free Software Foundation, Inc. + +timestamp='2020-01-01' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). +# +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. +# +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess +# +# Please send patches to . + + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright 1992-2020 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +tmp= +# shellcheck disable=SC2172 +trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 + +set_cc_for_build() { + # prevent multiple calls if $tmp is already set + test "$tmp" && return 0 + : "${TMPDIR=/tmp}" + # shellcheck disable=SC2039 + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } + dummy=$tmp/dummy + case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in + ,,) echo "int x;" > "$dummy.c" + for driver in cc gcc c89 c99 ; do + if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then + CC_FOR_BUILD="$driver" + break + fi + done + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; + esac +} + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if test -f /.attbin/uname ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +case "$UNAME_SYSTEM" in +Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + + set_cc_for_build + cat <<-EOF > "$dummy.c" + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #else + LIBC=gnu + #endif + EOF + eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" + + # If ldd exists, use it to detect musl libc. + if command -v ldd >/dev/null && \ + ldd --version 2>&1 | grep -q ^musl + then + LIBC=musl + fi + ;; +esac + +# Note: order is significant - the case branches are not exclusive. + +case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + "/sbin/$sysctl" 2>/dev/null || \ + "/usr/sbin/$sysctl" 2>/dev/null || \ + echo unknown)` + case "$UNAME_MACHINE_ARCH" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + earmv*) + arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` + machine="${arch}${endian}"-unknown + ;; + *) machine="$UNAME_MACHINE_ARCH"-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently (or will in the future) and ABI. + case "$UNAME_MACHINE_ARCH" in + earm*) + os=netbsdelf + ;; + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # Determine ABI tags. + case "$UNAME_MACHINE_ARCH" in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "$UNAME_VERSION" in + Debian*) + release='-gnu' + ;; + *) + release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "$machine-${os}${release}${abi-}" + exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" + exit ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" + exit ;; + *:MidnightBSD:*:*) + echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE" + exit ;; + *:ekkoBSD:*:*) + echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE" + exit ;; + *:SolidBSD:*:*) + echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" + exit ;; + *:OS108:*:*) + echo "$UNAME_MACHINE"-unknown-os108_"$UNAME_RELEASE" + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd"$UNAME_RELEASE" + exit ;; + *:MirBSD:*:*) + echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" + exit ;; + *:Sortix:*:*) + echo "$UNAME_MACHINE"-unknown-sortix + exit ;; + *:Twizzler:*:*) + echo "$UNAME_MACHINE"-unknown-twizzler + exit ;; + *:Redox:*:*) + echo "$UNAME_MACHINE"-unknown-redox + exit ;; + mips:OSF1:*.*) + echo mips-dec-osf1 + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE=alpha ;; + "EV4.5 (21064)") + UNAME_MACHINE=alpha ;; + "LCA4 (21066/21068)") + UNAME_MACHINE=alpha ;; + "EV5 (21164)") + UNAME_MACHINE=alphaev5 ;; + "EV5.6 (21164A)") + UNAME_MACHINE=alphaev56 ;; + "EV5.6 (21164PC)") + UNAME_MACHINE=alphapca56 ;; + "EV5.7 (21164PC)") + UNAME_MACHINE=alphapca57 ;; + "EV6 (21264)") + UNAME_MACHINE=alphaev6 ;; + "EV6.7 (21264A)") + UNAME_MACHINE=alphaev67 ;; + "EV6.8CB (21264C)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8AL (21264B)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8CX (21264D)") + UNAME_MACHINE=alphaev68 ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE=alphaev69 ;; + "EV7 (21364)") + UNAME_MACHINE=alphaev7 ;; + "EV7.9 (21364A)") + UNAME_MACHINE=alphaev79 ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`" + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + exitcode=$? + trap '' 0 + exit $exitcode ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo "$UNAME_MACHINE"-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo "$UNAME_MACHINE"-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix"$UNAME_RELEASE" + exit ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux"$UNAME_RELEASE" + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + set_cc_for_build + SUN_ARCH=i386 + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH=x86_64 + fi + fi + echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`" + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos"$UNAME_RELEASE" + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos"$UNAME_RELEASE" + ;; + sun4) + echo sparc-sun-sunos"$UNAME_RELEASE" + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos"$UNAME_RELEASE" + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint"$UNAME_RELEASE" + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint"$UNAME_RELEASE" + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint"$UNAME_RELEASE" + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten"$UNAME_RELEASE" + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten"$UNAME_RELEASE" + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix"$UNAME_RELEASE" + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix"$UNAME_RELEASE" + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix"$UNAME_RELEASE" + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && + dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`"$dummy" "$dummyarg"` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos"$UNAME_RELEASE" + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ] + then + if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \ + [ "$TARGET_BINARY_INTERFACE"x = x ] + then + echo m88k-dg-dgux"$UNAME_RELEASE" + else + echo m88k-dg-dguxbcs"$UNAME_RELEASE" + fi + else + echo i586-dg-dgux"$UNAME_RELEASE" + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`" + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + fi + echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV" + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/lslpp ] ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` + else + IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + fi + echo "$IBM_ARCH"-ibm-aix"$IBM_REV" + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` + case "$UNAME_MACHINE" in + 9000/31?) HP_ARCH=m68000 ;; + 9000/[34]??) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "$sc_cpu_version" in + 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 + 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "$sc_kernel_bits" in + 32) HP_ARCH=hppa2.0n ;; + 64) HP_ARCH=hppa2.0w ;; + '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "$HP_ARCH" = "" ]; then + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ "$HP_ARCH" = hppa2.0w ] + then + set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH=hppa2.0w + else + HP_ARCH=hppa64 + fi + fi + echo "$HP_ARCH"-hp-hpux"$HPUX_REV" + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux"$HPUX_REV" + exit ;; + 3050*:HI-UX:*:*) + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo "$UNAME_MACHINE"-unknown-osf1mk + else + echo "$UNAME_MACHINE"-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE" + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi"$UNAME_RELEASE" + exit ;; + *:BSD/OS:*:*) + echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" + exit ;; + arm:FreeBSD:*:*) + UNAME_PROCESSOR=`uname -p` + set_cc_for_build + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabi + else + echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabihf + fi + exit ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=`/usr/bin/uname -p` + case "$UNAME_PROCESSOR" in + amd64) + UNAME_PROCESSOR=x86_64 ;; + i386) + UNAME_PROCESSOR=i586 ;; + esac + echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" + exit ;; + i*:CYGWIN*:*) + echo "$UNAME_MACHINE"-pc-cygwin + exit ;; + *:MINGW64*:*) + echo "$UNAME_MACHINE"-pc-mingw64 + exit ;; + *:MINGW*:*) + echo "$UNAME_MACHINE"-pc-mingw32 + exit ;; + *:MSYS*:*) + echo "$UNAME_MACHINE"-pc-msys + exit ;; + i*:PW*:*) + echo "$UNAME_MACHINE"-pc-pw32 + exit ;; + *:Interix*:*) + case "$UNAME_MACHINE" in + x86) + echo i586-pc-interix"$UNAME_RELEASE" + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix"$UNAME_RELEASE" + exit ;; + IA64) + echo ia64-unknown-interix"$UNAME_RELEASE" + exit ;; + esac ;; + i*:UWIN*:*) + echo "$UNAME_MACHINE"-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-pc-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + *:GNU:*:*) + # the GNU system + echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`" + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" + exit ;; + *:Minix:*:*) + echo "$UNAME_MACHINE"-unknown-minix + exit ;; + aarch64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + arm*:Linux:*:*) + set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi + else + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf + fi + fi + exit ;; + avr32*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + cris:Linux:*:*) + echo "$UNAME_MACHINE"-axis-linux-"$LIBC" + exit ;; + crisv32:Linux:*:*) + echo "$UNAME_MACHINE"-axis-linux-"$LIBC" + exit ;; + e2k:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + frv:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + hexagon:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + i*86:Linux:*:*) + echo "$UNAME_MACHINE"-pc-linux-"$LIBC" + exit ;; + ia64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + k1om:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + m32r*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + m68*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + set_cc_for_build + IS_GLIBC=0 + test x"${LIBC}" = xgnu && IS_GLIBC=1 + sed 's/^ //' << EOF > "$dummy.c" + #undef CPU + #undef mips + #undef mipsel + #undef mips64 + #undef mips64el + #if ${IS_GLIBC} && defined(_ABI64) + LIBCABI=gnuabi64 + #else + #if ${IS_GLIBC} && defined(_ABIN32) + LIBCABI=gnuabin32 + #else + LIBCABI=${LIBC} + #endif + #endif + + #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa64r6 + #else + #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa32r6 + #else + #if defined(__mips64) + CPU=mips64 + #else + CPU=mips + #endif + #endif + #endif + + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + MIPS_ENDIAN=el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + MIPS_ENDIAN= + #else + MIPS_ENDIAN= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'`" + test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } + ;; + mips64el:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + openrisc*:Linux:*:*) + echo or1k-unknown-linux-"$LIBC" + exit ;; + or32:Linux:*:* | or1k*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-"$LIBC" + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-"$LIBC" + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; + PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; + *) echo hppa-unknown-linux-"$LIBC" ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-"$LIBC" + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-"$LIBC" + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-"$LIBC" + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-"$LIBC" + exit ;; + riscv32:Linux:*:* | riscv64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" + exit ;; + sh64*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + sh*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + tile*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + vax:Linux:*:*) + echo "$UNAME_MACHINE"-dec-linux-"$LIBC" + exit ;; + x86_64:Linux:*:*) + echo "$UNAME_MACHINE"-pc-linux-"$LIBC" + exit ;; + xtensa*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION" + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo "$UNAME_MACHINE"-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo "$UNAME_MACHINE"-unknown-stop + exit ;; + i*86:atheos:*:*) + echo "$UNAME_MACHINE"-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo "$UNAME_MACHINE"-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos"$UNAME_RELEASE" + exit ;; + i*86:*DOS:*:*) + echo "$UNAME_MACHINE"-pc-msdosdjgpp + exit ;; + i*86:*:4.*:*) + UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" + else + echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL" + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}" + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL" + else + echo "$UNAME_MACHINE"-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configure will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos"$UNAME_RELEASE" + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos"$UNAME_RELEASE" + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos"$UNAME_RELEASE" + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos"$UNAME_RELEASE" + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv"$UNAME_RELEASE" + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo "$UNAME_MACHINE"-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo "$UNAME_MACHINE"-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux"$UNAME_RELEASE" + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv"$UNAME_RELEASE" + else + echo mips-unknown-sysv"$UNAME_RELEASE" + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + x86_64:Haiku:*:*) + echo x86_64-unknown-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux"$UNAME_RELEASE" + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux"$UNAME_RELEASE" + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux"$UNAME_RELEASE" + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux"$UNAME_RELEASE" + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux"$UNAME_RELEASE" + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux"$UNAME_RELEASE" + exit ;; + SX-ACE:SUPER-UX:*:*) + echo sxace-nec-superux"$UNAME_RELEASE" + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody"$UNAME_RELEASE" + exit ;; + *:Rhapsody:*:*) + echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` + case $UNAME_PROCESSOR in + unknown) UNAME_PROCESSOR=powerpc ;; + esac + if command -v xcode-select > /dev/null 2> /dev/null && \ + ! xcode-select --print-path > /dev/null 2> /dev/null ; then + # Avoid executing cc if there is no toolchain installed as + # cc will be a stub that puts up a graphical alert + # prompting the user to install developer tools. + CC_FOR_BUILD=no_compiler_found + else + set_cc_for_build + fi + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # uname -m returns i386 or x86_64 + UNAME_PROCESSOR=$UNAME_MACHINE + fi + echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = x86; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE" + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NEO-*:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSE-*:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSR-*:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSV-*:NONSTOP_KERNEL:*:*) + echo nsv-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSX-*:NONSTOP_KERNEL:*:*) + echo nsx-tandem-nsk"$UNAME_RELEASE" + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE" + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + # shellcheck disable=SC2154 + if test "$cputype" = 386; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo "$UNAME_MACHINE"-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux"$UNAME_RELEASE" + exit ;; + *:DragonFly:*:*) + echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "$UNAME_MACHINE" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`" + exit ;; + i*86:rdos:*:*) + echo "$UNAME_MACHINE"-pc-rdos + exit ;; + i*86:AROS:*:*) + echo "$UNAME_MACHINE"-pc-aros + exit ;; + x86_64:VMkernel:*:*) + echo "$UNAME_MACHINE"-unknown-esx + exit ;; + amd64:Isilon\ OneFS:*:*) + echo x86_64-unknown-onefs + exit ;; + *:Unleashed:*:*) + echo "$UNAME_MACHINE"-unknown-unleashed"$UNAME_RELEASE" + exit ;; +esac + +# No uname command or uname output not recognized. +set_cc_for_build +cat > "$dummy.c" < +#include +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#include +#if defined(_SIZE_T_) || defined(SIGLOST) +#include +#endif +#endif +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); +#endif + +#if defined (vax) +#if !defined (ultrix) +#include +#if defined (BSD) +#if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +#else +#if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#endif +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#else +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname un; + uname (&un); + printf ("vax-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("vax-dec-ultrix\n"); exit (0); +#endif +#endif +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname *un; + uname (&un); + printf ("mips-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("mips-dec-ultrix\n"); exit (0); +#endif +#endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. +test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; } + +echo "$0: unable to guess system type" >&2 + +case "$UNAME_MACHINE:$UNAME_SYSTEM" in + mips:Linux | mips64:Linux) + # If we got here on MIPS GNU/Linux, output extra information. + cat >&2 <&2 </dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = "$UNAME_MACHINE" +UNAME_RELEASE = "$UNAME_RELEASE" +UNAME_SYSTEM = "$UNAME_SYSTEM" +UNAME_VERSION = "$UNAME_VERSION" +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/config.h.in b/config.h.in new file mode 100644 index 0000000..0d7efef --- /dev/null +++ b/config.h.in @@ -0,0 +1,127 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if the LAPACK package is available */ +#undef COINHSL_HAS_LAPACK + +/* Define to 1 if MA27 is available. */ +#undef COINHSL_HAS_MA27 + +/* Define to 1 if MA28 is available. */ +#undef COINHSL_HAS_MA28 + +/* Define to 1 if MA57 is available. */ +#undef COINHSL_HAS_MA57 + +/* Define to 1 if MA77 is available. */ +#undef COINHSL_HAS_MA77 + +/* Define to 1 if MA86 is available. */ +#undef COINHSL_HAS_MA86 + +/* Define to 1 if MA97 is available. */ +#undef COINHSL_HAS_MA97 + +/* Define to 1 if MC19 is available. */ +#undef COINHSL_HAS_MC19 + +/* Define to 1 if MC68 is available. */ +#undef COINHSL_HAS_MC68 + +/* Define to 1 if the Metis package is available */ +#undef COINHSL_HAS_METIS + +/* Define to a macro mangling the given C identifier (in lower and upper + case). */ +#undef COINHSL_LAPACK_FUNC + +/* As COINHSL_LAPACK_FUNC, but for C identifiers containing underscores. */ +#undef COINHSL_LAPACK_FUNC_ + +/* Version number of project */ +#undef COINHSL_VERSION + +/* Major version number of project. */ +#undef COINHSL_VERSION_MAJOR + +/* Minor version number of project. */ +#undef COINHSL_VERSION_MINOR + +/* Release version number of project. */ +#undef COINHSL_VERSION_RELEASE + +/* Define to dummy `main' function (if any) required to link to the Fortran + libraries. */ +#undef F77_DUMMY_MAIN + +/* Define to a macro mangling the given C identifier (in lower and upper + case), which must not contain underscores, for linking with Fortran. */ +#undef F77_FUNC + +/* As F77_FUNC, but for C identifiers containing underscores. */ +#undef F77_FUNC_ + +/* Define to 1 if your Fortran compiler doesn't accept -c and -o together. */ +#undef F77_NO_MINUS_C_MINUS_O + +/* Define if F77 and FC dummy `main' functions are identical. */ +#undef FC_DUMMY_MAIN_EQ_F77 + +/* Define to 1 if your Fortran compiler doesn't accept -c and -o together. */ +#undef FC_NO_MINUS_C_MINUS_O + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Library Visibility Attribute */ +#undef HSL_EXPORT + +/* Define to the sub-directory where libtool stores uninstalled libraries. */ +#undef LT_OBJDIR + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS diff --git a/config.sub b/config.sub new file mode 100755 index 0000000..f02d43a --- /dev/null +++ b/config.sub @@ -0,0 +1,1793 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright 1992-2020 Free Software Foundation, Inc. + +timestamp='2020-01-01' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). + + +# Please send patches to . +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS + +Canonicalize a configuration name. + +Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright 1992-2020 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo "$1" + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Split fields of configuration type +# shellcheck disable=SC2162 +IFS="-" read field1 field2 field3 field4 <&2 + exit 1 + ;; + *-*-*-*) + basic_machine=$field1-$field2 + os=$field3-$field4 + ;; + *-*-*) + # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two + # parts + maybe_os=$field2-$field3 + case $maybe_os in + nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc \ + | linux-newlib* | linux-musl* | linux-uclibc* | uclinux-uclibc* \ + | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ + | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ + | storm-chaos* | os2-emx* | rtmk-nova*) + basic_machine=$field1 + os=$maybe_os + ;; + android-linux) + basic_machine=$field1-unknown + os=linux-android + ;; + *) + basic_machine=$field1-$field2 + os=$field3 + ;; + esac + ;; + *-*) + # A lone config we happen to match not fitting any pattern + case $field1-$field2 in + decstation-3100) + basic_machine=mips-dec + os= + ;; + *-*) + # Second component is usually, but not always the OS + case $field2 in + # Prevent following clause from handling this valid os + sun*os*) + basic_machine=$field1 + os=$field2 + ;; + # Manufacturers + dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \ + | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ + | unicom* | ibm* | next | hp | isi* | apollo | altos* \ + | convergent* | ncr* | news | 32* | 3600* | 3100* \ + | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \ + | ultra | tti* | harris | dolphin | highlevel | gould \ + | cbm | ns | masscomp | apple | axis | knuth | cray \ + | microblaze* | sim | cisco \ + | oki | wec | wrs | winbond) + basic_machine=$field1-$field2 + os= + ;; + *) + basic_machine=$field1 + os=$field2 + ;; + esac + ;; + esac + ;; + *) + # Convert single-component short-hands not valid as part of + # multi-component configurations. + case $field1 in + 386bsd) + basic_machine=i386-pc + os=bsd + ;; + a29khif) + basic_machine=a29k-amd + os=udi + ;; + adobe68k) + basic_machine=m68010-adobe + os=scout + ;; + alliant) + basic_machine=fx80-alliant + os= + ;; + altos | altos3068) + basic_machine=m68k-altos + os= + ;; + am29k) + basic_machine=a29k-none + os=bsd + ;; + amdahl) + basic_machine=580-amdahl + os=sysv + ;; + amiga) + basic_machine=m68k-unknown + os= + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=bsd + ;; + aros) + basic_machine=i386-pc + os=aros + ;; + aux) + basic_machine=m68k-apple + os=aux + ;; + balance) + basic_machine=ns32k-sequent + os=dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=linux + ;; + cegcc) + basic_machine=arm-unknown + os=cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=bsd + ;; + convex-c2) + basic_machine=c2-convex + os=bsd + ;; + convex-c32) + basic_machine=c32-convex + os=bsd + ;; + convex-c34) + basic_machine=c34-convex + os=bsd + ;; + convex-c38) + basic_machine=c38-convex + os=bsd + ;; + cray) + basic_machine=j90-cray + os=unicos + ;; + crds | unos) + basic_machine=m68k-crds + os= + ;; + da30) + basic_machine=m68k-da30 + os= + ;; + decstation | pmax | pmin | dec3100 | decstatn) + basic_machine=mips-dec + os= + ;; + delta88) + basic_machine=m88k-motorola + os=sysv3 + ;; + dicos) + basic_machine=i686-pc + os=dicos + ;; + djgpp) + basic_machine=i586-pc + os=msdosdjgpp + ;; + ebmon29k) + basic_machine=a29k-amd + os=ebmon + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=ose + ;; + gmicro) + basic_machine=tron-gmicro + os=sysv + ;; + go32) + basic_machine=i386-pc + os=go32 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=hms + ;; + harris) + basic_machine=m88k-harris + os=sysv3 + ;; + hp300 | hp300hpux) + basic_machine=m68k-hp + os=hpux + ;; + hp300bsd) + basic_machine=m68k-hp + os=bsd + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=proelf + ;; + i386mach) + basic_machine=i386-mach + os=mach + ;; + isi68 | isi) + basic_machine=m68k-isi + os=sysv + ;; + m68knommu) + basic_machine=m68k-unknown + os=linux + ;; + magnum | m3230) + basic_machine=mips-mips + os=sysv + ;; + merlin) + basic_machine=ns32k-utek + os=sysv + ;; + mingw64) + basic_machine=x86_64-pc + os=mingw64 + ;; + mingw32) + basic_machine=i686-pc + os=mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=mingw32ce + ;; + monitor) + basic_machine=m68k-rom68k + os=coff + ;; + morphos) + basic_machine=powerpc-unknown + os=morphos + ;; + moxiebox) + basic_machine=moxie-unknown + os=moxiebox + ;; + msdos) + basic_machine=i386-pc + os=msdos + ;; + msys) + basic_machine=i686-pc + os=msys + ;; + mvs) + basic_machine=i370-ibm + os=mvs + ;; + nacl) + basic_machine=le32-unknown + os=nacl + ;; + ncr3000) + basic_machine=i486-ncr + os=sysv4 + ;; + netbsd386) + basic_machine=i386-pc + os=netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=newsos + ;; + news1000) + basic_machine=m68030-sony + os=newsos + ;; + necv70) + basic_machine=v70-nec + os=sysv + ;; + nh3000) + basic_machine=m68k-harris + os=cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=cxux + ;; + nindy960) + basic_machine=i960-intel + os=nindy + ;; + mon960) + basic_machine=i960-intel + os=mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=nonstopux + ;; + os400) + basic_machine=powerpc-ibm + os=os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=ose + ;; + os68k) + basic_machine=m68k-none + os=os68k + ;; + paragon) + basic_machine=i860-intel + os=osf + ;; + parisc) + basic_machine=hppa-unknown + os=linux + ;; + pw32) + basic_machine=i586-unknown + os=pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + os=rdos + ;; + rdos32) + basic_machine=i386-pc + os=rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=coff + ;; + sa29200) + basic_machine=a29k-amd + os=udi + ;; + sei) + basic_machine=mips-sei + os=seiux + ;; + sequent) + basic_machine=i386-sequent + os= + ;; + sps7) + basic_machine=m68k-bull + os=sysv2 + ;; + st2000) + basic_machine=m68k-tandem + os= + ;; + stratus) + basic_machine=i860-stratus + os=sysv4 + ;; + sun2) + basic_machine=m68000-sun + os= + ;; + sun2os3) + basic_machine=m68000-sun + os=sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=sunos4 + ;; + sun3) + basic_machine=m68k-sun + os= + ;; + sun3os3) + basic_machine=m68k-sun + os=sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=sunos4 + ;; + sun4) + basic_machine=sparc-sun + os= + ;; + sun4os3) + basic_machine=sparc-sun + os=sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=solaris2 + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + os= + ;; + sv1) + basic_machine=sv1-cray + os=unicos + ;; + symmetry) + basic_machine=i386-sequent + os=dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=unicos + ;; + t90) + basic_machine=t90-cray + os=unicos + ;; + toad1) + basic_machine=pdp10-xkl + os=tops20 + ;; + tpf) + basic_machine=s390x-ibm + os=tpf + ;; + udi29k) + basic_machine=a29k-amd + os=udi + ;; + ultra3) + basic_machine=a29k-nyu + os=sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=none + ;; + vaxv) + basic_machine=vax-dec + os=sysv + ;; + vms) + basic_machine=vax-dec + os=vms + ;; + vsta) + basic_machine=i386-pc + os=vsta + ;; + vxworks960) + basic_machine=i960-wrs + os=vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=vxworks + ;; + xbox) + basic_machine=i686-pc + os=mingw32 + ;; + ymp) + basic_machine=ymp-cray + os=unicos + ;; + *) + basic_machine=$1 + os= + ;; + esac + ;; +esac + +# Decode 1-component or ad-hoc basic machines +case $basic_machine in + # Here we handle the default manufacturer of certain CPU types. It is in + # some cases the only manufacturer, in others, it is the most popular. + w89k) + cpu=hppa1.1 + vendor=winbond + ;; + op50n) + cpu=hppa1.1 + vendor=oki + ;; + op60c) + cpu=hppa1.1 + vendor=oki + ;; + ibm*) + cpu=i370 + vendor=ibm + ;; + orion105) + cpu=clipper + vendor=highlevel + ;; + mac | mpw | mac-mpw) + cpu=m68k + vendor=apple + ;; + pmac | pmac-mpw) + cpu=powerpc + vendor=apple + ;; + + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + cpu=m68000 + vendor=att + ;; + 3b*) + cpu=we32k + vendor=att + ;; + bluegene*) + cpu=powerpc + vendor=ibm + os=cnk + ;; + decsystem10* | dec10*) + cpu=pdp10 + vendor=dec + os=tops10 + ;; + decsystem20* | dec20*) + cpu=pdp10 + vendor=dec + os=tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + cpu=m68k + vendor=motorola + ;; + dpx2*) + cpu=m68k + vendor=bull + os=sysv3 + ;; + encore | umax | mmax) + cpu=ns32k + vendor=encore + ;; + elxsi) + cpu=elxsi + vendor=elxsi + os=${os:-bsd} + ;; + fx2800) + cpu=i860 + vendor=alliant + ;; + genix) + cpu=ns32k + vendor=ns + ;; + h3050r* | hiux*) + cpu=hppa1.1 + vendor=hitachi + os=hiuxwe2 + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + cpu=m68000 + vendor=hp + ;; + hp9k3[2-9][0-9]) + cpu=m68k + vendor=hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + i*86v32) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + os=sysv32 + ;; + i*86v4*) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + os=sysv4 + ;; + i*86v) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + os=sysv + ;; + i*86sol2) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + os=solaris2 + ;; + j90 | j90-cray) + cpu=j90 + vendor=cray + os=${os:-unicos} + ;; + iris | iris4d) + cpu=mips + vendor=sgi + case $os in + irix*) + ;; + *) + os=irix4 + ;; + esac + ;; + miniframe) + cpu=m68000 + vendor=convergent + ;; + *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) + cpu=m68k + vendor=atari + os=mint + ;; + news-3600 | risc-news) + cpu=mips + vendor=sony + os=newsos + ;; + next | m*-next) + cpu=m68k + vendor=next + case $os in + openstep*) + ;; + nextstep*) + ;; + ns2*) + os=nextstep2 + ;; + *) + os=nextstep3 + ;; + esac + ;; + np1) + cpu=np1 + vendor=gould + ;; + op50n-* | op60c-*) + cpu=hppa1.1 + vendor=oki + os=proelf + ;; + pa-hitachi) + cpu=hppa1.1 + vendor=hitachi + os=hiuxwe2 + ;; + pbd) + cpu=sparc + vendor=tti + ;; + pbb) + cpu=m68k + vendor=tti + ;; + pc532) + cpu=ns32k + vendor=pc532 + ;; + pn) + cpu=pn + vendor=gould + ;; + power) + cpu=power + vendor=ibm + ;; + ps2) + cpu=i386 + vendor=ibm + ;; + rm[46]00) + cpu=mips + vendor=siemens + ;; + rtpc | rtpc-*) + cpu=romp + vendor=ibm + ;; + sde) + cpu=mipsisa32 + vendor=sde + os=${os:-elf} + ;; + simso-wrs) + cpu=sparclite + vendor=wrs + os=vxworks + ;; + tower | tower-32) + cpu=m68k + vendor=ncr + ;; + vpp*|vx|vx-*) + cpu=f301 + vendor=fujitsu + ;; + w65) + cpu=w65 + vendor=wdc + ;; + w89k-*) + cpu=hppa1.1 + vendor=winbond + os=proelf + ;; + none) + cpu=none + vendor=none + ;; + leon|leon[3-9]) + cpu=sparc + vendor=$basic_machine + ;; + leon-*|leon[3-9]-*) + cpu=sparc + vendor=`echo "$basic_machine" | sed 's/-.*//'` + ;; + + *-*) + # shellcheck disable=SC2162 + IFS="-" read cpu vendor <&2 + exit 1 + ;; + esac + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $vendor in + digital*) + vendor=dec + ;; + commodore*) + vendor=cbm + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x$os != x ] +then +case $os in + # First match some system type aliases that might get confused + # with valid system types. + # solaris* is a basic system type, with this one exception. + auroraux) + os=auroraux + ;; + bluegene*) + os=cnk + ;; + solaris1 | solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + solaris) + os=solaris2 + ;; + unixware*) + os=sysv4.2uw + ;; + gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # es1800 is here to avoid being matched by es* (a different OS) + es1800*) + os=ose + ;; + # Some version numbers need modification + chorusos*) + os=chorusos + ;; + isc) + os=isc2.2 + ;; + sco6) + os=sco5v6 + ;; + sco5) + os=sco3.2v5 + ;; + sco4) + os=sco3.2v4 + ;; + sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + ;; + sco3.2v[4-9]* | sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + ;; + scout) + # Don't match below + ;; + sco*) + os=sco3.2v2 + ;; + psos*) + os=psos + ;; + # Now accept the basic system types. + # The portable systems comes first. + # Each alternative MUST end in a * to match a version number. + # sysv* is not here because it comes later, after sysvr4. + gnu* | bsd* | mach* | minix* | genix* | ultrix* | irix* \ + | *vms* | esix* | aix* | cnk* | sunos | sunos[34]*\ + | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \ + | sym* | kopensolaris* | plan9* \ + | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \ + | aos* | aros* | cloudabi* | sortix* | twizzler* \ + | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \ + | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \ + | knetbsd* | mirbsd* | netbsd* \ + | bitrig* | openbsd* | solidbsd* | libertybsd* | os108* \ + | ekkobsd* | kfreebsd* | freebsd* | riscix* | lynxos* \ + | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \ + | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \ + | udi* | eabi* | lites* | ieee* | go32* | aux* | hcos* \ + | chorusrdb* | cegcc* | glidix* \ + | cygwin* | msys* | pe* | moss* | proelf* | rtems* \ + | midipix* | mingw32* | mingw64* | linux-gnu* | linux-android* \ + | linux-newlib* | linux-musl* | linux-uclibc* \ + | uxpv* | beos* | mpeix* | udk* | moxiebox* \ + | interix* | uwin* | mks* | rhapsody* | darwin* \ + | openstep* | oskit* | conix* | pw32* | nonstopux* \ + | storm-chaos* | tops10* | tenex* | tops20* | its* \ + | os2* | vos* | palmos* | uclinux* | nucleus* \ + | morphos* | superux* | rtmk* | windiss* \ + | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \ + | skyos* | haiku* | rdos* | toppers* | drops* | es* \ + | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ + | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ + | nsk* | powerunix) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + qnx*) + case $cpu in + x86 | i*86) + ;; + *) + os=nto-$os + ;; + esac + ;; + hiux*) + os=hiuxwe2 + ;; + nto-qnx*) + ;; + nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + sim | xray | os68k* | v88r* \ + | windows* | osx | abug | netware* | os9* \ + | macos* | mpw* | magic* | mmixware* | mon960* | lnews*) + ;; + linux-dietlibc) + os=linux-dietlibc + ;; + linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + lynx*178) + os=lynxos178 + ;; + lynx*5) + os=lynxos5 + ;; + lynx*) + os=lynxos + ;; + mac*) + os=`echo "$os" | sed -e 's|mac|macos|'` + ;; + opened*) + os=openedition + ;; + os400*) + os=os400 + ;; + sunos5*) + os=`echo "$os" | sed -e 's|sunos5|solaris2|'` + ;; + sunos6*) + os=`echo "$os" | sed -e 's|sunos6|solaris3|'` + ;; + wince*) + os=wince + ;; + utek*) + os=bsd + ;; + dynix*) + os=bsd + ;; + acis*) + os=aos + ;; + atheos*) + os=atheos + ;; + syllable*) + os=syllable + ;; + 386bsd) + os=bsd + ;; + ctix* | uts*) + os=sysv + ;; + nova*) + os=rtmk-nova + ;; + ns2) + os=nextstep2 + ;; + # Preserve the version number of sinix5. + sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + sinix*) + os=sysv4 + ;; + tpf*) + os=tpf + ;; + triton*) + os=sysv3 + ;; + oss*) + os=sysv3 + ;; + svr4*) + os=sysv4 + ;; + svr3) + os=sysv3 + ;; + sysvr4) + os=sysv4 + ;; + # This must come after sysvr4. + sysv*) + ;; + ose*) + os=ose + ;; + *mint | mint[0-9]* | *MiNT | MiNT[0-9]*) + os=mint + ;; + zvmoe) + os=zvmoe + ;; + dicos*) + os=dicos + ;; + pikeos*) + # Until real need of OS specific support for + # particular features comes up, bare metal + # configurations are quite functional. + case $cpu in + arm*) + os=eabi + ;; + *) + os=elf + ;; + esac + ;; + nacl*) + ;; + ios) + ;; + none) + ;; + *-eabi) + ;; + *) + echo Invalid configuration \`"$1"\': system \`"$os"\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $cpu-$vendor in + score-*) + os=elf + ;; + spu-*) + os=elf + ;; + *-acorn) + os=riscix1.2 + ;; + arm*-rebel) + os=linux + ;; + arm*-semi) + os=aout + ;; + c4x-* | tic4x-*) + os=coff + ;; + c8051-*) + os=elf + ;; + clipper-intergraph) + os=clix + ;; + hexagon-*) + os=elf + ;; + tic54x-*) + os=coff + ;; + tic55x-*) + os=coff + ;; + tic6x-*) + os=coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=tops20 + ;; + pdp11-*) + os=none + ;; + *-dec | vax-*) + os=ultrix4.2 + ;; + m68*-apollo) + os=domain + ;; + i386-sun) + os=sunos4.0.2 + ;; + m68000-sun) + os=sunos3 + ;; + m68*-cisco) + os=aout + ;; + mep-*) + os=elf + ;; + mips*-cisco) + os=elf + ;; + mips*-*) + os=elf + ;; + or32-*) + os=coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=sysv3 + ;; + sparc-* | *-sun) + os=sunos4.1.1 + ;; + pru-*) + os=elf + ;; + *-be) + os=beos + ;; + *-ibm) + os=aix + ;; + *-knuth) + os=mmixware + ;; + *-wec) + os=proelf + ;; + *-winbond) + os=proelf + ;; + *-oki) + os=proelf + ;; + *-hp) + os=hpux + ;; + *-hitachi) + os=hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=sysv + ;; + *-cbm) + os=amigaos + ;; + *-dg) + os=dgux + ;; + *-dolphin) + os=sysv3 + ;; + m68k-ccur) + os=rtu + ;; + m88k-omron*) + os=luna + ;; + *-next) + os=nextstep + ;; + *-sequent) + os=ptx + ;; + *-crds) + os=unos + ;; + *-ns) + os=genix + ;; + i370-*) + os=mvs + ;; + *-gould) + os=sysv + ;; + *-highlevel) + os=bsd + ;; + *-encore) + os=bsd + ;; + *-sgi) + os=irix + ;; + *-siemens) + os=sysv4 + ;; + *-masscomp) + os=rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=uxpv + ;; + *-rom68k) + os=coff + ;; + *-*bug) + os=coff + ;; + *-apple) + os=macos + ;; + *-atari*) + os=mint + ;; + *-wrs) + os=vxworks + ;; + *) + os=none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +case $vendor in + unknown) + case $os in + riscix*) + vendor=acorn + ;; + sunos*) + vendor=sun + ;; + cnk*|-aix*) + vendor=ibm + ;; + beos*) + vendor=be + ;; + hpux*) + vendor=hp + ;; + mpeix*) + vendor=hp + ;; + hiux*) + vendor=hitachi + ;; + unos*) + vendor=crds + ;; + dgux*) + vendor=dg + ;; + luna*) + vendor=omron + ;; + genix*) + vendor=ns + ;; + clix*) + vendor=intergraph + ;; + mvs* | opened*) + vendor=ibm + ;; + os400*) + vendor=ibm + ;; + ptx*) + vendor=sequent + ;; + tpf*) + vendor=ibm + ;; + vxsim* | vxworks* | windiss*) + vendor=wrs + ;; + aux*) + vendor=apple + ;; + hms*) + vendor=hitachi + ;; + mpw* | macos*) + vendor=apple + ;; + *mint | mint[0-9]* | *MiNT | MiNT[0-9]*) + vendor=atari + ;; + vos*) + vendor=stratus + ;; + esac + ;; +esac + +echo "$cpu-$vendor-$os" +exit + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/config_coinhsl_default.h b/config_coinhsl_default.h new file mode 100644 index 0000000..4fbd6cb --- /dev/null +++ b/config_coinhsl_default.h @@ -0,0 +1,44 @@ + +/***************************************************************************/ +/* HERE DEFINE THE PROJECT SPECIFIC PUBLIC MACROS */ +/* These are only in effect in a setting that doesn't use configure */ +/***************************************************************************/ + +/* Version number of project */ +#define COINHSL_VERSION "2.1.0" + +/* Major Version number of project */ +#define COINHSL_VERSION_MAJOR 2 + +/* Minor Version number of project */ +#define COINHSL_VERSION_MINOR 1 + +/* Release Version number of project */ +#define COINHSL_VERSION_RELEASE 0 + +/* Define to 1 if MA27 is available */ +#define COINHSL_HAS_MA27 1 + +/* Define to 1 if MA28 is available */ +/* #undef COINHSL_HAS_MA28 */ + +/* Define to 1 if MA57 is available */ +/* #undef COINHSL_HAS_MA57 */ + +/* Define to 1 if MA77 is available */ +/* #undef COINHSL_HAS_MA77 */ + +/* Define to 1 if MA86 is available */ +/* #undef COINHSL_HAS_MA86 */ + +/* Define to 1 if MA97 is available */ +/* #undef COINHSL_HAS_MA97 */ + +/* Define to 1 if MC19 is available */ +#define COINHSL_HAS_MC19 1 + +/* Define to 1 if MC68 is available. */ +/* #undef COINHSL_HAS_MC68 */ + +/* Define to 1 if METIS is available */ +/* #undef COINHSL_HAS_METIS */ diff --git a/configure b/configure new file mode 100755 index 0000000..475e6e7 --- /dev/null +++ b/configure @@ -0,0 +1,25333 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.69 for CoinHSL 2.1.0. +# +# Report bugs to . +# +# +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +# +# +# Copyright 2006, 2009 International Business Machines and others. +# All Rights Reserved. +# This file is part of the open source package BuildTools which is distributed +# under the Eclipse Public License. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 + + test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ + || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and +$0: https://github.com/coin-or-tools/ThirdParty-HSL/issues/new +$0: about your system, including any error possibly output +$0: before this message. Then install a modern shell, or +$0: manually run the script under such a shell if you do +$0: have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + +SHELL=${CONFIG_SHELL-/bin/sh} + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='CoinHSL' +PACKAGE_TARNAME='coinhsl' +PACKAGE_VERSION='2.1.0' +PACKAGE_STRING='CoinHSL 2.1.0' +PACKAGE_BUGREPORT='https://github.com/coin-or-tools/ThirdParty-HSL/issues/new' +PACKAGE_URL='https://github.com/coin-or-tools/ThirdParty-HSL' + +ac_unique_file="coinhsl/common/deps.f" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +HSL_CFLAGS_NOPC +HSL_LFLAGS_NOPC +OPENMP_FCFLAGS +FCFLAGS_f90 +FCFLAGS_f +FC_DEFINE +FCFLAGS_F +COIN_HAS_METIS_FALSE +COIN_HAS_METIS_TRUE +METISCHECK_LFLAGS +COIN_HAS_LAPACK_FALSE +COIN_HAS_LAPACK_TRUE +HSL_PCFILES +HSL_LFLAGS +HSL_CFLAGS +COIN_HAS_DEPSF90_FALSE +COIN_HAS_DEPSF90_TRUE +COIN_HAS_HSL_MC68_FALSE +COIN_HAS_HSL_MC68_TRUE +COIN_HAS_HSL_MA97_FALSE +COIN_HAS_HSL_MA97_TRUE +COIN_HAS_HSL_MA86_FALSE +COIN_HAS_HSL_MA86_TRUE +COIN_HAS_HSL_MA77_FALSE +COIN_HAS_HSL_MA77_TRUE +COIN_HAS_MA57_FALSE +COIN_HAS_MA57_TRUE +COIN_HAS_MA28_FALSE +COIN_HAS_MA28_TRUE +COIN_HAS_MA27_FALSE +COIN_HAS_MA27_TRUE +COIN_HAS_MC19_FALSE +COIN_HAS_MC19_TRUE +COIN_PKG_CONFIG_PATH +COIN_HAS_PKGCONFIG_FALSE +COIN_HAS_PKGCONFIG_TRUE +ac_ct_PKG_CONFIG +PKG_CONFIG +COIN_STATIC_BUILD_FALSE +COIN_STATIC_BUILD_TRUE +LT_LDFLAGS +CPP +LT_SYS_LIBRARY_PATH +OTOOL64 +OTOOL +LIPO +NMEDIT +DSYMUTIL +MANIFEST_TOOL +RANLIB +DLLTOOL +OBJDUMP +LN_S +NM +ac_ct_DUMPBIN +DUMPBIN +LD +FGREP +EGREP +GREP +SED +LIBTOOL +ac_ct_AR +AR +ADD_FCFLAGS +ac_ct_FC +FCFLAGS +FC +FLIBS +ADD_FFLAGS +COIN_HAS_F77_FALSE +COIN_HAS_F77_TRUE +ac_ct_F77 +FFLAGS +F77 +ADD_CFLAGS +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +COIN_RELOCATABLE_FALSE +COIN_RELOCATABLE_TRUE +MAINT +MAINTAINER_MODE_FALSE +MAINTAINER_MODE_TRUE +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V +host_os +host_vendor +host_cpu +host +CC +build_os +build_vendor +build_cpu +build +ALWAYS_FALSE_FALSE +ALWAYS_FALSE_TRUE +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL +am__quote' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_msvc +enable_debug +enable_silent_rules +enable_maintainer_mode +enable_relocatable +enable_dependency_tracking +enable_f77 +enable_static +with_pic +enable_shared +enable_fast_install +with_aix_soname +with_gnu_ld +with_sysroot +enable_libtool_lock +with_lapack +with_lapack_lflags +with_metis +with_metis_lflags +with_metis_cflags +enable_openmp +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +ADD_CFLAGS +F77 +FFLAGS +ADD_FFLAGS +FC +FCFLAGS +ADD_FCFLAGS +LT_SYS_LIBRARY_PATH +CPP +LT_LDFLAGS +PKG_CONFIG' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures CoinHSL 2.1.0 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/coinhsl] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of CoinHSL 2.1.0:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-msvc look for and allow only Intel/Microsoft compilers on + MinGW/MSys/Cygwin + --enable-debug build debugging symbols and turn off compiler + optimization + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --enable-maintainer-mode + enable make rules and dependencies not useful (and + sometimes confusing) to the casual installer + --enable-relocatable whether prefix in installed .pc files should be + setup relative to pcfiledir + --enable-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build + --disable-f77 disable checking for F77 compiler + --enable-static[=PKGS] build static libraries [default=no] + --enable-shared[=PKGS] build shared libraries [default=yes] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --disable-libtool-lock avoid locking (might break parallel builds) + --disable-openmp do not use OpenMP + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use + both] + --with-aix-soname=aix|svr4|both + shared library versioning (aka "SONAME") variant to + provide on AIX, [default=aix]. + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-sysroot[=DIR] Search for dependent libraries within DIR (or the + compiler's sysroot if not specified). + --with-lapack Use lapack. If an argument is given, 'yes' is + equivalent to --with-lapack, 'no' is + equivalent to --without-lapack. Any other argument + is applied as for --with-lapack-lflags + --with-lapack-lflags Linker flags for lapack appropriate for your + environment. (Most often, -l specs for libraries.) + --with-metis Use Metis. If an argument is given, 'yes' is + equivalent to --with-metis, 'no' is + equivalent to --without-metis. Any other argument is + applied as for --with-metis-lflags + --with-metis-lflags Linker flags for Metis appropriate for your + environment. (Most often, -l specs for libraries.) + --with-metis-cflags Compiler flags for Metis appropriate for your + environment. (Most often, -I specs for header file + directories.) + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + ADD_CFLAGS Additional C compiler options (if not overwriting CFLAGS) + F77 Fortran 77 compiler command + FFLAGS Fortran 77 compiler flags + ADD_FFLAGS Additional Fortran 77 compiler options (if not overwriting + FFLAGS) + FC Fortran compiler command + FCFLAGS Fortran compiler flags + ADD_FCFLAGS Additional Fortran compiler options (if not overwriting FCFLAGS) + LT_SYS_LIBRARY_PATH + User-defined run-time library search path. + CPP C preprocessor + LT_LDFLAGS Flags passed to libtool when building libraries or executables + that are installed + PKG_CONFIG path to pkg-config utility + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +CoinHSL home page: . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +CoinHSL configure 2.1.0 +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. + + +Copyright 2006, 2009 International Business Machines and others. +All Rights Reserved. +This file is part of the open source package BuildTools which is distributed +under the Eclipse Public License. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_f77_try_compile LINENO +# ---------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_f77_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_f77_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_f77_try_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_fc_try_compile LINENO +# --------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_fc_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_fc_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_fc_try_compile + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# ac_fn_f77_try_link LINENO +# ------------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_f77_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_f77_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_f77_try_link + +# ac_fn_fc_try_link LINENO +# ------------------------ +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_fc_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_fc_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_fc_try_link + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +( $as_echo "## ------------------------------------------------------------------------- ## +## Report this to https://github.com/coin-or-tools/ThirdParty-HSL/issues/new ## +## ------------------------------------------------------------------------- ##" + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by CoinHSL $as_me 2.1.0, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + +# List one file in the package so that the configure script can test +# whether the package is actually there + + +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + + + + + # Check whether --enable-msvc was given. +if test "${enable_msvc+set}" = set; then : + enableval=$enable_msvc; enable_msvc=$enableval +else + enable_msvc=no + case $build in + *-mingw* | *-cygwin* | *-msys* ) + for ac_prog in gcc clang icl cl +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break +done + + case "$CC" in *cl ) enable_msvc=yes ;; esac + ;; + esac +fi + + + + # We want --enable-msvc setup and checked + + + # Check whether --enable-debug was given. +if test "${enable_debug+set}" = set; then : + enableval=$enable_debug; enable_debug=$enableval +else + enable_debug=no +fi + + +# This macro should run before the compiler checks (doesn't seem to be +# sufficient for CFLAGS) + + + + + + +# change default compiler flags +# - debugging enabled: enable debug symbols (-g/-Z7) +# - debugging disabled: disable debug code (-DNDEBUG); enable (more) optimization (-O2) +# - enable exceptions for (i)cl + + if test "$enable_debug" = yes ; then + if test "$enable_msvc" = yes ; then + : ${FFLAGS:="-nologo -fpp -Z7 -MDd $ADD_FFLAGS"} + : ${FCFLAGS:="-nologo -fpp -Z7 -MDd $ADD_FCFLAGS"} + : ${CFLAGS:="-nologo -Z7 -MDd $ADD_CFLAGS"} + : ${CXXFLAGS:="-nologo -EHs -Z7 -MDd $ADD_CXXFLAGS"} + else + : ${FFLAGS:="-g $ADD_FFLAGS"} + : ${FCFLAGS:="-g $ADD_FCFLAGS"} + : ${CFLAGS:="-g $ADD_CFLAGS"} + : ${CXXFLAGS:="-g $ADD_CXXFLAGS"} + fi + else + if test "$enable_msvc" = yes ; then + : ${FFLAGS:="-nologo -fpp -O2 -MD $ADD_FFLAGS"} + : ${FCFLAGS:="-nologo -fpp -O2 -MD $ADD_FCFLAGS"} + : ${CFLAGS:="-nologo -DNDEBUG -O2 -MD $ADD_CFLAGS"} + : ${CXXFLAGS:="-nologo -EHs -DNDEBUG -O2 -MD $ADD_CXXFLAGS"} + else + : ${FFLAGS:="-O2 $ADD_FFLAGS"} + : ${FCFLAGS:="-O2 $ADD_FCFLAGS"} + : ${CFLAGS:="-O2 -DNDEBUG $ADD_CFLAGS"} + : ${CXXFLAGS:="-O2 -DNDEBUG $ADD_CXXFLAGS"} + fi + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +am__api_version='1.16' + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if ${ac_cv_path_mkdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + + +# Enforce the required autoconf version + + +# Set the project's version numbers + + # break up package version number in major.minor.release + # AC_PACKAGE_VERSION is defined by AC_INIT + + + + + # ac-define AC_PACKAGE_VERSION macros, use 9999 for missing values + +cat >>confdefs.h <<_ACEOF +#define COINHSL_VERSION "2.1.0" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define COINHSL_VERSION_MAJOR 2 +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define COINHSL_VERSION_MINOR 1 +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define COINHSL_VERSION_RELEASE 0 +_ACEOF + + + + + +# A useful makefile conditional that is always false + if false; then + ALWAYS_FALSE_TRUE= + ALWAYS_FALSE_FALSE='#' +else + ALWAYS_FALSE_TRUE='#' + ALWAYS_FALSE_FALSE= +fi + + +# Change the default compiler flags. This needs to run before +# AC_CANONICAL_BUILD. + + +# Get the build and host types + + + +# libtool has some magic for host_os and build_os being mingw, but doesn't know about msys + if test $host_os = msys ; then + host_os=mingw + host=`echo $host | sed -e 's/msys/mingw/'` + fi + + if test $build_os = msys ; then + build_os=mingw + build=`echo $build | sed -e 's/msys/mingw/'` + fi + +# Make silent build rules the default (https://www.gnu.org/software/automake/ +# manual/html_node/Automake-Silent-Rules.html). Run before AM_INIT_AUTOMAKE, +# which will AC_REQUIRE it anyway. + # Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=0;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + + +# Initialize automake +# - do not be as strict as for GNU projects +# - don't AC_DEFINE PACKAGE or VERSION (but there're still defined as shell +# variables in configure, and as make variables). +# - disable dist target +# - place objects from sources in subdirs into corresponding subdirs +# - enable all automake warnings + if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='coinhsl' + VERSION='2.1.0' + + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +mkdir_p='$(MKDIR_P)' + +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar pax cpio none' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + + + + + + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 + fi +fi + + +# Disable automatic rebuild of configure/Makefile. Use run_autotools. + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 +$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } + # Check whether --enable-maintainer-mode was given. +if test "${enable_maintainer_mode+set}" = set; then : + enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval +else + USE_MAINTAINER_MODE=no +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 +$as_echo "$USE_MAINTAINER_MODE" >&6; } + if test $USE_MAINTAINER_MODE = yes; then + MAINTAINER_MODE_TRUE= + MAINTAINER_MODE_FALSE='#' +else + MAINTAINER_MODE_TRUE='#' + MAINTAINER_MODE_FALSE= +fi + + MAINT=$MAINTAINER_MODE_TRUE + + + +# Figure out the path where libraries are installed. +# Unless the user specifies --prefix, prefix is set to NONE until the +# end of configuration, at which point it will be set to $ac_default_prefix. +# Unless the user specifies --exec-prefix, exec-prefix is set to NONE until +# the end of configuration, at which point it's set to '${prefix}'. +# Sheesh. So do the expansion, then back it out. + save_prefix=$prefix + save_exec_prefix=$exec_prefix + if test "x$prefix" = xNONE ; then + prefix=$ac_default_prefix + fi + if test "x$exec_prefix" = xNONE ; then + exec_prefix=$prefix + fi + expanded_libdir=$libdir + while expr "$expanded_libdir" : '.*$.*' >/dev/null 2>&1 ; do + eval expanded_libdir=$expanded_libdir + done + prefix=$save_prefix + exec_prefix=$save_exec_prefix + +# add a configure flag to indicate whether .pc files should be made relocatable +# off by default, as it creates libtool warnings + # Check whether --enable-relocatable was given. +if test "${enable_relocatable+set}" = set; then : + enableval=$enable_relocatable; coin_enable_relocatable=$enableval +else + coin_enable_relocatable=no +fi + + if test $coin_enable_relocatable = yes; then + COIN_RELOCATABLE_TRUE= + COIN_RELOCATABLE_FALSE='#' +else + COIN_RELOCATABLE_TRUE='#' + COIN_RELOCATABLE_FALSE= +fi + + + +############################################################################# +# Standard build tool stuff # +############################################################################# + +# Get the name of the C compiler (for metis_adapter.c) +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 +$as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; } +cat > confinc.mk << 'END' +am__doit: + @echo this is the am__doit target >confinc.out +.PHONY: am__doit +END +am__include="#" +am__quote= +# BSD make does it like this. +echo '.include "confinc.mk" # ignored' > confmf.BSD +# Other make implementations (GNU, Solaris 10, AIX) do it like this. +echo 'include confinc.mk # ignored' > confmf.GNU +_am_result=no +for s in GNU BSD; do + { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 + (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + case $?:`cat confinc.out 2>/dev/null` in #( + '0:this is the am__doit target') : + case $s in #( + BSD) : + am__include='.include' am__quote='"' ;; #( + *) : + am__include='include' am__quote='' ;; +esac ;; #( + *) : + ;; +esac + if test "$am__include" != "#"; then + _am_result="yes ($s style)" + break + fi +done +rm -f confinc.* confmf.* +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 +$as_echo "${_am_result}" >&6; } + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + + + + # Setting up libtool with LT_INIT will AC_REQUIRE AC_PROG_CC, but we want + # to invoke it from this macro first so that we can supply a parameter. + + + # If enable-msvc, then test for Intel (on Windows) and MS C compiler + # explicitly and add the compile wrapper before AC_PROG_CC. The compile + # wrapper works around issues related to finding MS link.exe. (Unix link.exe + # occurs first in PATH, which causes compile and link checks to fail.) For + # the same reason, set LD to use the compile wrapper. If CC remains unset + # (neither icl or cl was found, and CC was not set by the user), stop with + # an error. + + if test $enable_msvc = yes ; then + for ac_prog in icl cl +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break +done + + if test -n "$CC" ; then + CC="$am_aux_dir/compile $CC" + ac_cv_prog_CC="$CC" + LD="$CC" + : ${AR:=lib} + else + as_fn_error $? "Neither MS nor Intel C compiler found in PATH and CC is unset." "$LINENO" 5 + fi + fi + + # Look for some C compiler and check that it works. If the user has set CC + # or we found icl/cl above, this shouldn't overwrite CC. Unlike the macros + # that establish C++ or Fortran compilers, PROG_CC also takes care of adding + # the compile wrapper if needed. + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + for ac_prog in gcc clang cc icc icl cl cc xlc xlc_r pgcc + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in gcc clang cc icc icl cl cc xlc xlc_r pgcc +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + + # Declare precious variable for additional compiler flags + + + +# Get the name of the Fortran 77 compiler and appropriate compiler options + + # AC_MSG_NOTICE([In COIN_PROG_F77]) + + + # Check whether --enable-f77 was given. +if test "${enable_f77+set}" = set; then : + enableval=$enable_f77; enable_f77=$enableval +else + enable_f77=yes +fi + + + if test "$enable_f77" = no ; then + # make sure F77 is not set + unset F77 + else + # If enable-msvc, then test for Intel Fortran compiler for Windows + # explicitly and add the compile wrapper before AC_PROG_F77. The compile + # wrapper works around issues related to finding MS link.exe. (Unix + # link.exe occurs first in PATH, which causes compile and link checks to + # fail.) For the same reason, set LD to use the compile wrapper. + if test $enable_msvc = yes ; then + for ac_prog in ifort +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$F77"; then + ac_cv_prog_F77="$F77" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_F77="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +F77=$ac_cv_prog_F77 +if test -n "$F77"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $F77" >&5 +$as_echo "$F77" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$F77" && break +done + + if test -n "$F77" ; then + F77="$am_aux_dir/compile $F77" + ac_cv_prog_F77="$F77" + LD="$F77" + : ${AR:=lib} + fi + fi + + # If not msvc-enabled, then look for some Fortran compiler and check + # whether it works. If F77 is set, this simply checks whether it works. + if test $enable_msvc = no || test -n "$F77" ; then + ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu +if test -n "$ac_tool_prefix"; then + for ac_prog in gfortran ifort g95 fort77 f77 f95 f90 g77 pgf90 pgf77 ifc frt af77 xlf_r fl32 + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$F77"; then + ac_cv_prog_F77="$F77" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_F77="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +F77=$ac_cv_prog_F77 +if test -n "$F77"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $F77" >&5 +$as_echo "$F77" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$F77" && break + done +fi +if test -z "$F77"; then + ac_ct_F77=$F77 + for ac_prog in gfortran ifort g95 fort77 f77 f95 f90 g77 pgf90 pgf77 ifc frt af77 xlf_r fl32 +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_F77"; then + ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_F77="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_F77=$ac_cv_prog_ac_ct_F77 +if test -n "$ac_ct_F77"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_F77" >&5 +$as_echo "$ac_ct_F77" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_F77" && break +done + + if test "x$ac_ct_F77" = x; then + F77="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + F77=$ac_ct_F77 + fi +fi + + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran 77 compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done +rm -f a.out + +# If we don't use `.F' as extension, the preprocessor is not run on the +# input file. (Note that this only needs to work for GNU compilers.) +ac_save_ext=$ac_ext +ac_ext=F +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU Fortran 77 compiler" >&5 +$as_echo_n "checking whether we are using the GNU Fortran 77 compiler... " >&6; } +if ${ac_cv_f77_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat > conftest.$ac_ext <<_ACEOF + program main +#ifndef __GNUC__ + choke me +#endif + + end +_ACEOF +if ac_fn_f77_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_f77_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_f77_compiler_gnu" >&5 +$as_echo "$ac_cv_f77_compiler_gnu" >&6; } +ac_ext=$ac_save_ext +ac_test_FFLAGS=${FFLAGS+set} +ac_save_FFLAGS=$FFLAGS +FFLAGS= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $F77 accepts -g" >&5 +$as_echo_n "checking whether $F77 accepts -g... " >&6; } +if ${ac_cv_prog_f77_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + FFLAGS=-g +cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +if ac_fn_f77_try_compile "$LINENO"; then : + ac_cv_prog_f77_g=yes +else + ac_cv_prog_f77_g=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_f77_g" >&5 +$as_echo "$ac_cv_prog_f77_g" >&6; } +if test "$ac_test_FFLAGS" = set; then + FFLAGS=$ac_save_FFLAGS +elif test $ac_cv_prog_f77_g = yes; then + if test "x$ac_cv_f77_compiler_gnu" = xyes; then + FFLAGS="-g -O2" + else + FFLAGS="-g" + fi +else + if test "x$ac_cv_f77_compiler_gnu" = xyes; then + FFLAGS="-O2" + else + FFLAGS= + fi +fi + +if test $ac_compiler_gnu = yes; then + G77=yes +else + G77= +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + fi + fi + + # Allow for the possibility that there is no Fortran compiler on the system. + if test -z "$F77" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: No Fortran 77 compiler available." >&5 +$as_echo "$as_me: No Fortran 77 compiler available." >&6;} + fi + if test -n "$F77"; then + COIN_HAS_F77_TRUE= + COIN_HAS_F77_FALSE='#' +else + COIN_HAS_F77_TRUE='#' + COIN_HAS_F77_FALSE= +fi + + + # Declare precious variable for additional compiler flags + + + # AC_MSG_NOTICE([Leaving COIN_PROG_F77]) + +if test -z "$F77" ; then + as_fn_error $? "No Fortran compiler." "$LINENO" 5 +fi + +ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to get verbose linking output from $F77" >&5 +$as_echo_n "checking how to get verbose linking output from $F77... " >&6; } +if ${ac_cv_prog_f77_v+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +if ac_fn_f77_try_compile "$LINENO"; then : + ac_cv_prog_f77_v= +# Try some options frequently used verbose output +for ac_verb in -v -verbose --verbose -V -\#\#\#; do + cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF + +# Compile and link our simple test program by passing a flag (argument +# 1 to this macro) to the Fortran compiler in order to get +# "verbose" output that we can then parse for the Fortran linker +# flags. +ac_save_FFLAGS=$FFLAGS +FFLAGS="$FFLAGS $ac_verb" +eval "set x $ac_link" +shift +$as_echo "$as_me:${as_lineno-$LINENO}: $*" >&5 +# gfortran 4.3 outputs lines setting COLLECT_GCC_OPTIONS, COMPILER_PATH, +# LIBRARY_PATH; skip all such settings. +ac_f77_v_output=`eval $ac_link 5>&1 2>&1 | + sed '/^Driving:/d; /^Configured with:/d; + '"/^[_$as_cr_Letters][_$as_cr_alnum]*=/d"` +$as_echo "$ac_f77_v_output" >&5 +FFLAGS=$ac_save_FFLAGS + +rm -rf conftest* + +# On HP/UX there is a line like: "LPATH is: /foo:/bar:/baz" where +# /foo, /bar, and /baz are search directories for the Fortran linker. +# Here, we change these into -L/foo -L/bar -L/baz (and put it first): +ac_f77_v_output="`echo $ac_f77_v_output | + grep 'LPATH is:' | + sed 's|.*LPATH is\(: *[^ ]*\).*|\1|;s|: */| -L/|g'` $ac_f77_v_output" + +# FIXME: we keep getting bitten by quoted arguments; a more general fix +# that detects unbalanced quotes in FLIBS should be implemented +# and (ugh) tested at some point. +case $ac_f77_v_output in + # With xlf replace commas with spaces, + # and remove "-link" and closing parenthesis. + *xlfentry*) + ac_f77_v_output=`echo $ac_f77_v_output | + sed ' + s/,/ /g + s/ -link / /g + s/) *$// + ' + ` ;; + + # With Intel ifc, ignore the quoted -mGLOB_options_string stuff (quoted + # $LIBS confuse us, and the libraries appear later in the output anyway). + *mGLOB_options_string*) + ac_f77_v_output=`echo $ac_f77_v_output | sed 's/"-mGLOB[^"]*"/ /g'` ;; + + # Portland Group compiler has singly- or doubly-quoted -cmdline argument + # Singly-quoted arguments were reported for versions 5.2-4 and 6.0-4. + # Doubly-quoted arguments were reported for "PGF90/x86 Linux/x86 5.0-2". + *-cmdline\ * | *-ignore\ * | *-def\ *) + ac_f77_v_output=`echo $ac_f77_v_output | sed "\ + s/-cmdline *'[^']*'/ /g; s/-cmdline *\"[^\"]*\"/ /g + s/-ignore *'[^']*'/ /g; s/-ignore *\"[^\"]*\"/ /g + s/-def *'[^']*'/ /g; s/-def *\"[^\"]*\"/ /g"` ;; + + # If we are using fort77 (the f2c wrapper) then filter output and delete quotes. + *fort77*f2c*gcc*) + ac_f77_v_output=`echo "$ac_f77_v_output" | sed -n ' + /:[ ]\+Running[ ]\{1,\}"gcc"/{ + /"-c"/d + /[.]c"*/d + s/^.*"gcc"/"gcc"/ + s/"//gp + }'` ;; + + # If we are using Cray Fortran then delete quotes. + *cft90*) + ac_f77_v_output=`echo $ac_f77_v_output | sed 's/"//g'` ;; +esac + + + # look for -l* and *.a constructs in the output + for ac_arg in $ac_f77_v_output; do + case $ac_arg in + [\\/]*.a | ?:[\\/]*.a | -[lLRu]*) + ac_cv_prog_f77_v=$ac_verb + break 2 ;; + esac + done +done +if test -z "$ac_cv_prog_f77_v"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot determine how to obtain linking information from $F77" >&5 +$as_echo "$as_me: WARNING: cannot determine how to obtain linking information from $F77" >&2;} +fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: compilation failed" >&5 +$as_echo "$as_me: WARNING: compilation failed" >&2;} +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_f77_v" >&5 +$as_echo "$ac_cv_prog_f77_v" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran 77 libraries of $F77" >&5 +$as_echo_n "checking for Fortran 77 libraries of $F77... " >&6; } +if ${ac_cv_f77_libs+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$FLIBS" != "x"; then + ac_cv_f77_libs="$FLIBS" # Let the user override the test. +else + +cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF + +# Compile and link our simple test program by passing a flag (argument +# 1 to this macro) to the Fortran compiler in order to get +# "verbose" output that we can then parse for the Fortran linker +# flags. +ac_save_FFLAGS=$FFLAGS +FFLAGS="$FFLAGS $ac_cv_prog_f77_v" +eval "set x $ac_link" +shift +$as_echo "$as_me:${as_lineno-$LINENO}: $*" >&5 +# gfortran 4.3 outputs lines setting COLLECT_GCC_OPTIONS, COMPILER_PATH, +# LIBRARY_PATH; skip all such settings. +ac_f77_v_output=`eval $ac_link 5>&1 2>&1 | + sed '/^Driving:/d; /^Configured with:/d; + '"/^[_$as_cr_Letters][_$as_cr_alnum]*=/d"` +$as_echo "$ac_f77_v_output" >&5 +FFLAGS=$ac_save_FFLAGS + +rm -rf conftest* + +# On HP/UX there is a line like: "LPATH is: /foo:/bar:/baz" where +# /foo, /bar, and /baz are search directories for the Fortran linker. +# Here, we change these into -L/foo -L/bar -L/baz (and put it first): +ac_f77_v_output="`echo $ac_f77_v_output | + grep 'LPATH is:' | + sed 's|.*LPATH is\(: *[^ ]*\).*|\1|;s|: */| -L/|g'` $ac_f77_v_output" + +# FIXME: we keep getting bitten by quoted arguments; a more general fix +# that detects unbalanced quotes in FLIBS should be implemented +# and (ugh) tested at some point. +case $ac_f77_v_output in + # With xlf replace commas with spaces, + # and remove "-link" and closing parenthesis. + *xlfentry*) + ac_f77_v_output=`echo $ac_f77_v_output | + sed ' + s/,/ /g + s/ -link / /g + s/) *$// + ' + ` ;; + + # With Intel ifc, ignore the quoted -mGLOB_options_string stuff (quoted + # $LIBS confuse us, and the libraries appear later in the output anyway). + *mGLOB_options_string*) + ac_f77_v_output=`echo $ac_f77_v_output | sed 's/"-mGLOB[^"]*"/ /g'` ;; + + # Portland Group compiler has singly- or doubly-quoted -cmdline argument + # Singly-quoted arguments were reported for versions 5.2-4 and 6.0-4. + # Doubly-quoted arguments were reported for "PGF90/x86 Linux/x86 5.0-2". + *-cmdline\ * | *-ignore\ * | *-def\ *) + ac_f77_v_output=`echo $ac_f77_v_output | sed "\ + s/-cmdline *'[^']*'/ /g; s/-cmdline *\"[^\"]*\"/ /g + s/-ignore *'[^']*'/ /g; s/-ignore *\"[^\"]*\"/ /g + s/-def *'[^']*'/ /g; s/-def *\"[^\"]*\"/ /g"` ;; + + # If we are using fort77 (the f2c wrapper) then filter output and delete quotes. + *fort77*f2c*gcc*) + ac_f77_v_output=`echo "$ac_f77_v_output" | sed -n ' + /:[ ]\+Running[ ]\{1,\}"gcc"/{ + /"-c"/d + /[.]c"*/d + s/^.*"gcc"/"gcc"/ + s/"//gp + }'` ;; + + # If we are using Cray Fortran then delete quotes. + *cft90*) + ac_f77_v_output=`echo $ac_f77_v_output | sed 's/"//g'` ;; +esac + + + +ac_cv_f77_libs= + +# Save positional arguments (if any) +ac_save_positional="$@" + +set X $ac_f77_v_output +while test $# != 1; do + shift + ac_arg=$1 + case $ac_arg in + [\\/]*.a | ?:[\\/]*.a) + ac_exists=false + for ac_i in $ac_cv_f77_libs; do + if test x"$ac_arg" = x"$ac_i"; then + ac_exists=true + break + fi + done + + if test x"$ac_exists" = xtrue; then : + +else + ac_cv_f77_libs="$ac_cv_f77_libs $ac_arg" +fi + ;; + -bI:*) + ac_exists=false + for ac_i in $ac_cv_f77_libs; do + if test x"$ac_arg" = x"$ac_i"; then + ac_exists=true + break + fi + done + + if test x"$ac_exists" = xtrue; then : + +else + if test "$ac_compiler_gnu" = yes; then + for ac_link_opt in $ac_arg; do + ac_cv_f77_libs="$ac_cv_f77_libs -Xlinker $ac_link_opt" + done +else + ac_cv_f77_libs="$ac_cv_f77_libs $ac_arg" +fi +fi + ;; + # Ignore these flags. + -lang* | -lcrt*.o | -lc | -lgcc* | -lSystem | -libmil | -little \ + |-LANG:=* | -LIST:* | -LNO:* | -link) + ;; + -lkernel32) + case $host_os in + *cygwin*) ;; + *) ac_cv_f77_libs="$ac_cv_f77_libs $ac_arg" + ;; + esac + ;; + -[LRuYz]) + # These flags, when seen by themselves, take an argument. + # We remove the space between option and argument and re-iterate + # unless we find an empty arg or a new option (starting with -) + case $2 in + "" | -*);; + *) + ac_arg="$ac_arg$2" + shift; shift + set X $ac_arg "$@" + ;; + esac + ;; + -YP,*) + for ac_j in `$as_echo "$ac_arg" | sed -e 's/-YP,/-L/;s/:/ -L/g'`; do + ac_exists=false + for ac_i in $ac_cv_f77_libs; do + if test x"$ac_j" = x"$ac_i"; then + ac_exists=true + break + fi + done + + if test x"$ac_exists" = xtrue; then : + +else + ac_arg="$ac_arg $ac_j" + ac_cv_f77_libs="$ac_cv_f77_libs $ac_j" +fi + done + ;; + -[lLR]*) + ac_exists=false + for ac_i in $ac_cv_f77_libs; do + if test x"$ac_arg" = x"$ac_i"; then + ac_exists=true + break + fi + done + + if test x"$ac_exists" = xtrue; then : + +else + ac_cv_f77_libs="$ac_cv_f77_libs $ac_arg" +fi + ;; + -zallextract*| -zdefaultextract) + ac_cv_f77_libs="$ac_cv_f77_libs $ac_arg" + ;; + # Ignore everything else. + esac +done +# restore positional arguments +set X $ac_save_positional; shift + +# We only consider "LD_RUN_PATH" on Solaris systems. If this is seen, +# then we insist that the "run path" must be an absolute path (i.e. it +# must begin with a "/"). +case `(uname -sr) 2>/dev/null` in + "SunOS 5"*) + ac_ld_run_path=`$as_echo "$ac_f77_v_output" | + sed -n 's,^.*LD_RUN_PATH *= *\(/[^ ]*\).*$,-R\1,p'` + test "x$ac_ld_run_path" != x && + if test "$ac_compiler_gnu" = yes; then + for ac_link_opt in $ac_ld_run_path; do + ac_cv_f77_libs="$ac_cv_f77_libs -Xlinker $ac_link_opt" + done +else + ac_cv_f77_libs="$ac_cv_f77_libs $ac_ld_run_path" +fi + ;; +esac +fi # test "x$[]_AC_LANG_PREFIX[]LIBS" = "x" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_f77_libs" >&5 +$as_echo "$ac_cv_f77_libs" >&6; } +FLIBS="$ac_cv_f77_libs" + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dummy main to link with Fortran 77 libraries" >&5 +$as_echo_n "checking for dummy main to link with Fortran 77 libraries... " >&6; } +if ${ac_cv_f77_dummy_main+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_f77_dm_save_LIBS=$LIBS + LIBS="$LIBS $FLIBS" + ac_fortran_dm_var=F77_DUMMY_MAIN + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + # First, try linking without a dummy main: + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_fortran_dummy_main=none +else + ac_cv_fortran_dummy_main=unknown +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + if test $ac_cv_fortran_dummy_main = unknown; then + for ac_func in MAIN__ MAIN_ __main MAIN _MAIN __MAIN main_ main__ _main; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define $ac_fortran_dm_var $ac_func +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_fortran_dummy_main=$ac_func; break +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + done + fi + ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu + ac_cv_f77_dummy_main=$ac_cv_fortran_dummy_main + rm -rf conftest* + LIBS=$ac_f77_dm_save_LIBS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_f77_dummy_main" >&5 +$as_echo "$ac_cv_f77_dummy_main" >&6; } +F77_DUMMY_MAIN=$ac_cv_f77_dummy_main +if test "$F77_DUMMY_MAIN" != unknown; then : + if test $F77_DUMMY_MAIN != none; then + +cat >>confdefs.h <<_ACEOF +#define F77_DUMMY_MAIN $F77_DUMMY_MAIN +_ACEOF + + if test "x$ac_cv_fc_dummy_main" = "x$ac_cv_f77_dummy_main"; then + +$as_echo "#define FC_DUMMY_MAIN_EQ_F77 1" >>confdefs.h + + fi +fi +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "linking to Fortran libraries from C fails +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran 77 name-mangling scheme" >&5 +$as_echo_n "checking for Fortran 77 name-mangling scheme... " >&6; } +if ${ac_cv_f77_mangling+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat > conftest.$ac_ext <<_ACEOF + subroutine foobar() + return + end + subroutine foo_bar() + return + end +_ACEOF +if ac_fn_f77_try_compile "$LINENO"; then : + mv conftest.$ac_objext cfortran_test.$ac_objext + + ac_save_LIBS=$LIBS + LIBS="cfortran_test.$ac_objext $LIBS $FLIBS" + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + ac_success=no + for ac_foobar in foobar FOOBAR; do + for ac_underscore in "" "_"; do + ac_func="$ac_foobar$ac_underscore" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_success=yes; break 2 +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + done + done + ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu + + if test "$ac_success" = "yes"; then + case $ac_foobar in + foobar) + ac_case=lower + ac_foo_bar=foo_bar + ;; + FOOBAR) + ac_case=upper + ac_foo_bar=FOO_BAR + ;; + esac + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + ac_success_extra=no + for ac_extra in "" "_"; do + ac_func="$ac_foo_bar$ac_underscore$ac_extra" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_success_extra=yes; break +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + done + ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu + + if test "$ac_success_extra" = "yes"; then + ac_cv_f77_mangling="$ac_case case" + if test -z "$ac_underscore"; then + ac_cv_f77_mangling="$ac_cv_f77_mangling, no underscore" + else + ac_cv_f77_mangling="$ac_cv_f77_mangling, underscore" + fi + if test -z "$ac_extra"; then + ac_cv_f77_mangling="$ac_cv_f77_mangling, no extra underscore" + else + ac_cv_f77_mangling="$ac_cv_f77_mangling, extra underscore" + fi + else + ac_cv_f77_mangling="unknown" + fi + else + ac_cv_f77_mangling="unknown" + fi + + LIBS=$ac_save_LIBS + rm -rf conftest* + rm -f cfortran_test* +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compile a simple Fortran program +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_f77_mangling" >&5 +$as_echo "$ac_cv_f77_mangling" >&6; } + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + # AC_MSG_NOTICE([In COIN_F77_SETUP]) + +# F77_WRAPPERS will trigger the necessary F77 setup macros (F77_MAIN, +# F77_LIBRARY_LDFLAGS, etc.) + ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu +case $ac_cv_f77_mangling in + "lower case, no underscore, no extra underscore") + $as_echo "#define F77_FUNC(name,NAME) name" >>confdefs.h + + $as_echo "#define F77_FUNC_(name,NAME) name" >>confdefs.h + ;; + "lower case, no underscore, extra underscore") + $as_echo "#define F77_FUNC(name,NAME) name" >>confdefs.h + + $as_echo "#define F77_FUNC_(name,NAME) name ## _" >>confdefs.h + ;; + "lower case, underscore, no extra underscore") + $as_echo "#define F77_FUNC(name,NAME) name ## _" >>confdefs.h + + $as_echo "#define F77_FUNC_(name,NAME) name ## _" >>confdefs.h + ;; + "lower case, underscore, extra underscore") + $as_echo "#define F77_FUNC(name,NAME) name ## _" >>confdefs.h + + $as_echo "#define F77_FUNC_(name,NAME) name ## __" >>confdefs.h + ;; + "upper case, no underscore, no extra underscore") + $as_echo "#define F77_FUNC(name,NAME) NAME" >>confdefs.h + + $as_echo "#define F77_FUNC_(name,NAME) NAME" >>confdefs.h + ;; + "upper case, no underscore, extra underscore") + $as_echo "#define F77_FUNC(name,NAME) NAME" >>confdefs.h + + $as_echo "#define F77_FUNC_(name,NAME) NAME ## _" >>confdefs.h + ;; + "upper case, underscore, no extra underscore") + $as_echo "#define F77_FUNC(name,NAME) NAME ## _" >>confdefs.h + + $as_echo "#define F77_FUNC_(name,NAME) NAME ## _" >>confdefs.h + ;; + "upper case, underscore, extra underscore") + $as_echo "#define F77_FUNC(name,NAME) NAME ## _" >>confdefs.h + + $as_echo "#define F77_FUNC_(name,NAME) NAME ## __" >>confdefs.h + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unknown Fortran name-mangling scheme" >&5 +$as_echo "$as_me: WARNING: unknown Fortran name-mangling scheme" >&2;} + ;; +esac + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + # check whether compile script should be used to wrap around Fortran 77 compiler + ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $F77 understands -c and -o together" >&5 +$as_echo_n "checking whether $F77 understands -c and -o together... " >&6; } +if ${ac_cv_prog_f77_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +# We test twice because some compilers refuse to overwrite an existing +# `.o' file with `-o', although they will create one. +ac_try='$F77 $FFLAGS -c conftest.$ac_ext -o conftest2.$ac_objext >&5' +rm -f conftest2.* +if { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && + test -f conftest2.$ac_objext && + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + ac_cv_prog_f77_c_o=yes +else + ac_cv_prog_f77_c_o=no +fi +rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_f77_c_o" >&5 +$as_echo "$ac_cv_prog_f77_c_o" >&6; } +if test $ac_cv_prog_f77_c_o = no; then + +$as_echo "#define F77_NO_MINUS_C_MINUS_O 1" >>confdefs.h + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + if test $ac_cv_prog_f77_c_o = no ; then + F77="$am_aux_dir/compile $F77" + else + case "$F77" in *ifort ) + case $build in + *-mingw* | *-cygwin* | *-msys* ) F77="$am_aux_dir/compile $F77" ;; esac + ;; + esac + fi + # AC_MSG_NOTICE([Leaving COIN_F77_SETUP]) + + +# Get the name of the Fortran 90 compiler and appropriate compiler options + + + + # If enable-msvc, then test for Intel Fortran compiler for Windows + # explicitly and add compile-wrapper before AC_PROG_FC, because + # the compile-wrapper work around issues when having the wrong link.exe + # in the PATH first, which could upset tests in AC_PROG_FC. + if test $enable_msvc = yes ; then + for ac_prog in ifort +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_FC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$FC"; then + ac_cv_prog_FC="$FC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_FC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +FC=$ac_cv_prog_FC +if test -n "$FC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FC" >&5 +$as_echo "$FC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$FC" && break +done + + if test -n "$FC" ; then + FC="$am_aux_dir/compile $FC" + fi + fi + + # if not msvc-enabled, then look for some Fortran compiler and check whether it works + # if FC is set, then this only checks whether it works + if test $enable_msvc = no || test -n "$FC" ; then + ac_ext=${ac_fc_srcext-f} +ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' +ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_fc_compiler_gnu +if test -n "$ac_tool_prefix"; then + for ac_prog in gfortran ifort g95 f95 f90 pgf90 ifc frt xlf_r fl32 + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_FC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$FC"; then + ac_cv_prog_FC="$FC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_FC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +FC=$ac_cv_prog_FC +if test -n "$FC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FC" >&5 +$as_echo "$FC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$FC" && break + done +fi +if test -z "$FC"; then + ac_ct_FC=$FC + for ac_prog in gfortran ifort g95 f95 f90 pgf90 ifc frt xlf_r fl32 +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_FC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_FC"; then + ac_cv_prog_ac_ct_FC="$ac_ct_FC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_FC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_FC=$ac_cv_prog_ac_ct_FC +if test -n "$ac_ct_FC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_FC" >&5 +$as_echo "$ac_ct_FC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_FC" && break +done + + if test "x$ac_ct_FC" = x; then + FC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + FC=$ac_ct_FC + fi +fi + + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done +rm -f a.out + +# If we don't use `.F' as extension, the preprocessor is not run on the +# input file. (Note that this only needs to work for GNU compilers.) +ac_save_ext=$ac_ext +ac_ext=F +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU Fortran compiler" >&5 +$as_echo_n "checking whether we are using the GNU Fortran compiler... " >&6; } +if ${ac_cv_fc_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat > conftest.$ac_ext <<_ACEOF + program main +#ifndef __GNUC__ + choke me +#endif + + end +_ACEOF +if ac_fn_fc_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_fc_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_compiler_gnu" >&5 +$as_echo "$ac_cv_fc_compiler_gnu" >&6; } +ac_ext=$ac_save_ext +ac_test_FCFLAGS=${FCFLAGS+set} +ac_save_FCFLAGS=$FCFLAGS +FCFLAGS= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $FC accepts -g" >&5 +$as_echo_n "checking whether $FC accepts -g... " >&6; } +if ${ac_cv_prog_fc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + FCFLAGS=-g +cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +if ac_fn_fc_try_compile "$LINENO"; then : + ac_cv_prog_fc_g=yes +else + ac_cv_prog_fc_g=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_fc_g" >&5 +$as_echo "$ac_cv_prog_fc_g" >&6; } +if test "$ac_test_FCFLAGS" = set; then + FCFLAGS=$ac_save_FCFLAGS +elif test $ac_cv_prog_fc_g = yes; then + if test "x$ac_cv_fc_compiler_gnu" = xyes; then + FCFLAGS="-g -O2" + else + FCFLAGS="-g" + fi +else + if test "x$ac_cv_fc_compiler_gnu" = xyes; then + FCFLAGS="-O2" + else + FCFLAGS= + fi +fi + +if test $ac_compiler_gnu = yes; then + GFC=yes +else + GFC= +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + fi + + # check whether compile script should be used to wrap around Fortran compiler + if test -n "$FC" ; then + ac_ext=${ac_fc_srcext-f} +ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' +ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_fc_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $FC understands -c and -o together" >&5 +$as_echo_n "checking whether $FC understands -c and -o together... " >&6; } +if ${ac_cv_prog_fc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +# We test twice because some compilers refuse to overwrite an existing +# `.o' file with `-o', although they will create one. +ac_try='$FC $FCFLAGS -c conftest.$ac_ext -o conftest2.$ac_objext >&5' +rm -f conftest2.* +if { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && + test -f conftest2.$ac_objext && + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + ac_cv_prog_fc_c_o=yes +else + ac_cv_prog_fc_c_o=no +fi +rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_fc_c_o" >&5 +$as_echo "$ac_cv_prog_fc_c_o" >&6; } +if test $ac_cv_prog_fc_c_o = no; then + +$as_echo "#define FC_NO_MINUS_C_MINUS_O 1" >>confdefs.h + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + if test $ac_cv_prog_fc_c_o = no ; then + FC="$am_aux_dir/compile $FC" + fi + fi + + # Declare precious variable for additional compiler flags + + + +# Initialize libtool +case `pwd` in + *\ * | *\ *) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac + + + +macro_version='2.4.6' +macro_revision='2.4.6' + + + + + + + + + + + + + +ltmain=$ac_aux_dir/ltmain.sh + +# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +$as_echo_n "checking how to print strings... " >&6; } +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "" +} + +case $ECHO in + printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +$as_echo "printf" >&6; } ;; + print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +$as_echo "print -r" >&6; } ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +$as_echo "cat" >&6; } ;; +esac + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${ac_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_SED" || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +$as_echo_n "checking for fgrep... " >&6; } +if ${ac_cv_path_FGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in fgrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_FGREP" || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_FGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_FGREP=$FGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +$as_echo "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +test -z "$GREP" && GREP=grep + + + + + + + + + + + + + + + + + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if ${lt_cv_path_NM+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM=$NM +else + lt_nm_to_check=${ac_tool_prefix}nm + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/$lt_tmp_nm + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the 'sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS=$lt_save_ifs + done + : ${lt_cv_path_NM=no} +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +$as_echo "$lt_cv_path_NM" >&6; } +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + if test -n "$ac_tool_prefix"; then + for ac_prog in dumpbin "link -dump" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DUMPBIN"; then + ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DUMPBIN=$ac_cv_prog_DUMPBIN +if test -n "$DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +$as_echo "$DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$DUMPBIN" && break + done +fi +if test -z "$DUMPBIN"; then + ac_ct_DUMPBIN=$DUMPBIN + for ac_prog in dumpbin "link -dump" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DUMPBIN"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +if test -n "$ac_ct_DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +$as_echo "$ac_ct_DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_DUMPBIN" && break +done + + if test "x$ac_ct_DUMPBIN" = x; then + DUMPBIN=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DUMPBIN=$ac_ct_DUMPBIN + fi +fi + + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + DUMPBIN=: + ;; + esac + fi + + if test : != "$DUMPBIN"; then + NM=$DUMPBIN + fi +fi +test -z "$NM" && NM=nm + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +$as_echo_n "checking the name lister ($NM) interface... " >&6; } +if ${lt_cv_nm_interface+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: output\"" >&5) + cat conftest.out >&5 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +$as_echo "$lt_cv_nm_interface" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + +# find the maximum length of command line arguments +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if ${lt_cv_sys_max_cmd_len+:} false; then : + $as_echo_n "(cached) " >&6 +else + i=0 + teststring=ABCD + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test X`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test 17 != "$i" # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac + +fi + +if test -n "$lt_cv_sys_max_cmd_len"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } +fi +max_cmd_len=$lt_cv_sys_max_cmd_len + + + + + + +: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi + + + + + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +$as_echo_n "checking how to convert $build file names to $host format... " >&6; } +if ${lt_cv_to_host_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac + +fi + +to_host_file_cmd=$lt_cv_to_host_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +$as_echo "$lt_cv_to_host_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } +if ${lt_cv_to_tool_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + #assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac + +fi + +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +$as_echo "$lt_cv_to_tool_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if ${lt_cv_ld_reload_flag+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +$as_echo "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + if test yes != "$GCC"; then + reload_cmds=false + fi + ;; + darwin*) + if test yes = "$GCC"; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +$as_echo_n "checking how to recognize dependent libraries... " >&6; } +if ${lt_cv_deplibs_check_method+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# 'unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# that responds to the $file_magic_cmd with a given extended regex. +# If you have 'file' or equivalent on your system and you're not sure +# whether 'pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[4-9]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + + + + + + + + + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +$as_echo_n "checking how to associate runtime and link libraries... " >&6; } +if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd=$ECHO + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + + + + + + + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} +: ${AR_FLAGS=cru} + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +$as_echo_n "checking for archiver @FILE support... " >&6; } +if ${lt_cv_ar_at_file+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ar_at_file=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -eq "$ac_status"; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -ne "$ac_status"; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +$as_echo "$lt_cv_ar_at_file" >&6; } + +if test no = "$lt_cv_ar_at_file"; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +test -z "$STRIP" && STRIP=: + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +test -z "$RANLIB" && RANLIB=: + + + + + + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + bitrig* | openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +if ${lt_cv_sys_global_symbol_pipe+:} false; then : + $as_echo_n "(cached) " >&6 +else + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[ABCDGISTW]' + ;; +hpux*) + if test ia64 = "$host_cpu"; then + symcode='[ABCDEGRST]' + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function, + # D for any global variable and I for any imported variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK '"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 + (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS=conftstm.$ac_objext + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest$ac_exeext; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test yes = "$pipe_works"; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +$as_echo "failed" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +$as_echo_n "checking for sysroot... " >&6; } + +# Check whether --with-sysroot was given. +if test "${with_sysroot+set}" = set; then : + withval=$with_sysroot; +else + with_sysroot=no +fi + + +lt_sysroot= +case $with_sysroot in #( + yes) + if test yes = "$GCC"; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 +$as_echo "$with_sysroot" >&6; } + as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 + ;; +esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +$as_echo "${lt_sysroot:-no}" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 +$as_echo_n "checking for a working dd... " >&6; } +if ${ac_cv_path_lt_DD+:} false; then : + $as_echo_n "(cached) " >&6 +else + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +if test -z "$lt_DD"; then + ac_path_lt_DD_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in dd; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_lt_DD" || continue +if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi + $ac_path_lt_DD_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_lt_DD"; then + : + fi +else + ac_cv_path_lt_DD=$lt_DD +fi + +rm -f conftest.i conftest2.i conftest.out +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 +$as_echo "$ac_cv_path_lt_DD" >&6; } + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 +$as_echo_n "checking how to truncate binary pipes... " >&6; } +if ${lt_cv_truncate_bin+:} false; then : + $as_echo_n "(cached) " >&6 +else + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 +$as_echo "$lt_cv_truncate_bin" >&6; } + + + + + + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +fi + +test no = "$enable_libtool_lock" || enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out what ABI is being produced by ac_compile, and set mode + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE=32 + ;; + *ELF-64*) + HPUX_IA64_MODE=64 + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if test yes = "$lt_cv_prog_gnu_ld"; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + emul=elf + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -belf" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if ${lt_cv_cc_needs_belf+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_cc_needs_belf=yes +else + lt_cv_cc_needs_belf=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } + if test yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*|x86_64-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD=${LD-ld}_sol2 + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks=$enable_libtool_lock + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. +set dummy ${ac_tool_prefix}mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MANIFEST_TOOL"; then + ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL +if test -n "$MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +$as_echo "$MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_MANIFEST_TOOL"; then + ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL + # Extract the first word of "mt", so it can be a program name with args. +set dummy mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_MANIFEST_TOOL"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL +if test -n "$ac_ct_MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_MANIFEST_TOOL" = x; then + MANIFEST_TOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + fi +else + MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" +fi + +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if ${lt_cv_path_mainfest_tool+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&5 + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +$as_echo "$lt_cv_path_mainfest_tool" >&6; } +if test yes != "$lt_cv_path_mainfest_tool"; then + MANIFEST_TOOL=: +fi + + + + + + + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +$as_echo "$DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +$as_echo "$ac_ct_DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +$as_echo "$NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +$as_echo "$ac_ct_NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +set dummy ${ac_tool_prefix}lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$LIPO"; then + ac_cv_prog_LIPO="$LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +LIPO=$ac_cv_prog_LIPO +if test -n "$LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +$as_echo "$LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_LIPO"; then + ac_ct_LIPO=$LIPO + # Extract the first word of "lipo", so it can be a program name with args. +set dummy lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_LIPO"; then + ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_LIPO="lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO +if test -n "$ac_ct_LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +$as_echo "$ac_ct_LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_LIPO" = x; then + LIPO=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + LIPO=$ac_ct_LIPO + fi +else + LIPO="$ac_cv_prog_LIPO" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL"; then + ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL=$ac_cv_prog_OTOOL +if test -n "$OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +$as_echo "$OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL"; then + ac_ct_OTOOL=$OTOOL + # Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL"; then + ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL="otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL +if test -n "$ac_ct_OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +$as_echo "$ac_ct_OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL" = x; then + OTOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL=$ac_ct_OTOOL + fi +else + OTOOL="$ac_cv_prog_OTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL64"; then + ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL64=$ac_cv_prog_OTOOL64 +if test -n "$OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +$as_echo "$OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL64"; then + ac_ct_OTOOL64=$OTOOL64 + # Extract the first word of "otool64", so it can be a program name with args. +set dummy otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL64"; then + ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +if test -n "$ac_ct_OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +$as_echo "$ac_ct_OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL64" = x; then + OTOOL64=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL64=$ac_ct_OTOOL64 + fi +else + OTOOL64="$ac_cv_prog_OTOOL64" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +$as_echo_n "checking for -single_module linker flag... " >&6; } +if ${lt_cv_apple_cc_single_mod+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_apple_cc_single_mod=no + if test -z "$LT_MULTI_MODULE"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&5 + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +$as_echo "$lt_cv_apple_cc_single_mod" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +if ${lt_cv_ld_exported_symbols_list+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_ld_exported_symbols_list=yes +else + lt_cv_ld_exported_symbols_list=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +$as_echo_n "checking for -force_load linker flag... " >&6; } +if ${lt_cv_ld_force_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 + echo "$AR cru libconftest.a conftest.o" >&5 + $AR cru libconftest.a conftest.o 2>&5 + echo "$RANLIB libconftest.a" >&5 + $RANLIB libconftest.a 2>&5 + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&5 + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&5 + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +$as_echo "$lt_cv_ld_force_load" >&6; } + case $host_os in + rhapsody* | darwin1.[012]) + _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[91]*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + 10.[012][,.]*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + if test yes = "$lt_cv_ld_exported_symbols_list"; then + _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' + fi + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_header in dlfcn.h +do : + ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +" +if test "x$ac_cv_header_dlfcn_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_DLFCN_H 1 +_ACEOF + +fi + +done + + + +func_stripname_cnf () +{ + case $2 in + .*) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%\\\\$2\$%%"`;; + *) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%$2\$%%"`;; + esac +} # func_stripname_cnf + + + +# checkout AR and decide whether to use ar-lib wrapper + if test -n "$ac_tool_prefix"; then + for ac_prog in ar lib "link -lib" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar lib "link -lib" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the archiver ($AR) interface" >&5 +$as_echo_n "checking the archiver ($AR) interface... " >&6; } +if ${am_cv_ar_interface+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + am_cv_ar_interface=ar + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int some_variable = 0; +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 + (eval $am_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -eq 0; then + am_cv_ar_interface=ar + else + am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 + (eval $am_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -eq 0; then + am_cv_ar_interface=lib + else + am_cv_ar_interface=unknown + fi + fi + rm -f conftest.lib libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_ar_interface" >&5 +$as_echo "$am_cv_ar_interface" >&6; } + +case $am_cv_ar_interface in +ar) + ;; +lib) + # Microsoft lib, so override with the ar-lib wrapper script. + # FIXME: It is wrong to rewrite AR. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__AR in this case, + # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something + # similar. + AR="$am_aux_dir/ar-lib $AR" + ;; +unknown) + as_fn_error $? "could not determine $AR interface" "$LINENO" 5 + ;; +esac + + +# Create libtool. + + + + +# Set options +# Check whether --enable-static was given. +if test "${enable_static+set}" = set; then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + enable_static=no +fi + + + + + + + + +# Check whether --with-pic was given. +if test "${with_pic+set}" = set; then : + withval=$with_pic; lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for lt_pkg in $withval; do + IFS=$lt_save_ifs + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + pic_mode=yes +fi + + + + + + + + + + enable_dlopen=no + + + enable_win32_dll=no + + + # Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then : + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + enable_shared=yes +fi + + + + + + + + + + + + # Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then : + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + enable_fast_install=yes +fi + + + + + + + + + shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[5-9]*,yes) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 +$as_echo_n "checking which variant of shared library versioning to provide... " >&6; } + +# Check whether --with-aix-soname was given. +if test "${with_aix_soname+set}" = set; then : + withval=$with_aix_soname; case $withval in + aix|svr4|both) + ;; + *) + as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname +else + if ${lt_cv_with_aix_soname+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_with_aix_soname=aix +fi + + with_aix_soname=$lt_cv_with_aix_soname +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 +$as_echo "$with_aix_soname" >&6; } + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + + + + + + + + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS=$ltmain + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +test -z "$LN_S" && LN_S="ln -s" + + + + + + + + + + + + + + +if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if ${lt_cv_objdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +$as_echo "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +cat >>confdefs.h <<_ACEOF +#define LT_OBJDIR "$lt_cv_objdir/" +_ACEOF + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a '.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld=$lt_cv_prog_gnu_ld + +old_CC=$CC +old_CFLAGS=$CFLAGS + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +func_cc_basename $compiler +cc_basename=$func_cc_basename_result + + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/${ac_tool_prefix}file"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac +fi + +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/file"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac +fi + +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +# Use C for the default configuration in the libtool script + +lt_save_CC=$CC +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + +if test -n "$compiler"; then + +lt_prog_compiler_no_builtin_flag= + +if test yes = "$GCC"; then + case $cc_basename in + nvcc*) + lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; + *) + lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + + + + + + + lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + + + if test yes = "$GCC"; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + lt_prog_compiler_pic='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl='-Xlinker ' + if test -n "$lt_prog_compiler_pic"; then + lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='$wl-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64, which still supported -KPIC. + ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='--shared' + lt_prog_compiler_static='--static' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + *Sun\ F* | *Sun*Fortran*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Intel*\ [CF]*Compiler*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + *Portland\ Group*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +$as_echo "$lt_cv_prog_compiler_pic" >&6; } +lt_prog_compiler_pic=$lt_cv_prog_compiler_pic + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if ${lt_cv_prog_compiler_pic_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } + +if test yes = "$lt_cv_prog_compiler_pic_works"; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi + + + + + + + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +$as_echo "$lt_cv_prog_compiler_static_works" >&6; } + +if test yes = "$lt_cv_prog_compiler_static_works"; then + : +else + lt_prog_compiler_static= +fi + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + +hard_links=nottested +if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test no = "$hard_links"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag= + always_export_symbols=no + archive_cmds= + archive_expsym_cmds= + compiler_needs_object=no + enable_shared_with_static_runtimes=no + export_dynamic_flag_spec= + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic=no + hardcode_direct=no + hardcode_direct_absolute=no + hardcode_libdir_flag_spec= + hardcode_libdir_separator= + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + inherit_rpath=no + link_all_deplibs=unknown + module_cmds= + module_expsym_cmds= + old_archive_from_new_cmds= + old_archive_from_expsyms_cmds= + thread_safe_flag_spec= + whole_archive_flag_spec= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ' (' and ')$', so one must not match beginning or + # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', + # as well as any symbol that contains 'd'. + exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + with_gnu_ld=no + ;; + esac + + ld_shlibs=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test yes = "$with_gnu_ld"; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test yes = "$lt_use_gnu_ld_interface"; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='$wl' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + export_dynamic_flag_spec='$wl--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test ia64 != "$host_cpu"; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + export_dynamic_flag_spec='$wl--export-all-symbols' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + haiku*) + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + link_all_deplibs=yes + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + ;; + + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + export_dynamic_flag_spec='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test linux-dietlibc = "$host_os"; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test no = "$tmp_diet" + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + tcc*) + export_dynamic_flag_spec='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test no = "$ld_shlibs"; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix[4-9]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_direct_absolute=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + file_list_spec='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + hardcode_direct=no + hardcode_direct_absolute=no + ;; + esac + + if test yes = "$GCC"; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + export_dynamic_flag_spec='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' $wl-bernotok' + allow_undefined_flag=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + fi + archive_cmds_need_lc=yes + archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++ or Intel C++/Fortran Compiler. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl* | icl*| ifort*) + # Native MSVC or ICC or IFORT + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + always_export_symbols=yes + file_list_spec='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, )='true' + enable_shared_with_static_runtimes=yes + exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds='chmod 644 $oldlib' + postlink_cmds='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC and ICC and IFORT wrapper + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + enable_shared_with_static_runtimes=yes + ;; + esac + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + if test yes = "$lt_cv_ld_force_load"; then + whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec='' + fi + link_all_deplibs=yes + allow_undefined_flag=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + + else + ld_shlibs=no + fi + + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test yes = "$GCC"; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='$wl-E' + ;; + + hpux10*) + if test yes,no = "$GCC,$with_gnu_ld"; then + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='$wl-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + + hpux11*) + if test yes,no = "$GCC,$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +$as_echo_n "checking if $CC understands -b... " >&6; } +if ${lt_cv_prog_compiler__b+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler__b=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -b" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler__b=yes + fi + else + lt_cv_prog_compiler__b=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +$as_echo "$lt_cv_prog_compiler__b" >&6; } + +if test yes = "$lt_cv_prog_compiler__b"; then + archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' +fi + + ;; + esac + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='$wl-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test yes = "$GCC"; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if ${lt_cv_irix_exported_symbol+:} false; then : + $as_echo_n "(cached) " >&6 +else + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int foo (void) { return 0; } +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_irix_exported_symbol=yes +else + lt_cv_irix_exported_symbol=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +$as_echo "$lt_cv_irix_exported_symbol" >&6; } + if test yes = "$lt_cv_irix_exported_symbol"; then + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' + fi + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + inherit_rpath=yes + link_all_deplibs=yes + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + ld_shlibs=yes + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + *nto* | *qnx*) + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + hardcode_shlibpath_var=no + hardcode_direct_absolute=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + export_dynamic_flag_spec='$wl-E' + else + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + fi + else + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + ;; + + osf3*) + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + archive_cmds_need_lc='no' + hardcode_libdir_separator=: + ;; + + solaris*) + no_undefined_flag=' -z defs' + if test yes = "$GCC"; then + wlarc='$wl' + archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='$wl' + archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. GCC discards it without '$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test yes = "$GCC"; then + whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test sequent = "$host_vendor"; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag='$wl-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='$wl-z,text' + allow_undefined_flag='$wl-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='$wl-R,$libdir' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + + if test sni = "$host_vendor"; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec='$wl-Blargedynsym' + ;; + esac + fi + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +$as_echo "$ld_shlibs" >&6; } +test no = "$ld_shlibs" && can_build_shared=no + +with_gnu_ld=$with_gnu_ld + + + + + + + + + + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } + archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +if test yes = "$GCC"; then + case $host_os in + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary... + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" + elif test -n "$lt_multi_os_dir"; then + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS = " "; FS = "/|\n";} { + lt_foo = ""; + lt_count = 0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo = "/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's|/\([A-Za-z]:\)|\1|g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + + + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a(lib.so.V)' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl* | *,icl* | *,ifort*) + # Native MSVC or ICC or IFORT + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + hardcode_libdir_flag_spec='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test yes = "$hardcode_automatic"; then + + # We can hardcode non-existent directories. + if test no != "$hardcode_direct" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && + test no != "$hardcode_minus_L"; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +$as_echo "$hardcode_action" >&6; } + +if test relink = "$hardcode_action" || + test yes = "$inherit_rpath"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + if test yes != "$enable_dlopen"; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen=load_add_on + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen=LoadLibrary + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl +else + + lt_cv_dlopen=dyld + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes; then : + lt_cv_dlopen=shl_load +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if ${ac_cv_lib_dld_shl_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_shl_load=yes +else + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes; then : + lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld +else + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes; then : + lt_cv_dlopen=dlopen +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if ${ac_cv_lib_svld_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_svld_dlopen=yes +else + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if ${ac_cv_lib_dld_dld_link+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_dld_link=yes +else + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes; then : + lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS=$LDFLAGS + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS=$LIBS + LIBS="$lt_cv_dlopen_libs $LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test yes = "$cross_compiling"; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } + + if test yes = "$lt_cv_dlopen_self"; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self_static+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test yes = "$cross_compiling"; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS=$save_CPPFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + + + + + + + + + + + + + + + + +striplib= +old_striplib= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP"; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + + + + + + + + + + + + + # Report what library types will actually be built + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[4-9]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + + + + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC=$lt_save_CC + + + + ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu + +if test -z "$F77" || test no = "$F77"; then + _lt_disable_F77=yes +fi + +archive_cmds_need_lc_F77=no +allow_undefined_flag_F77= +always_export_symbols_F77=no +archive_expsym_cmds_F77= +export_dynamic_flag_spec_F77= +hardcode_direct_F77=no +hardcode_direct_absolute_F77=no +hardcode_libdir_flag_spec_F77= +hardcode_libdir_separator_F77= +hardcode_minus_L_F77=no +hardcode_automatic_F77=no +inherit_rpath_F77=no +module_cmds_F77= +module_expsym_cmds_F77= +link_all_deplibs_F77=unknown +old_archive_cmds_F77=$old_archive_cmds +reload_flag_F77=$reload_flag +reload_cmds_F77=$reload_cmds +no_undefined_flag_F77= +whole_archive_flag_spec_F77= +enable_shared_with_static_runtimes_F77=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +objext_F77=$objext + +# No sense in running all these tests if we already determined that +# the F77 compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_disable_F77"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + + # save warnings/boilerplate of simple test code + ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + + ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${F77-"f77"} + CFLAGS=$FFLAGS + compiler=$CC + compiler_F77=$CC + func_cc_basename $compiler +cc_basename=$func_cc_basename_result + + GCC=$G77 + if test -n "$compiler"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[4-9]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + + GCC_F77=$G77 + LD_F77=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + lt_prog_compiler_wl_F77= +lt_prog_compiler_pic_F77= +lt_prog_compiler_static_F77= + + + if test yes = "$GCC"; then + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_static_F77='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_F77='-Bstatic' + fi + lt_prog_compiler_pic_F77='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic_F77='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic_F77='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static_F77='$wl-static' + ;; + esac + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_F77='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static_F77= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_F77='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared_F77=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_F77='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_F77=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic_F77='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl_F77='-Xlinker ' + if test -n "$lt_prog_compiler_pic_F77"; then + lt_prog_compiler_pic_F77="-Xcompiler $lt_prog_compiler_pic_F77" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl_F77='-Wl,' + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_F77='-Bstatic' + else + lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_F77='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl_F77='-Wl,-Wl,,' + lt_prog_compiler_pic_F77='-PIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_F77='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static_F77='$wl-static' + ;; + esac + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl_F77='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_F77='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static_F77='$wl-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl_F77='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static_F77='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64, which still supported -KPIC. + ecc*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-fPIC' + lt_prog_compiler_static_F77='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='--shared' + lt_prog_compiler_static_F77='--static' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl_F77='-Wl,-Wl,,' + lt_prog_compiler_pic_F77='-PIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-fPIC' + lt_prog_compiler_static_F77='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-fpic' + lt_prog_compiler_static_F77='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl_F77='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static_F77='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-qpic' + lt_prog_compiler_static_F77='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + lt_prog_compiler_wl_F77='' + ;; + *Sun\ F* | *Sun*Fortran*) + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + lt_prog_compiler_wl_F77='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + lt_prog_compiler_wl_F77='-Wl,' + ;; + *Intel*\ [CF]*Compiler*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-fPIC' + lt_prog_compiler_static_F77='-static' + ;; + *Portland\ Group*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-fpic' + lt_prog_compiler_static_F77='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_F77='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl_F77='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static_F77='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static_F77='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + lt_prog_compiler_wl_F77='-Qoption ld ';; + *) + lt_prog_compiler_wl_F77='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl_F77='-Qoption ld ' + lt_prog_compiler_pic_F77='-PIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_F77='-Kconform_pic' + lt_prog_compiler_static_F77='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_can_build_shared_F77=no + ;; + + uts4*) + lt_prog_compiler_pic_F77='-pic' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared_F77=no + ;; + esac + fi + +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_F77= + ;; + *) + lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic_F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_F77=$lt_prog_compiler_pic_F77 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_F77" >&5 +$as_echo "$lt_cv_prog_compiler_pic_F77" >&6; } +lt_prog_compiler_pic_F77=$lt_cv_prog_compiler_pic_F77 + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_F77"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... " >&6; } +if ${lt_cv_prog_compiler_pic_works_F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works_F77=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_F77" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_F77=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_F77" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works_F77" >&6; } + +if test yes = "$lt_cv_prog_compiler_pic_works_F77"; then + case $lt_prog_compiler_pic_F77 in + "" | " "*) ;; + *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;; + esac +else + lt_prog_compiler_pic_F77= + lt_prog_compiler_can_build_shared_F77=no +fi + +fi + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_F77 eval lt_tmp_static_flag=\"$lt_prog_compiler_static_F77\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works_F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works_F77=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_F77=yes + fi + else + lt_cv_prog_compiler_static_works_F77=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_F77" >&5 +$as_echo "$lt_cv_prog_compiler_static_works_F77" >&6; } + +if test yes = "$lt_cv_prog_compiler_static_works_F77"; then + : +else + lt_prog_compiler_static_F77= +fi + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_F77=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_F77=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_F77" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_F77" >&6; } + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_F77=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_F77=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_F77" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_F77" >&6; } + + + + +hard_links=nottested +if test no = "$lt_cv_prog_compiler_c_o_F77" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test no = "$hard_links"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag_F77= + always_export_symbols_F77=no + archive_cmds_F77= + archive_expsym_cmds_F77= + compiler_needs_object_F77=no + enable_shared_with_static_runtimes_F77=no + export_dynamic_flag_spec_F77= + export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic_F77=no + hardcode_direct_F77=no + hardcode_direct_absolute_F77=no + hardcode_libdir_flag_spec_F77= + hardcode_libdir_separator_F77= + hardcode_minus_L_F77=no + hardcode_shlibpath_var_F77=unsupported + inherit_rpath_F77=no + link_all_deplibs_F77=unknown + module_cmds_F77= + module_expsym_cmds_F77= + old_archive_from_new_cmds_F77= + old_archive_from_expsyms_cmds_F77= + thread_safe_flag_spec_F77= + whole_archive_flag_spec_F77= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms_F77= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ' (' and ')$', so one must not match beginning or + # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', + # as well as any symbol that contains 'd'. + exclude_expsyms_F77='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + with_gnu_ld=no + ;; + esac + + ld_shlibs_F77=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test yes = "$with_gnu_ld"; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test yes = "$lt_use_gnu_ld_interface"; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='$wl' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_F77='$wl-rpath $wl$libdir' + export_dynamic_flag_spec_F77='$wl--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_F77=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + whole_archive_flag_spec_F77= + fi + supports_anon_versioning=no + case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test ia64 != "$host_cpu"; then + ld_shlibs_F77=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='' + ;; + m68k) + archive_cmds_F77='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_F77=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + ld_shlibs_F77=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_F77='-L$libdir' + export_dynamic_flag_spec_F77='$wl--export-all-symbols' + allow_undefined_flag_F77=unsupported + always_export_symbols_F77=no + enable_shared_with_static_runtimes_F77=yes + export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_F77='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + archive_expsym_cmds_F77='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_F77=no + fi + ;; + + haiku*) + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + link_all_deplibs_F77=yes + ;; + + os2*) + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + allow_undefined_flag_F77=unsupported + shrext_cmds=.dll + archive_cmds_F77='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds_F77='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds_F77='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes_F77=yes + ;; + + interix[3-9]*) + hardcode_direct_F77=no + hardcode_shlibpath_var_F77=no + hardcode_libdir_flag_spec_F77='$wl-rpath,$libdir' + export_dynamic_flag_spec_F77='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_F77='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test linux-dietlibc = "$host_os"; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test no = "$tmp_diet" + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec_F77='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + whole_archive_flag_spec_F77='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec_F77= + tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec_F77='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object_F77=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec_F77='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object_F77=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds_F77='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds_F77='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + tcc*) + export_dynamic_flag_spec_F77='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec_F77='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec_F77='$wl-rpath $wl$libdir' + archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds_F77='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs_F77=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs_F77=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_F77=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs_F77=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec_F77='$wl-rpath $wl$libdir' + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_F77=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_F77=no + fi + ;; + esac + + if test no = "$ld_shlibs_F77"; then + runpath_var= + hardcode_libdir_flag_spec_F77= + export_dynamic_flag_spec_F77= + whole_archive_flag_spec_F77= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag_F77=unsupported + always_export_symbols_F77=yes + archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L_F77=yes + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct_F77=unsupported + fi + ;; + + aix[4-9]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_F77='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_F77='' + hardcode_direct_F77=yes + hardcode_direct_absolute_F77=yes + hardcode_libdir_separator_F77=':' + link_all_deplibs_F77=yes + file_list_spec_F77='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + hardcode_direct_F77=no + hardcode_direct_absolute_F77=no + ;; + esac + + if test yes = "$GCC"; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct_F77=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_F77=yes + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_libdir_separator_F77= + fi + ;; + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + export_dynamic_flag_spec_F77='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols_F77=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_F77='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +if ac_fn_f77_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__F77=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__F77"; then + lt_cv_aix_libpath__F77=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__F77"; then + lt_cv_aix_libpath__F77=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__F77 +fi + + hardcode_libdir_flag_spec_F77='$wl-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds_F77='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + hardcode_libdir_flag_spec_F77='$wl-R $libdir:/usr/lib:/lib' + allow_undefined_flag_F77="-z nodefs" + archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +if ac_fn_f77_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__F77=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__F77"; then + lt_cv_aix_libpath__F77=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__F77"; then + lt_cv_aix_libpath__F77=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__F77 +fi + + hardcode_libdir_flag_spec_F77='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_F77=' $wl-bernotok' + allow_undefined_flag_F77=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec_F77='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_F77='$convenience' + fi + archive_cmds_need_lc_F77=yes + archive_expsym_cmds_F77='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds_F77="$archive_expsym_cmds_F77"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + archive_expsym_cmds_F77="$archive_expsym_cmds_F77"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + archive_expsym_cmds_F77="$archive_expsym_cmds_F77"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + archive_expsym_cmds_F77="$archive_expsym_cmds_F77"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='' + ;; + m68k) + archive_cmds_F77='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec_F77=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++ or Intel C++/Fortran Compiler. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl* | icl*| ifort*) + # Native MSVC or ICC or IFORT + hardcode_libdir_flag_spec_F77=' ' + allow_undefined_flag_F77=unsupported + always_export_symbols_F77=yes + file_list_spec_F77='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds_F77='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + archive_expsym_cmds_F77='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, F77)='true' + enable_shared_with_static_runtimes_F77=yes + exclude_expsyms_F77='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds_F77='chmod 644 $oldlib' + postlink_cmds_F77='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC and ICC and IFORT wrapper + hardcode_libdir_flag_spec_F77=' ' + allow_undefined_flag_F77=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds_F77='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds_F77='lib -OUT:$oldlib$oldobjs$old_deplibs' + enable_shared_with_static_runtimes_F77=yes + ;; + esac + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc_F77=no + hardcode_direct_F77=no + hardcode_automatic_F77=yes + hardcode_shlibpath_var_F77=unsupported + if test yes = "$lt_cv_ld_force_load"; then + whole_archive_flag_spec_F77='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + compiler_needs_object_F77=yes + else + whole_archive_flag_spec_F77='' + fi + link_all_deplibs_F77=yes + allow_undefined_flag_F77=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + archive_cmds_F77="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + module_cmds_F77="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + archive_expsym_cmds_F77="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + module_expsym_cmds_F77="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + + else + ld_shlibs_F77=no + fi + + ;; + + dgux*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_shlibpath_var_F77=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes + hardcode_minus_L_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + hpux9*) + if test yes = "$GCC"; then + archive_cmds_F77='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + archive_cmds_F77='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec_F77='$wl+b $wl$libdir' + hardcode_libdir_separator_F77=: + hardcode_direct_F77=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + export_dynamic_flag_spec_F77='$wl-E' + ;; + + hpux10*) + if test yes,no = "$GCC,$with_gnu_ld"; then + archive_cmds_F77='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec_F77='$wl+b $wl$libdir' + hardcode_libdir_separator_F77=: + hardcode_direct_F77=yes + hardcode_direct_absolute_F77=yes + export_dynamic_flag_spec_F77='$wl-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + fi + ;; + + hpux11*) + if test yes,no = "$GCC,$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + archive_cmds_F77='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds_F77='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_F77='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds_F77='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds_F77='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_F77='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec_F77='$wl+b $wl$libdir' + hardcode_libdir_separator_F77=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct_F77=no + hardcode_shlibpath_var_F77=no + ;; + *) + hardcode_direct_F77=yes + hardcode_direct_absolute_F77=yes + export_dynamic_flag_spec_F77='$wl-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test yes = "$GCC"; then + archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if ${lt_cv_irix_exported_symbol+:} false; then : + $as_echo_n "(cached) " >&6 +else + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" + cat > conftest.$ac_ext <<_ACEOF + + subroutine foo + end +_ACEOF +if ac_fn_f77_try_link "$LINENO"; then : + lt_cv_irix_exported_symbol=yes +else + lt_cv_irix_exported_symbol=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +$as_echo "$lt_cv_irix_exported_symbol" >&6; } + if test yes = "$lt_cv_irix_exported_symbol"; then + archive_expsym_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' + fi + else + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc_F77='no' + hardcode_libdir_flag_spec_F77='$wl-rpath $wl$libdir' + hardcode_libdir_separator_F77=: + inherit_rpath_F77=yes + link_all_deplibs_F77=yes + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + ld_shlibs_F77=yes + archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + newsos6) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes + hardcode_libdir_flag_spec_F77='$wl-rpath $wl$libdir' + hardcode_libdir_separator_F77=: + hardcode_shlibpath_var_F77=no + ;; + + *nto* | *qnx*) + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + hardcode_direct_absolute_F77=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec_F77='$wl-rpath,$libdir' + export_dynamic_flag_spec_F77='$wl-E' + else + archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_F77='$wl-rpath,$libdir' + fi + else + ld_shlibs_F77=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + allow_undefined_flag_F77=unsupported + shrext_cmds=.dll + archive_cmds_F77='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds_F77='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds_F77='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes_F77=yes + ;; + + osf3*) + if test yes = "$GCC"; then + allow_undefined_flag_F77=' $wl-expect_unresolved $wl\*' + archive_cmds_F77='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + allow_undefined_flag_F77=' -expect_unresolved \*' + archive_cmds_F77='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + fi + archive_cmds_need_lc_F77='no' + hardcode_libdir_flag_spec_F77='$wl-rpath $wl$libdir' + hardcode_libdir_separator_F77=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test yes = "$GCC"; then + allow_undefined_flag_F77=' $wl-expect_unresolved $wl\*' + archive_cmds_F77='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + hardcode_libdir_flag_spec_F77='$wl-rpath $wl$libdir' + else + allow_undefined_flag_F77=' -expect_unresolved \*' + archive_cmds_F77='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec_F77='-rpath $libdir' + fi + archive_cmds_need_lc_F77='no' + hardcode_libdir_separator_F77=: + ;; + + solaris*) + no_undefined_flag_F77=' -z defs' + if test yes = "$GCC"; then + wlarc='$wl' + archive_cmds_F77='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds_F77='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_F77='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='$wl' + archive_cmds_F77='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_shlibpath_var_F77=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. GCC discards it without '$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test yes = "$GCC"; then + whole_archive_flag_spec_F77='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + else + whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs_F77=yes + ;; + + sunos4*) + if test sequent = "$host_vendor"; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds_F77='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_direct_F77=yes + hardcode_minus_L_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds_F77='$CC -r -o $output$reload_objs' + hardcode_direct_F77=no + ;; + motorola) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_F77=no + ;; + + sysv4.3*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_F77=no + export_dynamic_flag_spec_F77='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_F77=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs_F77=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_F77='$wl-z,text' + archive_cmds_need_lc_F77=no + hardcode_shlibpath_var_F77=no + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds_F77='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_F77='$wl-z,text' + allow_undefined_flag_F77='$wl-z,nodefs' + archive_cmds_need_lc_F77=no + hardcode_shlibpath_var_F77=no + hardcode_libdir_flag_spec_F77='$wl-R,$libdir' + hardcode_libdir_separator_F77=':' + link_all_deplibs_F77=yes + export_dynamic_flag_spec_F77='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds_F77='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_shlibpath_var_F77=no + ;; + + *) + ld_shlibs_F77=no + ;; + esac + + if test sni = "$host_vendor"; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec_F77='$wl-Blargedynsym' + ;; + esac + fi + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_F77" >&5 +$as_echo "$ld_shlibs_F77" >&6; } +test no = "$ld_shlibs_F77" && can_build_shared=no + +with_gnu_ld_F77=$with_gnu_ld + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_F77" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_F77=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $archive_cmds_F77 in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc_F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_F77 + pic_flag=$lt_prog_compiler_pic_F77 + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_F77 + allow_undefined_flag_F77= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_F77 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds_F77 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc_F77=no + else + lt_cv_archive_cmds_need_lc_F77=yes + fi + allow_undefined_flag_F77=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_F77" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc_F77" >&6; } + archive_cmds_need_lc_F77=$lt_cv_archive_cmds_need_lc_F77 + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + + + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a(lib.so.V)' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl* | *,icl* | *,ifort*) + # Native MSVC or ICC or IFORT + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + hardcode_libdir_flag_spec_F77='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_F77\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_F77\"" + cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +if ac_fn_f77_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_F77= +if test -n "$hardcode_libdir_flag_spec_F77" || + test -n "$runpath_var_F77" || + test yes = "$hardcode_automatic_F77"; then + + # We can hardcode non-existent directories. + if test no != "$hardcode_direct_F77" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, F77)" && + test no != "$hardcode_minus_L_F77"; then + # Linking always hardcodes the temporary library directory. + hardcode_action_F77=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_F77=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_F77=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_F77" >&5 +$as_echo "$hardcode_action_F77" >&6; } + +if test relink = "$hardcode_action_F77" || + test yes = "$inherit_rpath_F77"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test yes != "$_lt_disable_F77" + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + ac_ext=${ac_fc_srcext-f} +ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' +ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_fc_compiler_gnu + + +if test -z "$FC" || test no = "$FC"; then + _lt_disable_FC=yes +fi + +archive_cmds_need_lc_FC=no +allow_undefined_flag_FC= +always_export_symbols_FC=no +archive_expsym_cmds_FC= +export_dynamic_flag_spec_FC= +hardcode_direct_FC=no +hardcode_direct_absolute_FC=no +hardcode_libdir_flag_spec_FC= +hardcode_libdir_separator_FC= +hardcode_minus_L_FC=no +hardcode_automatic_FC=no +inherit_rpath_FC=no +module_cmds_FC= +module_expsym_cmds_FC= +link_all_deplibs_FC=unknown +old_archive_cmds_FC=$old_archive_cmds +reload_flag_FC=$reload_flag +reload_cmds_FC=$reload_cmds +no_undefined_flag_FC= +whole_archive_flag_spec_FC= +enable_shared_with_static_runtimes_FC=no + +# Source file extension for fc test sources. +ac_ext=${ac_fc_srcext-f} + +# Object file extension for compiled fc test sources. +objext=o +objext_FC=$objext + +# No sense in running all these tests if we already determined that +# the FC compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_disable_FC"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + + # save warnings/boilerplate of simple test code + ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + + ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${FC-"f95"} + CFLAGS=$FCFLAGS + compiler=$CC + GCC=$ac_cv_fc_compiler_gnu + + compiler_FC=$CC + func_cc_basename $compiler +cc_basename=$func_cc_basename_result + + + if test -n "$compiler"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[4-9]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + + GCC_FC=$ac_cv_fc_compiler_gnu + LD_FC=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + # Dependencies to place before and after the object being linked: +predep_objects_FC= +postdep_objects_FC= +predeps_FC= +postdeps_FC= +compiler_lib_search_path_FC= + +cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer a + a=0 + return + end +_LT_EOF + + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case $prev$p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test x-L = "$p" || + test x-R = "$p"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test no = "$pre_test_object_deps_done"; then + case $prev in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_FC"; then + compiler_lib_search_path_FC=$prev$p + else + compiler_lib_search_path_FC="${compiler_lib_search_path_FC} $prev$p" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_FC"; then + postdeps_FC=$prev$p + else + postdeps_FC="${postdeps_FC} $prev$p" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test no = "$pre_test_object_deps_done"; then + if test -z "$predep_objects_FC"; then + predep_objects_FC=$p + else + predep_objects_FC="$predep_objects_FC $p" + fi + else + if test -z "$postdep_objects_FC"; then + postdep_objects_FC=$p + else + postdep_objects_FC="$postdep_objects_FC $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling FC test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken + + +case " $postdeps_FC " in +*" -lc "*) archive_cmds_need_lc_FC=no ;; +esac + compiler_lib_search_dirs_FC= +if test -n "${compiler_lib_search_path_FC}"; then + compiler_lib_search_dirs_FC=`echo " ${compiler_lib_search_path_FC}" | $SED -e 's! -L! !g' -e 's!^ !!'` +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + lt_prog_compiler_wl_FC= +lt_prog_compiler_pic_FC= +lt_prog_compiler_static_FC= + + + if test yes = "$GCC"; then + lt_prog_compiler_wl_FC='-Wl,' + lt_prog_compiler_static_FC='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_FC='-Bstatic' + fi + lt_prog_compiler_pic_FC='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic_FC='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + lt_prog_compiler_pic_FC='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic_FC='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static_FC='$wl-static' + ;; + esac + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_FC='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static_FC= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_FC='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared_FC=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_FC='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_FC=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic_FC='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl_FC='-Xlinker ' + if test -n "$lt_prog_compiler_pic_FC"; then + lt_prog_compiler_pic_FC="-Xcompiler $lt_prog_compiler_pic_FC" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl_FC='-Wl,' + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_FC='-Bstatic' + else + lt_prog_compiler_static_FC='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_FC='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl_FC='-Wl,-Wl,,' + lt_prog_compiler_pic_FC='-PIC' + lt_prog_compiler_static_FC='-Bstatic' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_FC='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static_FC='$wl-static' + ;; + esac + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl_FC='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_FC='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static_FC='$wl-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl_FC='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static_FC='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64, which still supported -KPIC. + ecc*) + lt_prog_compiler_wl_FC='-Wl,' + lt_prog_compiler_pic_FC='-KPIC' + lt_prog_compiler_static_FC='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl_FC='-Wl,' + lt_prog_compiler_pic_FC='-fPIC' + lt_prog_compiler_static_FC='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl_FC='-Wl,' + lt_prog_compiler_pic_FC='--shared' + lt_prog_compiler_static_FC='--static' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl_FC='-Wl,-Wl,,' + lt_prog_compiler_pic_FC='-PIC' + lt_prog_compiler_static_FC='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + lt_prog_compiler_wl_FC='-Wl,' + lt_prog_compiler_pic_FC='-fPIC' + lt_prog_compiler_static_FC='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl_FC='-Wl,' + lt_prog_compiler_pic_FC='-fpic' + lt_prog_compiler_static_FC='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl_FC='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static_FC='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl_FC='-Wl,' + lt_prog_compiler_pic_FC='-qpic' + lt_prog_compiler_static_FC='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic_FC='-KPIC' + lt_prog_compiler_static_FC='-Bstatic' + lt_prog_compiler_wl_FC='' + ;; + *Sun\ F* | *Sun*Fortran*) + lt_prog_compiler_pic_FC='-KPIC' + lt_prog_compiler_static_FC='-Bstatic' + lt_prog_compiler_wl_FC='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic_FC='-KPIC' + lt_prog_compiler_static_FC='-Bstatic' + lt_prog_compiler_wl_FC='-Wl,' + ;; + *Intel*\ [CF]*Compiler*) + lt_prog_compiler_wl_FC='-Wl,' + lt_prog_compiler_pic_FC='-fPIC' + lt_prog_compiler_static_FC='-static' + ;; + *Portland\ Group*) + lt_prog_compiler_wl_FC='-Wl,' + lt_prog_compiler_pic_FC='-fpic' + lt_prog_compiler_static_FC='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic_FC='-KPIC' + lt_prog_compiler_static_FC='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_FC='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl_FC='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static_FC='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static_FC='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic_FC='-KPIC' + lt_prog_compiler_static_FC='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + lt_prog_compiler_wl_FC='-Qoption ld ';; + *) + lt_prog_compiler_wl_FC='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl_FC='-Qoption ld ' + lt_prog_compiler_pic_FC='-PIC' + lt_prog_compiler_static_FC='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl_FC='-Wl,' + lt_prog_compiler_pic_FC='-KPIC' + lt_prog_compiler_static_FC='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_FC='-Kconform_pic' + lt_prog_compiler_static_FC='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl_FC='-Wl,' + lt_prog_compiler_pic_FC='-KPIC' + lt_prog_compiler_static_FC='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl_FC='-Wl,' + lt_prog_compiler_can_build_shared_FC=no + ;; + + uts4*) + lt_prog_compiler_pic_FC='-pic' + lt_prog_compiler_static_FC='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared_FC=no + ;; + esac + fi + +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_FC= + ;; + *) + lt_prog_compiler_pic_FC="$lt_prog_compiler_pic_FC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic_FC+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_FC=$lt_prog_compiler_pic_FC +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_FC" >&5 +$as_echo "$lt_cv_prog_compiler_pic_FC" >&6; } +lt_prog_compiler_pic_FC=$lt_cv_prog_compiler_pic_FC + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_FC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_FC works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_FC works... " >&6; } +if ${lt_cv_prog_compiler_pic_works_FC+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works_FC=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_FC" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_FC=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_FC" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works_FC" >&6; } + +if test yes = "$lt_cv_prog_compiler_pic_works_FC"; then + case $lt_prog_compiler_pic_FC in + "" | " "*) ;; + *) lt_prog_compiler_pic_FC=" $lt_prog_compiler_pic_FC" ;; + esac +else + lt_prog_compiler_pic_FC= + lt_prog_compiler_can_build_shared_FC=no +fi + +fi + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_FC eval lt_tmp_static_flag=\"$lt_prog_compiler_static_FC\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works_FC+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works_FC=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_FC=yes + fi + else + lt_cv_prog_compiler_static_works_FC=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_FC" >&5 +$as_echo "$lt_cv_prog_compiler_static_works_FC" >&6; } + +if test yes = "$lt_cv_prog_compiler_static_works_FC"; then + : +else + lt_prog_compiler_static_FC= +fi + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_FC+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_FC=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_FC=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_FC" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_FC" >&6; } + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_FC+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_FC=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_FC=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_FC" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_FC" >&6; } + + + + +hard_links=nottested +if test no = "$lt_cv_prog_compiler_c_o_FC" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test no = "$hard_links"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag_FC= + always_export_symbols_FC=no + archive_cmds_FC= + archive_expsym_cmds_FC= + compiler_needs_object_FC=no + enable_shared_with_static_runtimes_FC=no + export_dynamic_flag_spec_FC= + export_symbols_cmds_FC='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic_FC=no + hardcode_direct_FC=no + hardcode_direct_absolute_FC=no + hardcode_libdir_flag_spec_FC= + hardcode_libdir_separator_FC= + hardcode_minus_L_FC=no + hardcode_shlibpath_var_FC=unsupported + inherit_rpath_FC=no + link_all_deplibs_FC=unknown + module_cmds_FC= + module_expsym_cmds_FC= + old_archive_from_new_cmds_FC= + old_archive_from_expsyms_cmds_FC= + thread_safe_flag_spec_FC= + whole_archive_flag_spec_FC= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms_FC= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ' (' and ')$', so one must not match beginning or + # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', + # as well as any symbol that contains 'd'. + exclude_expsyms_FC='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + with_gnu_ld=no + ;; + esac + + ld_shlibs_FC=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test yes = "$with_gnu_ld"; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test yes = "$lt_use_gnu_ld_interface"; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='$wl' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_FC='$wl-rpath $wl$libdir' + export_dynamic_flag_spec_FC='$wl--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_FC=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + whole_archive_flag_spec_FC= + fi + supports_anon_versioning=no + case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test ia64 != "$host_cpu"; then + ld_shlibs_FC=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_FC='' + ;; + m68k) + archive_cmds_FC='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_FC='-L$libdir' + hardcode_minus_L_FC=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_FC=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_FC='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + ld_shlibs_FC=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, FC) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_FC='-L$libdir' + export_dynamic_flag_spec_FC='$wl--export-all-symbols' + allow_undefined_flag_FC=unsupported + always_export_symbols_FC=no + enable_shared_with_static_runtimes_FC=yes + export_symbols_cmds_FC='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_FC='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + archive_expsym_cmds_FC='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_FC=no + fi + ;; + + haiku*) + archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + link_all_deplibs_FC=yes + ;; + + os2*) + hardcode_libdir_flag_spec_FC='-L$libdir' + hardcode_minus_L_FC=yes + allow_undefined_flag_FC=unsupported + shrext_cmds=.dll + archive_cmds_FC='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds_FC='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds_FC='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes_FC=yes + ;; + + interix[3-9]*) + hardcode_direct_FC=no + hardcode_shlibpath_var_FC=no + hardcode_libdir_flag_spec_FC='$wl-rpath,$libdir' + export_dynamic_flag_spec_FC='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_FC='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test linux-dietlibc = "$host_os"; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test no = "$tmp_diet" + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec_FC='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + whole_archive_flag_spec_FC='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec_FC= + tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec_FC='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object_FC=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec_FC='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object_FC=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds_FC='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds_FC='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + tcc*) + export_dynamic_flag_spec_FC='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec_FC='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec_FC='$wl-rpath $wl$libdir' + archive_cmds_FC='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds_FC='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs_FC=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds_FC='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs_FC=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_FC=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs_FC=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec_FC='$wl-rpath $wl$libdir' + archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_FC=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds_FC='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct_FC=yes + hardcode_shlibpath_var_FC=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_FC=no + fi + ;; + esac + + if test no = "$ld_shlibs_FC"; then + runpath_var= + hardcode_libdir_flag_spec_FC= + export_dynamic_flag_spec_FC= + whole_archive_flag_spec_FC= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag_FC=unsupported + always_export_symbols_FC=yes + archive_expsym_cmds_FC='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L_FC=yes + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct_FC=unsupported + fi + ;; + + aix[4-9]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds_FC='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_FC='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_FC='' + hardcode_direct_FC=yes + hardcode_direct_absolute_FC=yes + hardcode_libdir_separator_FC=':' + link_all_deplibs_FC=yes + file_list_spec_FC='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + hardcode_direct_FC=no + hardcode_direct_absolute_FC=no + ;; + esac + + if test yes = "$GCC"; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct_FC=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_FC=yes + hardcode_libdir_flag_spec_FC='-L$libdir' + hardcode_libdir_separator_FC= + fi + ;; + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + export_dynamic_flag_spec_FC='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols_FC=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_FC='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__FC+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +if ac_fn_fc_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__FC=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__FC"; then + lt_cv_aix_libpath__FC=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__FC"; then + lt_cv_aix_libpath__FC=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__FC +fi + + hardcode_libdir_flag_spec_FC='$wl-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds_FC='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + hardcode_libdir_flag_spec_FC='$wl-R $libdir:/usr/lib:/lib' + allow_undefined_flag_FC="-z nodefs" + archive_expsym_cmds_FC="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__FC+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +if ac_fn_fc_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__FC=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__FC"; then + lt_cv_aix_libpath__FC=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__FC"; then + lt_cv_aix_libpath__FC=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__FC +fi + + hardcode_libdir_flag_spec_FC='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_FC=' $wl-bernotok' + allow_undefined_flag_FC=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec_FC='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_FC='$convenience' + fi + archive_cmds_need_lc_FC=yes + archive_expsym_cmds_FC='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds_FC="$archive_expsym_cmds_FC"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + archive_expsym_cmds_FC="$archive_expsym_cmds_FC"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + archive_expsym_cmds_FC="$archive_expsym_cmds_FC"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + archive_expsym_cmds_FC="$archive_expsym_cmds_FC"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_FC='' + ;; + m68k) + archive_cmds_FC='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_FC='-L$libdir' + hardcode_minus_L_FC=yes + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec_FC=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++ or Intel C++/Fortran Compiler. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl* | icl*| ifort*) + # Native MSVC or ICC or IFORT + hardcode_libdir_flag_spec_FC=' ' + allow_undefined_flag_FC=unsupported + always_export_symbols_FC=yes + file_list_spec_FC='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds_FC='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + archive_expsym_cmds_FC='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, FC)='true' + enable_shared_with_static_runtimes_FC=yes + exclude_expsyms_FC='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + export_symbols_cmds_FC='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds_FC='chmod 644 $oldlib' + postlink_cmds_FC='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC and ICC and IFORT wrapper + hardcode_libdir_flag_spec_FC=' ' + allow_undefined_flag_FC=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds_FC='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds_FC='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds_FC='lib -OUT:$oldlib$oldobjs$old_deplibs' + enable_shared_with_static_runtimes_FC=yes + ;; + esac + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc_FC=no + hardcode_direct_FC=no + hardcode_automatic_FC=yes + hardcode_shlibpath_var_FC=unsupported + if test yes = "$lt_cv_ld_force_load"; then + whole_archive_flag_spec_FC='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + compiler_needs_object_FC=yes + else + whole_archive_flag_spec_FC='' + fi + link_all_deplibs_FC=yes + allow_undefined_flag_FC=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + archive_cmds_FC="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + module_cmds_FC="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + archive_expsym_cmds_FC="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + module_expsym_cmds_FC="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + + else + ld_shlibs_FC=no + fi + + ;; + + dgux*) + archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_FC='-L$libdir' + hardcode_shlibpath_var_FC=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds_FC='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec_FC='-R$libdir' + hardcode_direct_FC=yes + hardcode_shlibpath_var_FC=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + archive_cmds_FC='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_FC=yes + hardcode_minus_L_FC=yes + hardcode_shlibpath_var_FC=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_FC='-R$libdir' + hardcode_direct_FC=yes + hardcode_shlibpath_var_FC=no + ;; + + hpux9*) + if test yes = "$GCC"; then + archive_cmds_FC='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + archive_cmds_FC='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec_FC='$wl+b $wl$libdir' + hardcode_libdir_separator_FC=: + hardcode_direct_FC=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_FC=yes + export_dynamic_flag_spec_FC='$wl-E' + ;; + + hpux10*) + if test yes,no = "$GCC,$with_gnu_ld"; then + archive_cmds_FC='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_FC='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec_FC='$wl+b $wl$libdir' + hardcode_libdir_separator_FC=: + hardcode_direct_FC=yes + hardcode_direct_absolute_FC=yes + export_dynamic_flag_spec_FC='$wl-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_FC=yes + fi + ;; + + hpux11*) + if test yes,no = "$GCC,$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + archive_cmds_FC='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds_FC='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_FC='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds_FC='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds_FC='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_FC='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec_FC='$wl+b $wl$libdir' + hardcode_libdir_separator_FC=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct_FC=no + hardcode_shlibpath_var_FC=no + ;; + *) + hardcode_direct_FC=yes + hardcode_direct_absolute_FC=yes + export_dynamic_flag_spec_FC='$wl-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_FC=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test yes = "$GCC"; then + archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if ${lt_cv_irix_exported_symbol+:} false; then : + $as_echo_n "(cached) " >&6 +else + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" + cat > conftest.$ac_ext <<_ACEOF + + subroutine foo + end +_ACEOF +if ac_fn_fc_try_link "$LINENO"; then : + lt_cv_irix_exported_symbol=yes +else + lt_cv_irix_exported_symbol=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +$as_echo "$lt_cv_irix_exported_symbol" >&6; } + if test yes = "$lt_cv_irix_exported_symbol"; then + archive_expsym_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' + fi + else + archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc_FC='no' + hardcode_libdir_flag_spec_FC='$wl-rpath $wl$libdir' + hardcode_libdir_separator_FC=: + inherit_rpath_FC=yes + link_all_deplibs_FC=yes + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + ld_shlibs_FC=yes + archive_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds_FC='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds_FC='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec_FC='-R$libdir' + hardcode_direct_FC=yes + hardcode_shlibpath_var_FC=no + ;; + + newsos6) + archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_FC=yes + hardcode_libdir_flag_spec_FC='$wl-rpath $wl$libdir' + hardcode_libdir_separator_FC=: + hardcode_shlibpath_var_FC=no + ;; + + *nto* | *qnx*) + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_FC=yes + hardcode_shlibpath_var_FC=no + hardcode_direct_absolute_FC=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + archive_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec_FC='$wl-rpath,$libdir' + export_dynamic_flag_spec_FC='$wl-E' + else + archive_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_FC='$wl-rpath,$libdir' + fi + else + ld_shlibs_FC=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec_FC='-L$libdir' + hardcode_minus_L_FC=yes + allow_undefined_flag_FC=unsupported + shrext_cmds=.dll + archive_cmds_FC='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds_FC='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds_FC='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes_FC=yes + ;; + + osf3*) + if test yes = "$GCC"; then + allow_undefined_flag_FC=' $wl-expect_unresolved $wl\*' + archive_cmds_FC='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + allow_undefined_flag_FC=' -expect_unresolved \*' + archive_cmds_FC='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + fi + archive_cmds_need_lc_FC='no' + hardcode_libdir_flag_spec_FC='$wl-rpath $wl$libdir' + hardcode_libdir_separator_FC=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test yes = "$GCC"; then + allow_undefined_flag_FC=' $wl-expect_unresolved $wl\*' + archive_cmds_FC='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + hardcode_libdir_flag_spec_FC='$wl-rpath $wl$libdir' + else + allow_undefined_flag_FC=' -expect_unresolved \*' + archive_cmds_FC='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds_FC='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec_FC='-rpath $libdir' + fi + archive_cmds_need_lc_FC='no' + hardcode_libdir_separator_FC=: + ;; + + solaris*) + no_undefined_flag_FC=' -z defs' + if test yes = "$GCC"; then + wlarc='$wl' + archive_cmds_FC='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_FC='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds_FC='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_FC='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='$wl' + archive_cmds_FC='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_FC='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec_FC='-R$libdir' + hardcode_shlibpath_var_FC=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. GCC discards it without '$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test yes = "$GCC"; then + whole_archive_flag_spec_FC='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + else + whole_archive_flag_spec_FC='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs_FC=yes + ;; + + sunos4*) + if test sequent = "$host_vendor"; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds_FC='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_FC='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec_FC='-L$libdir' + hardcode_direct_FC=yes + hardcode_minus_L_FC=yes + hardcode_shlibpath_var_FC=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_FC=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds_FC='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds_FC='$CC -r -o $output$reload_objs' + hardcode_direct_FC=no + ;; + motorola) + archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_FC=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_FC=no + ;; + + sysv4.3*) + archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_FC=no + export_dynamic_flag_spec_FC='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_FC=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs_FC=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_FC='$wl-z,text' + archive_cmds_need_lc_FC=no + hardcode_shlibpath_var_FC=no + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds_FC='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_FC='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_FC='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_FC='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_FC='$wl-z,text' + allow_undefined_flag_FC='$wl-z,nodefs' + archive_cmds_need_lc_FC=no + hardcode_shlibpath_var_FC=no + hardcode_libdir_flag_spec_FC='$wl-R,$libdir' + hardcode_libdir_separator_FC=':' + link_all_deplibs_FC=yes + export_dynamic_flag_spec_FC='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds_FC='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_FC='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_FC='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_FC='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_FC='-L$libdir' + hardcode_shlibpath_var_FC=no + ;; + + *) + ld_shlibs_FC=no + ;; + esac + + if test sni = "$host_vendor"; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec_FC='$wl-Blargedynsym' + ;; + esac + fi + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_FC" >&5 +$as_echo "$ld_shlibs_FC" >&6; } +test no = "$ld_shlibs_FC" && can_build_shared=no + +with_gnu_ld_FC=$with_gnu_ld + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_FC" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_FC=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $archive_cmds_FC in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc_FC+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_FC + pic_flag=$lt_prog_compiler_pic_FC + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_FC + allow_undefined_flag_FC= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_FC 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds_FC 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc_FC=no + else + lt_cv_archive_cmds_need_lc_FC=yes + fi + allow_undefined_flag_FC=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_FC" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc_FC" >&6; } + archive_cmds_need_lc_FC=$lt_cv_archive_cmds_need_lc_FC + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + + + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a(lib.so.V)' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl* | *,icl* | *,ifort*) + # Native MSVC or ICC or IFORT + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + hardcode_libdir_flag_spec_FC='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_FC\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_FC\"" + cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +if ac_fn_fc_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_FC= +if test -n "$hardcode_libdir_flag_spec_FC" || + test -n "$runpath_var_FC" || + test yes = "$hardcode_automatic_FC"; then + + # We can hardcode non-existent directories. + if test no != "$hardcode_direct_FC" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, FC)" && + test no != "$hardcode_minus_L_FC"; then + # Linking always hardcodes the temporary library directory. + hardcode_action_FC=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_FC=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_FC=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_FC" >&5 +$as_echo "$hardcode_action_FC" >&6; } + +if test relink = "$hardcode_action_FC" || + test yes = "$inherit_rpath_FC"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test yes != "$_lt_disable_FC" + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + + + + + + + ac_config_commands="$ac_config_commands libtool" + + + + +# Only expand once: + + + +# Patch libtool to circumvent some issues when using MSVC and MS lib. +# This needs to be run after config.status has created libtool. +# 1. Relax check which libraries can be used when linking a DLL. +# libtool's func_mode_link() would reject linking a .lib file when building a DLL, +# even though this .lib file may just be the one that eventually loads a depending DLL, +# e.g., mkl_core_dll.lib. Setting deplibs_check_method=pass_all will still print a +# warning, but the .lib is still passed to the linker. +# 2. Ensure always_export_symbols=no if win32-dll. Even when we pass win32-dll, +# libtool forces always_export_symbols=yes for --tag=CXX if using MS compiler. +# This leads to a nm call that collects ALL C-functions from a library +# and explicitly dll-exporting them, leading to warnings about duplicates +# regarding those that are properly marked for dll-export in the source. +# 3. Do not add mkl_*.lib to old_deplibs, which can result in trying to unpack and repack +# the MKL libraries (which are pretty big). Instead, treat them like other -l<...> libs. +# 4. Add MKL libraries to dependency_libs in .la file, which I guess should be +# the case due to point 5. +# +# Patch libtool also to circumvent some issues when using MinGW (Msys+GCC). +# 1. Relax check which libraries can be used when linking a DLL. +# libtool's func_mode_link() would reject linking MinGW system libraries, +# e.g., -lmingw32, when building a DLL, because it does not find this +# library in the installation path, and then falls back to build only +# static libraries. Setting deplibs_check_method=pass_all will avoid +# this faulty check. + + case "$am_cv_ar_interface" in + lib ) + ac_config_commands="$ac_config_commands libtoolclpatch" + + ;; + * ) + case $build in + *-mingw* ) + ac_config_commands="$ac_config_commands libtoolmingwpatch" + + ;; + esac + ;; + esac + + # Set up LT_LDFLAGS, user can initialize and we augment below + + + # Use the libtool library info, if defined, otherwise use the project version info, + # if a full major.minor.release number was available + LT_LDFLAGS="$LT_LDFLAGS -version-number 2:1:0" + { $as_echo "$as_me:${as_lineno-$LINENO}: libtool version info: -version-number 2:1:0" >&5 +$as_echo "$as_me: libtool version info: -version-number 2:1:0" >&6;} + + + # shared libraries should have no undefined symbols + # for Windows DLLs, it is mandatory to add this + LT_LDFLAGS="$LT_LDFLAGS -no-undefined" + + # add automake conditional on whether we build shared or static, useful for .pc files + if test "$enable_shared" = no; then + COIN_STATIC_BUILD_TRUE= + COIN_STATIC_BUILD_FALSE='#' +else + COIN_STATIC_BUILD_TRUE='#' + COIN_STATIC_BUILD_FALSE= +fi + + + +# Add FLIBS to HSL_LFLAGS, so that they get into the .pc files section for static builds +HSL_LFLAGS="$HSL_LFLAGS $FLIBS" + +############################################################################# +# Find out which files are available # +############################################################################# + +# do this unconditionally to make sure COIN_HAS_PKGCONFIG is also defined if no >= MA57 + + + +# pkgconf is the up-and-coming thing, replacing pkg-config, so prefer it. +# The next stanza is a modified version of PKG_PROG_PKG_CONFIG from pkg.m4. + + if test -z "$PKG_CONFIG" ; then + if test -n "$ac_tool_prefix"; then + for ac_prog in pkgconf pkg-config + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$PKG_CONFIG"; then + ac_cv_prog_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_PKG_CONFIG="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +PKG_CONFIG=$ac_cv_prog_PKG_CONFIG +if test -n "$PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 +$as_echo "$PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$PKG_CONFIG" && break + done +fi +if test -z "$PKG_CONFIG"; then + ac_ct_PKG_CONFIG=$PKG_CONFIG + for ac_prog in pkgconf pkg-config +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_PKG_CONFIG"; then + ac_cv_prog_ac_ct_PKG_CONFIG="$ac_ct_PKG_CONFIG" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_PKG_CONFIG="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_PKG_CONFIG=$ac_cv_prog_ac_ct_PKG_CONFIG +if test -n "$ac_ct_PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_PKG_CONFIG" >&5 +$as_echo "$ac_ct_PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_PKG_CONFIG" && break +done + + if test "x$ac_ct_PKG_CONFIG" = x; then + PKG_CONFIG="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + PKG_CONFIG=$ac_ct_PKG_CONFIG + fi +fi + + fi + if test -n "$PKG_CONFIG" ; then + pkg_min_version=0.16.0 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking $PKG_CONFIG is at least version $pkg_min_version" >&5 +$as_echo_n "checking $PKG_CONFIG is at least version $pkg_min_version... " >&6; } + if $PKG_CONFIG --atleast-pkgconfig-version $pkg_min_version ; then + pkg_version=`$PKG_CONFIG --version` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes: $pkg_version" >&5 +$as_echo "yes: $pkg_version" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + PKG_CONFIG="" + fi + fi + +# Check if PKG_CONFIG supports the short-errors flag. The next stanza is a +# modified version of _PKG_SHORT_ERRORS_SUPPORTED from pkg.m4. + + if test -n "$PKG_CONFIG" && + $PKG_CONFIG --atleast-pkgconfig-version 0.20 ; then + pkg_short_errors=" --short-errors " + else + pkg_short_errors="" + fi + +# Create a makefile variable and conditional. + + if test -n "$PKG_CONFIG"; then + COIN_HAS_PKGCONFIG_TRUE= + COIN_HAS_PKGCONFIG_FALSE='#' +else + COIN_HAS_PKGCONFIG_TRUE='#' + COIN_HAS_PKGCONFIG_FALSE= +fi + + + +# Assemble a PKG_CONFIG search path that will include the installation +# directory for .pc files for COIN packages. Coin .pc files are installed in +# ${libdir}/pkgconfig and COIN_INITIALIZE takes care of setting up +# $expanded_libdir based on $libdir. Of course, +# this whole house of cards balances on the shaky assumption that the user is +# sane and has installed all packages in the same place and does not change +# that place when make executes. If not, well, it's their responsibility to +# augment PKG_CONFIG_PATH in the environment. + + COIN_PKG_CONFIG_PATH="${PKG_CONFIG_PATH}" + + + COIN_PKG_CONFIG_PATH="${expanded_libdir}/pkgconfig:${COIN_PKG_CONFIG_PATH}" + { $as_echo "$as_me:${as_lineno-$LINENO}: $PKG_CONFIG path is \"$COIN_PKG_CONFIG_PATH\"" >&5 +$as_echo "$as_me: $PKG_CONFIG path is \"$COIN_PKG_CONFIG_PATH\"" >&6;} + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for MC19" >&5 +$as_echo_n "checking for MC19... " >&6; } +if test -r "$srcdir/coinhsl/mc19/mc19d.f" ; then + +$as_echo "#define COINHSL_HAS_MC19 1" >>confdefs.h + + coin_has_mc19=yes +else + coin_has_mc19=no +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $coin_has_mc19" >&5 +$as_echo "$coin_has_mc19" >&6; } + if test $coin_has_mc19 = yes; then + COIN_HAS_MC19_TRUE= + COIN_HAS_MC19_FALSE='#' +else + COIN_HAS_MC19_TRUE='#' + COIN_HAS_MC19_FALSE= +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for MA27" >&5 +$as_echo_n "checking for MA27... " >&6; } +if test -r "$srcdir/coinhsl/ma27/ma27d.f" ; then + +$as_echo "#define COINHSL_HAS_MA27 1" >>confdefs.h + + coin_has_ma27=yes +else + coin_has_ma27=no +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $coin_has_ma27" >&5 +$as_echo "$coin_has_ma27" >&6; } + if test $coin_has_ma27 = yes; then + COIN_HAS_MA27_TRUE= + COIN_HAS_MA27_FALSE='#' +else + COIN_HAS_MA27_TRUE='#' + COIN_HAS_MA27_FALSE= +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for MA28" >&5 +$as_echo_n "checking for MA28... " >&6; } +if test -r "$srcdir/coinhsl/ma28/ma28d.f" ; then + +$as_echo "#define COINHSL_HAS_MA28 1" >>confdefs.h + + coin_has_ma28=yes +else + coin_has_ma28=no +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $coin_has_ma28" >&5 +$as_echo "$coin_has_ma28" >&6; } + if test $coin_has_ma28 = yes; then + COIN_HAS_MA28_TRUE= + COIN_HAS_MA28_FALSE='#' +else + COIN_HAS_MA28_TRUE='#' + COIN_HAS_MA28_FALSE= +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for MA57" >&5 +$as_echo_n "checking for MA57... " >&6; } +if test -r "$srcdir/coinhsl/ma57/ma57d.f" ; then + +$as_echo "#define COINHSL_HAS_MA57 1" >>confdefs.h + + coin_has_ma57=yes +else + coin_has_ma57=no +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $coin_has_ma57" >&5 +$as_echo "$coin_has_ma57" >&6; } + if test $coin_has_ma57 = yes; then + COIN_HAS_MA57_TRUE= + COIN_HAS_MA57_FALSE='#' +else + COIN_HAS_MA57_TRUE='#' + COIN_HAS_MA57_FALSE= +fi + + +if test -n "$FC" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MA77" >&5 +$as_echo_n "checking for MA77... " >&6; } + if test -r "$srcdir/coinhsl/hsl_ma77/hsl_ma77d.f90" ; then + +$as_echo "#define COINHSL_HAS_MA77 1" >>confdefs.h + + coin_has_hsl_ma77=yes + else + coin_has_hsl_ma77=no + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $coin_has_hsl_ma77" >&5 +$as_echo "$coin_has_hsl_ma77" >&6; } +else + coin_has_hsl_ma77=no +fi + if test $coin_has_hsl_ma77 = yes; then + COIN_HAS_HSL_MA77_TRUE= + COIN_HAS_HSL_MA77_FALSE='#' +else + COIN_HAS_HSL_MA77_TRUE='#' + COIN_HAS_HSL_MA77_FALSE= +fi + + +if test -n "$FC" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MA86" >&5 +$as_echo_n "checking for MA86... " >&6; } + if test -r "$srcdir/coinhsl/hsl_ma86/hsl_ma86d.f90" ; then + +$as_echo "#define COINHSL_HAS_MA86 1" >>confdefs.h + + coin_has_hsl_ma86=yes + else + coin_has_hsl_ma86=no + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $coin_has_hsl_ma86" >&5 +$as_echo "$coin_has_hsl_ma86" >&6; } +else + coin_has_hsl_ma86=no +fi + if test $coin_has_hsl_ma86 = yes; then + COIN_HAS_HSL_MA86_TRUE= + COIN_HAS_HSL_MA86_FALSE='#' +else + COIN_HAS_HSL_MA86_TRUE='#' + COIN_HAS_HSL_MA86_FALSE= +fi + + +if test -n "$FC" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MA97" >&5 +$as_echo_n "checking for MA97... " >&6; } + if test -r "$srcdir/coinhsl/hsl_ma97/hsl_ma97d.f90" ; then + +$as_echo "#define COINHSL_HAS_MA97 1" >>confdefs.h + + coin_has_hsl_ma97=yes + else + coin_has_hsl_ma97=no + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $coin_has_hsl_ma97" >&5 +$as_echo "$coin_has_hsl_ma97" >&6; } +else + coin_has_hsl_ma97=no +fi + if test $coin_has_hsl_ma97 = yes; then + COIN_HAS_HSL_MA97_TRUE= + COIN_HAS_HSL_MA97_FALSE='#' +else + COIN_HAS_HSL_MA97_TRUE='#' + COIN_HAS_HSL_MA97_FALSE= +fi + + + +coin_has_hsl_mc68=no +if test -n "$FC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C interface to MC68" >&5 +$as_echo_n "checking for C interface to MC68... " >&6; } + if test -r "$srcdir/coinhsl/hsl_mc68/C/hsl_mc68i_ciface.f90" ; then + +$as_echo "#define COINHSL_HAS_MC68 1" >>confdefs.h + + coin_has_hsl_mc68=yes + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $coin_has_hsl_mc68" >&5 +$as_echo "$coin_has_hsl_mc68" >&6; } +fi + if test $coin_has_hsl_mc68 = yes; then + COIN_HAS_HSL_MC68_TRUE= + COIN_HAS_HSL_MC68_FALSE='#' +else + COIN_HAS_HSL_MC68_TRUE='#' + COIN_HAS_HSL_MC68_FALSE= +fi + + +# the F90 codes depend on deps90.f90 +coin_has_depsf90=no +if test $coin_has_hsl_mc68$coin_has_hsl_ma77$coin_has_hsl_ma86$coin_has_hsl_ma97 != nononono ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for deps90.f90" >&5 +$as_echo_n "checking for deps90.f90... " >&6; } + if test -r "$srcdir/coinhsl/common/deps90.f90" ; then + coin_has_depsf90=yes + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $coin_has_depsf90" >&5 +$as_echo "$coin_has_depsf90" >&6; } + if test $coin_has_depsf90 = no; then + as_fn_error $? "Required file common/deps90.f90 not found" "$LINENO" 5 + fi +fi + if test $coin_has_depsf90 = yes; then + COIN_HAS_DEPSF90_TRUE= + COIN_HAS_DEPSF90_FALSE='#' +else + COIN_HAS_DEPSF90_TRUE='#' + COIN_HAS_DEPSF90_FALSE= +fi + + +# MA57, MA77, and MA86 require BLAS, MA97 requires LAPACK +if test $coin_has_ma57$coin_has_hsl_ma77$coin_has_hsl_ma86$coin_has_hsl_ma97 != nononono ; then + +# Make sure the necessary variables exist for each client package. + + + + + +# Set up command line arguments with DEF_PRIM_ARGS. + + + + +# Check whether --with-lapack was given. +if test "${with_lapack+set}" = set; then : + withval=$with_lapack; +fi + + + +# Check whether --with-lapack-lflags was given. +if test "${with_lapack_lflags+set}" = set; then : + withval=$with_lapack_lflags; +fi + + + + + + + +# Give FIND_PRIM_PKG a chance to look for user-specified lapack flags, +# but skip any checks via a .pc file. The result (coin_has_lapack) will +# be one of yes (the user specified something), no (user specified nothing), +# or skipping (user said do not use). We'll also have variables +# lapack_lflags, lapack_cflags, lapack_data, and lapack_pcfiles. + + + + dflt_action=yes + +# Initialize variables for the primary package. + + coin_has_lapack=noInfo + lapack_lflags= + lapack_cflags= + lapack_data= + lapack_pcfiles= + +# --with-prim is always present. If the client specified dataonly, its value +# is assigned to prim_data. + + withval="$with_lapack" + if test -n "$withval" ; then + case "$withval" in + no ) + coin_has_lapack=skipping + ;; + yes ) + coin_has_lapack=requested + ;; + build ) + coin_has_lapack=build + ;; + * ) + coin_has_lapack=yes + lapack_lflags="$withval" + ;; + esac + fi + +# --with-prim-libs and --with-prim-cflags are present unless the client +# specified dataonly. Specifying --with-prim=no overrides the individual +# options for libs and cflags. + + if test "$coin_has_lapack" != skipping ; then + withval="$with_lapack_lflags" + if test -n "$withval" ; then + case "$withval" in + build | no | yes ) + as_fn_error $? "\"$withval\" is not valid here; please specify linker flags appropriate for your environment." "$LINENO" 5 + ;; + * ) + coin_has_lapack=yes + lapack_lflags="$withval" + ;; + esac + fi + + withval="$with_lapack_cflags" + if test -n "$withval" ; then + case "$withval" in + build | no | yes ) + as_fn_error $? "\"$withval\" is not valid here; please specify compiler flags appropriate for your environment." "$LINENO" 5 + ;; + * ) + coin_has_lapack=yes + lapack_cflags="$withval" + ;; + esac + fi + fi + +# --with-prim-data will be present unless the client specified nodata. +# Specifying --with-prim=no overrides the individual option for data. + + + +# At this point, coin_has_prim can be one of noInfo (no user options +# specified), skipping (user said no), requested or build (user said yes +# or build and gave no further guidance), or yes (user specified one or +# more --with-prim options). If we're already at yes or skipping, we're +# done looking. + +# If there are no user options (noInfo) and the default is no, we're skipping. +# Otherwise, the default must be yes or build; consider the package requested. +# A default action we don't recognise defaults to yes. + + if test "$coin_has_lapack" = noInfo ; then + case $dflt_action in + no ) + coin_has_lapack=skipping + ;; + build ) + coin_has_lapack=build + ;; + * ) + coin_has_lapack=requested + ;; + esac + fi + +# Now coin_has_prim can be one of skipping, yes, requested, or build. For +# requested or build, try pkgconf, if it's available. If it's not available, +# well, hope that the user knows their system and prim can be used with no +# additional flags. + + case $coin_has_lapack in + requested | build ) + if test -n "$PKG_CONFIG" -a "skip" != skip ; then + pcfile="skip" + + + + if test -n "$PKG_CONFIG" ; then + if PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG --exists "$pcfile" ; then + LAPACK_VERSIONS=`PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG --modversion "$pcfile" 2>/dev/null | tr '\n' ' '` + coin_has_lapack=yes + lapack_data=`PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG --variable=datadir "$pcfile" 2>/dev/null` + lapack_pcfiles="$pcfile" + else + LAPACK_PKG_ERRORS=`PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG $pkg_short_errors --errors-to-stdout --print-errors "$pcfile"` + coin_has_lapack=no + fi + else + as_fn_error $? "\"Cannot check for existence of module lapack without pkgconf\"" "$LINENO" 5 + fi + + else + coin_has_lapack=no + # AC_MSG_WARN([skipped check via pkgconf as no pkgconf available]) + fi + ;; + skipping | yes ) + ;; + * ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unexpected status \"$coin_has_lapack\" in COIN_FIND_PRIM_PKG" >&5 +$as_echo "$as_me: WARNING: Unexpected status \"$coin_has_lapack\" in COIN_FIND_PRIM_PKG" >&2;} + ;; + esac + +# The final value of coin_has_prim will be yes, no, or skipping. No means +# we looked (with pkgconfig) and didn't find anything. Skipping means the +# user said `don't use.' Yes means we have something, from the user or +# from pkgconfig. Note that we haven't run a useability test! + +# Define BUILDTOOLS_DEBUG to enable debugging output + + if test "$BUILDTOOLS_DEBUG" = 1 ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: FIND_PRIM_PKG result for lapack: \"$coin_has_lapack\"" >&5 +$as_echo "$as_me: FIND_PRIM_PKG result for lapack: \"$coin_has_lapack\"" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Collected values for package 'lapack'" >&5 +$as_echo "$as_me: Collected values for package 'lapack'" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: lapack_lflags is \"$lapack_lflags\"" >&5 +$as_echo "$as_me: lapack_lflags is \"$lapack_lflags\"" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: lapack_cflags is \"$lapack_cflags\"" >&5 +$as_echo "$as_me: lapack_cflags is \"$lapack_cflags\"" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: lapack_data is \"$lapack_data\"" >&5 +$as_echo "$as_me: lapack_data is \"$lapack_data\"" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: lapack_pcfiles is \"$lapack_pcfiles\"" >&5 +$as_echo "$as_me: lapack_pcfiles is \"$lapack_pcfiles\"" >&6;} + fi + + + +# If FIND_PRIM_PKG found something, then we'll do a link check to figure +# out whether it is working and what the name mangling scheme is. +# This sets dsyev_namemangling + if test "$coin_has_lapack" = yes ; then + + # setup LIBS by adding $lapack_lflags and those from $lapack_pcfiles + ac_save_LIBS="$LIBS" + LIBS="$lapack_lflags $LIBS" + if test -n "$lapack_pcfiles" ; then + + temp_LFLAGS=`PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG --libs $lapack_pcfiles` + LIBS="$temp_LFLAGS $LIBS" + fi + + dsyev_namemangling=unknown + + # FIXME we had "extra underscore" as additional option for ac_extra + # but since there is no use for ac_extra below, was there any use for it? + for ac_extra in "no extra underscore" ; do + for ac_case in "lower case" "upper case" ; do + for ac_trail in "underscore" "no underscore" ; do + #AC_MSG_NOTICE([Attempting link for ${ac_case}, ${ac_trail}, ${ac_extra}]) + case $ac_case in + "lower case") + ac_name=dsyev + ;; + "upper case") + ac_name=DSYEV + ;; + esac + if test "$ac_trail" = underscore ; then + ac_name=${ac_name}_ + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for function $ac_name in $LIBS" >&5 +$as_echo_n "checking for function $ac_name in $LIBS... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_name (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return $ac_name (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + dsyev_namemangling="${ac_case}, ${ac_trail}, ${ac_extra}" + ac_success=yes +else + ac_success=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_success" >&5 +$as_echo "$ac_success" >&6; } + if test $ac_success = yes ; then + break 3 + fi + done + done + done + LIBS=$ac_save_LIBS + + if test $ac_success = yes ; then + : + else as_fn_error $? "Could not find dsyev in Lapack" "$LINENO" 5 + fi + + fi + +# If FIND_PRIM_PKG didn't find anything, try a few more guesses for +# optimized blas/lapack libs (based on build system type). + if test "$coin_has_lapack" = no ; then + case $build in + *-linux*) + + # setup LIBS by adding -lmkl_core -lmkl_intel_lp64 -lmkl_sequential -lm and those from + ac_save_LIBS="$LIBS" + LIBS="-lmkl_core -lmkl_intel_lp64 -lmkl_sequential -lm $LIBS" + + + dsyev_namemangling=unknown + + # FIXME we had "extra underscore" as additional option for ac_extra + # but since there is no use for ac_extra below, was there any use for it? + for ac_extra in "no extra underscore" ; do + for ac_case in "lower case" "upper case" ; do + for ac_trail in "underscore" "no underscore" ; do + #AC_MSG_NOTICE([Attempting link for ${ac_case}, ${ac_trail}, ${ac_extra}]) + case $ac_case in + "lower case") + ac_name=dsyev + ;; + "upper case") + ac_name=DSYEV + ;; + esac + if test "$ac_trail" = underscore ; then + ac_name=${ac_name}_ + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for function $ac_name in $LIBS" >&5 +$as_echo_n "checking for function $ac_name in $LIBS... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_name (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return $ac_name (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + dsyev_namemangling="${ac_case}, ${ac_trail}, ${ac_extra}" + ac_success=yes +else + ac_success=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_success" >&5 +$as_echo "$ac_success" >&6; } + if test $ac_success = yes ; then + break 3 + fi + done + done + done + LIBS=$ac_save_LIBS + + if test $ac_success = yes ; then + + coin_has_lapack=yes + lapack_lflags="-lmkl_core -lmkl_intel_lp64 -lmkl_sequential -lm" + + fi + + ;; + + *-sgi-*) + + # setup LIBS by adding -lcomplib.sgimath and those from + ac_save_LIBS="$LIBS" + LIBS="-lcomplib.sgimath $LIBS" + + + dsyev_namemangling=unknown + + # FIXME we had "extra underscore" as additional option for ac_extra + # but since there is no use for ac_extra below, was there any use for it? + for ac_extra in "no extra underscore" ; do + for ac_case in "lower case" "upper case" ; do + for ac_trail in "underscore" "no underscore" ; do + #AC_MSG_NOTICE([Attempting link for ${ac_case}, ${ac_trail}, ${ac_extra}]) + case $ac_case in + "lower case") + ac_name=dsyev + ;; + "upper case") + ac_name=DSYEV + ;; + esac + if test "$ac_trail" = underscore ; then + ac_name=${ac_name}_ + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for function $ac_name in $LIBS" >&5 +$as_echo_n "checking for function $ac_name in $LIBS... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_name (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return $ac_name (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + dsyev_namemangling="${ac_case}, ${ac_trail}, ${ac_extra}" + ac_success=yes +else + ac_success=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_success" >&5 +$as_echo "$ac_success" >&6; } + if test $ac_success = yes ; then + break 3 + fi + done + done + done + LIBS=$ac_save_LIBS + + if test $ac_success = yes ; then + + coin_has_lapack=yes + lapack_lflags=-lcomplib.sgimath + + fi + + ;; + + *-*-solaris*) + # Ideally, we'd use -library=sunperf, but it's an imperfect world. + # Studio cc doesn't recognise -library, it wants -xlic_lib. Studio 12 + # CC doesn't recognise -xlic_lib. Libtool doesn't like -xlic_lib + # anyway. Sun claims that CC and cc will understand -library in Studio + # 13. The main extra function of -xlic_lib and -library is to arrange + # for the Fortran run-time libraries to be linked for C++ and C. We + # can arrange that explicitly. + + # setup LIBS by adding -lsunperf and those from + ac_save_LIBS="$LIBS" + LIBS="-lsunperf $LIBS" + + + dsyev_namemangling=unknown + + # FIXME we had "extra underscore" as additional option for ac_extra + # but since there is no use for ac_extra below, was there any use for it? + for ac_extra in "no extra underscore" ; do + for ac_case in "lower case" "upper case" ; do + for ac_trail in "underscore" "no underscore" ; do + #AC_MSG_NOTICE([Attempting link for ${ac_case}, ${ac_trail}, ${ac_extra}]) + case $ac_case in + "lower case") + ac_name=dsyev + ;; + "upper case") + ac_name=DSYEV + ;; + esac + if test "$ac_trail" = underscore ; then + ac_name=${ac_name}_ + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for function $ac_name in $LIBS" >&5 +$as_echo_n "checking for function $ac_name in $LIBS... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_name (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return $ac_name (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + dsyev_namemangling="${ac_case}, ${ac_trail}, ${ac_extra}" + ac_success=yes +else + ac_success=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_success" >&5 +$as_echo "$ac_success" >&6; } + if test $ac_success = yes ; then + break 3 + fi + done + done + done + LIBS=$ac_save_LIBS + + if test $ac_success = yes ; then + + coin_has_lapack=yes + lapack_lflags=-lsunperf + + fi + + ;; + + *-cygwin* | *-mingw* | *-msys*) + # check for 64-bit sequential MKL in $LIB + old_IFS="$IFS" + IFS=";" + for d in $LIB ; do + # turn $d into unix-style short path (no spaces); cannot do -us, so first do -ws, then -u + d=`cygpath -ws "$d"` + d=`cygpath -u "$d"` + if test "$enable_shared" = yes ; then + if test -e "$d/mkl_core_dll.lib" ; then + coin_mkl="$d/mkl_intel_lp64_dll.lib $d/mkl_sequential_dll.lib $d/mkl_core_dll.lib" + break + fi + else + if test -e "$d/mkl_core.lib" ; then + coin_mkl="$d/mkl_intel_lp64.lib $d/mkl_sequential.lib $d/mkl_core.lib" + break + fi + fi + done + IFS="$old_IFS" + + # setup LIBS by adding $coin_mkl and those from + ac_save_LIBS="$LIBS" + LIBS="$coin_mkl $LIBS" + + + dsyev_namemangling=unknown + + # FIXME we had "extra underscore" as additional option for ac_extra + # but since there is no use for ac_extra below, was there any use for it? + for ac_extra in "no extra underscore" ; do + for ac_case in "lower case" "upper case" ; do + for ac_trail in "underscore" "no underscore" ; do + #AC_MSG_NOTICE([Attempting link for ${ac_case}, ${ac_trail}, ${ac_extra}]) + case $ac_case in + "lower case") + ac_name=dsyev + ;; + "upper case") + ac_name=DSYEV + ;; + esac + if test "$ac_trail" = underscore ; then + ac_name=${ac_name}_ + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for function $ac_name in $LIBS" >&5 +$as_echo_n "checking for function $ac_name in $LIBS... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_name (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return $ac_name (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + dsyev_namemangling="${ac_case}, ${ac_trail}, ${ac_extra}" + ac_success=yes +else + ac_success=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_success" >&5 +$as_echo "$ac_success" >&6; } + if test $ac_success = yes ; then + break 3 + fi + done + done + done + LIBS=$ac_save_LIBS + + if test $ac_success = yes ; then + coin_has_lapack=yes + lapack_lflags="$coin_mkl" + + fi + + ;; + + *-darwin*) + + # setup LIBS by adding -lmkl_core -lmkl_intel_lp64 -lmkl_sequential -lm and those from + ac_save_LIBS="$LIBS" + LIBS="-lmkl_core -lmkl_intel_lp64 -lmkl_sequential -lm $LIBS" + + + dsyev_namemangling=unknown + + # FIXME we had "extra underscore" as additional option for ac_extra + # but since there is no use for ac_extra below, was there any use for it? + for ac_extra in "no extra underscore" ; do + for ac_case in "lower case" "upper case" ; do + for ac_trail in "underscore" "no underscore" ; do + #AC_MSG_NOTICE([Attempting link for ${ac_case}, ${ac_trail}, ${ac_extra}]) + case $ac_case in + "lower case") + ac_name=dsyev + ;; + "upper case") + ac_name=DSYEV + ;; + esac + if test "$ac_trail" = underscore ; then + ac_name=${ac_name}_ + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for function $ac_name in $LIBS" >&5 +$as_echo_n "checking for function $ac_name in $LIBS... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_name (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return $ac_name (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + dsyev_namemangling="${ac_case}, ${ac_trail}, ${ac_extra}" + ac_success=yes +else + ac_success=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_success" >&5 +$as_echo "$ac_success" >&6; } + if test $ac_success = yes ; then + break 3 + fi + done + done + done + LIBS=$ac_save_LIBS + + if test $ac_success = yes ; then + + coin_has_lapack=yes + lapack_lflags="-lmkl_core -lmkl_intel_lp64 -lmkl_sequential -lm" + + fi + + if test "$coin_has_lapack" = no ; then + + # setup LIBS by adding -framework Accelerate and those from + ac_save_LIBS="$LIBS" + LIBS="-framework Accelerate $LIBS" + + + dsyev_namemangling=unknown + + # FIXME we had "extra underscore" as additional option for ac_extra + # but since there is no use for ac_extra below, was there any use for it? + for ac_extra in "no extra underscore" ; do + for ac_case in "lower case" "upper case" ; do + for ac_trail in "underscore" "no underscore" ; do + #AC_MSG_NOTICE([Attempting link for ${ac_case}, ${ac_trail}, ${ac_extra}]) + case $ac_case in + "lower case") + ac_name=dsyev + ;; + "upper case") + ac_name=DSYEV + ;; + esac + if test "$ac_trail" = underscore ; then + ac_name=${ac_name}_ + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for function $ac_name in $LIBS" >&5 +$as_echo_n "checking for function $ac_name in $LIBS... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_name (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return $ac_name (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + dsyev_namemangling="${ac_case}, ${ac_trail}, ${ac_extra}" + ac_success=yes +else + ac_success=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_success" >&5 +$as_echo "$ac_success" >&6; } + if test $ac_success = yes ; then + break 3 + fi + done + done + done + LIBS=$ac_save_LIBS + + if test $ac_success = yes ; then + + coin_has_lapack=yes + lapack_lflags="-framework Accelerate" + + fi + + fi + ;; + esac + fi + +# If none of the above worked, check whether lapack.pc blas.pc exists and links +# We check for both to ensure that blas lib also appears on link line in case +# someone wants to use Blas functions but tests only for Lapack. + if test "$coin_has_lapack" = no ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lapack.pc and blas.pc" >&5 +$as_echo_n "checking for lapack.pc and blas.pc... " >&6; } + + + + if test -n "$PKG_CONFIG" ; then + if PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG --exists "lapack blas" ; then + LAPACK_VERSIONS=`PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG --modversion "lapack blas" 2>/dev/null | tr '\n' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + # setup LIBS by adding and those from lapack + ac_save_LIBS="$LIBS" + + if test -n "lapack" ; then + + temp_LFLAGS=`PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG --libs lapack` + LIBS="$temp_LFLAGS $LIBS" + fi + + dsyev_namemangling=unknown + + # FIXME we had "extra underscore" as additional option for ac_extra + # but since there is no use for ac_extra below, was there any use for it? + for ac_extra in "no extra underscore" ; do + for ac_case in "lower case" "upper case" ; do + for ac_trail in "underscore" "no underscore" ; do + #AC_MSG_NOTICE([Attempting link for ${ac_case}, ${ac_trail}, ${ac_extra}]) + case $ac_case in + "lower case") + ac_name=dsyev + ;; + "upper case") + ac_name=DSYEV + ;; + esac + if test "$ac_trail" = underscore ; then + ac_name=${ac_name}_ + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for function $ac_name in $LIBS" >&5 +$as_echo_n "checking for function $ac_name in $LIBS... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_name (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return $ac_name (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + dsyev_namemangling="${ac_case}, ${ac_trail}, ${ac_extra}" + ac_success=yes +else + ac_success=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_success" >&5 +$as_echo "$ac_success" >&6; } + if test $ac_success = yes ; then + break 3 + fi + done + done + done + LIBS=$ac_save_LIBS + + if test $ac_success = yes ; then + coin_has_lapack=yes + lapack_pcfiles="lapack blas" + else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: lapack.pc and blas.pc present, but could not find dsyev when trying to link with it." >&5 +$as_echo "$as_me: WARNING: lapack.pc and blas.pc present, but could not find dsyev when trying to link with it." >&2;} + fi + + else + LAPACK_PKG_ERRORS=`PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG $pkg_short_errors --errors-to-stdout --print-errors "lapack blas"` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + else + as_fn_error $? "\"Cannot check for existence of module lapack without pkgconf\"" "$LINENO" 5 + fi + + fi + +# TODO do we need another check with lapack.pc only? + +# If none of the above worked, try the generic -llapack -lblas as last resort. +# We check for both to ensure that blas lib also appears on link line in case +# someone wants to use Blas functions but tests only for Lapack. + if test "$coin_has_lapack" = no ; then + + # setup LIBS by adding -llapack -lblas and those from + ac_save_LIBS="$LIBS" + LIBS="-llapack -lblas $LIBS" + + + dsyev_namemangling=unknown + + # FIXME we had "extra underscore" as additional option for ac_extra + # but since there is no use for ac_extra below, was there any use for it? + for ac_extra in "no extra underscore" ; do + for ac_case in "lower case" "upper case" ; do + for ac_trail in "underscore" "no underscore" ; do + #AC_MSG_NOTICE([Attempting link for ${ac_case}, ${ac_trail}, ${ac_extra}]) + case $ac_case in + "lower case") + ac_name=dsyev + ;; + "upper case") + ac_name=DSYEV + ;; + esac + if test "$ac_trail" = underscore ; then + ac_name=${ac_name}_ + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for function $ac_name in $LIBS" >&5 +$as_echo_n "checking for function $ac_name in $LIBS... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_name (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return $ac_name (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + dsyev_namemangling="${ac_case}, ${ac_trail}, ${ac_extra}" + ac_success=yes +else + ac_success=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_success" >&5 +$as_echo "$ac_success" >&6; } + if test $ac_success = yes ; then + break 3 + fi + done + done + done + LIBS=$ac_save_LIBS + + if test $ac_success = yes ; then + + coin_has_lapack=yes + lapack_lflags="-llapack -lblas" + + fi + + fi + +# TODO do we need another check with -llapack only? + +# Time to set some variables. Create an automake conditional COIN_HAS_LAPACK. + if test $coin_has_lapack = yes; then + COIN_HAS_LAPACK_TRUE= + COIN_HAS_LAPACK_FALSE='#' +else + COIN_HAS_LAPACK_TRUE='#' + COIN_HAS_LAPACK_FALSE= +fi + + +# If we've located the package, define preprocessor symbol COIN_HAS_LAPACK +# and COIN_LAPACK_FUNC[_] and augment the necessary variables for the client packages. + if test $coin_has_lapack = yes ; then + +$as_echo "#define COINHSL_HAS_LAPACK 1" >>confdefs.h + + + + + case "${dsyev_namemangling}" in + "lower case, no underscore, no extra underscore") + $as_echo "#define COINHSL_LAPACK_FUNC(name,NAME) name" >>confdefs.h + + $as_echo "#define COINHSL_LAPACK_FUNC_(name,NAME) name" >>confdefs.h + ;; + "lower case, no underscore, extra underscore") + $as_echo "#define COINHSL_LAPACK_FUNC(name,NAME) name" >>confdefs.h + + $as_echo "#define COINHSL_LAPACK_FUNC_(name,NAME) name ## _" >>confdefs.h + ;; + "lower case, underscore, no extra underscore") + $as_echo "#define COINHSL_LAPACK_FUNC(name,NAME) name ## _" >>confdefs.h + + $as_echo "#define COINHSL_LAPACK_FUNC_(name,NAME) name ## _" >>confdefs.h + ;; + "lower case, underscore, extra underscore") + $as_echo "#define COINHSL_LAPACK_FUNC(name,NAME) name ## _" >>confdefs.h + + $as_echo "#define COINHSL_LAPACK_FUNC_(name,NAME) name ## __" >>confdefs.h + ;; + "upper case, no underscore, no extra underscore") + $as_echo "#define COINHSL_LAPACK_FUNC(name,NAME) NAME" >>confdefs.h + + $as_echo "#define COINHSL_LAPACK_FUNC_(name,NAME) NAME" >>confdefs.h + ;; + "upper case, no underscore, extra underscore") + $as_echo "#define COINHSL_LAPACK_FUNC(name,NAME) NAME" >>confdefs.h + + $as_echo "#define COINHSL_LAPACK_FUNC_(name,NAME) NAME ## _" >>confdefs.h + ;; + "upper case, underscore, no extra underscore") + $as_echo "#define COINHSL_LAPACK_FUNC(name,NAME) NAME ## _" >>confdefs.h + + $as_echo "#define COINHSL_LAPACK_FUNC_(name,NAME) NAME ## _" >>confdefs.h + ;; + "upper case, underscore, extra underscore") + $as_echo "#define COINHSL_LAPACK_FUNC(name,NAME) NAME ## _" >>confdefs.h + + $as_echo "#define COINHSL_LAPACK_FUNC_(name,NAME) NAME ## __" >>confdefs.h + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unsupported or unknown name-mangling scheme: ${dsyev_namemangling}" >&5 +$as_echo "$as_me: WARNING: Unsupported or unknown name-mangling scheme: ${dsyev_namemangling}" >&2;} + ;; + esac + + if test -n "$lapack_pcfiles" ; then HSL_PCFILES="$lapack_pcfiles $HSL_PCFILES" ; fi + HSL_LFLAGS="$lapack_lflags $HSL_LFLAGS" + HSL_CFLAGS="$lapack_cflags $HSL_CFLAGS" + + fi + + if test $coin_has_lapack != yes ; then + as_fn_error $? "Required package LAPACK not found." "$LINENO" 5 + fi +else + if false; then + COIN_HAS_LAPACK_TRUE= + COIN_HAS_LAPACK_FALSE='#' +else + COIN_HAS_LAPACK_TRUE='#' + COIN_HAS_LAPACK_FALSE= +fi + +fi + +# MA57, MA77, MA97, and MC68 can use Metis +if test $coin_has_ma57$coin_has_hsl_ma77$coin_has_hsl_ma97$coin_has_hsl_mc68 != nononono ; then + + + + + + coin_save_LIBS="$LIBS" + LIBS= + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing cos" >&5 +$as_echo_n "checking for library containing cos... " >&6; } +if ${ac_cv_search_cos+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char cos (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return cos (); + ; + return 0; +} +_ACEOF +for ac_lib in '' m; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_cos=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_cos+:} false; then : + break +fi +done +if ${ac_cv_search_cos+:} false; then : + +else + ac_cv_search_cos=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_cos" >&5 +$as_echo "$ac_cv_search_cos" >&6; } +ac_res=$ac_cv_search_cos +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + if test "$ac_cv_search_cos" != 'none required' ; then + METISCHECK_LFLAGS="$ac_cv_search_cos $METISCHECK_LFLAGS" + + fi +fi + + LIBS="$coin_save_LIBS" + + ac_ext=${ac_fc_srcext-f} +ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' +ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_fc_compiler_gnu + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for package Metis with function metis_nodend" >&5 +$as_echo_n "checking for package Metis with function metis_nodend... " >&6; } + +# Make sure the necessary variables exist for each client package. + + + + + +# Check to see if the user has overridden configure parameters from the +# environment. + + coin_has_metis=noInfo + if test x"$COIN_SKIP_PROJECTS" != x ; then + for pkg in $COIN_SKIP_PROJECTS ; do + if test "$pkg" = "$metis" ; then + coin_has_metis=skipping + fi + done + fi + +# If we're not skipping this project, define and process the command line +# options according to the cmdopts parameter. Then invoke FIND_PRIM_PKG to do +# the heavy lifting. + + if test "$coin_has_metis" != skipping ; then + + + + +# Check whether --with-metis was given. +if test "${with_metis+set}" = set; then : + withval=$with_metis; +fi + + + +# Check whether --with-metis-lflags was given. +if test "${with_metis_lflags+set}" = set; then : + withval=$with_metis_lflags; +fi + + + +# Check whether --with-metis-cflags was given. +if test "${with_metis_cflags+set}" = set; then : + withval=$with_metis_cflags; +fi + + + + + + dflt_action=yes + +# Initialize variables for the primary library. + + coin_has_metis=noInfo + metis_lflags= + metis_cflags= + metis_data= + +# --with-prim is always present. If the client specified dataonly, its value +# is assigned to prim_data. + + withval="$with_metis" + if test -n "$withval" ; then + case "$withval" in + no ) + coin_has_metis=skipping + ;; + yes ) + coin_has_metis=requested + ;; + build ) + coin_has_metis=build + ;; + * ) + coin_has_metis=yes + metis_lflags="$withval" + ;; + esac + fi + +# --with-prim-lflags and --with-prim-cflags are present unless the client +# specified dataonly. Specifying --with-prim=no overrides the individual +# options for lflags and cflags. + + if test "$coin_has_metis" != skipping ; then + withval="$with_metis_lflags" + if test -n "$withval" ; then + case "$withval" in + build | no | yes ) + as_fn_error $? "\"$withval\" is not valid here; please specify linker flags appropriate for your environment." "$LINENO" 5 + ;; + * ) + coin_has_metis=yes + metis_lflags="$withval" + ;; + esac + fi + + withval="$with_metis_cflags" + if test -n "$withval" ; then + case "$withval" in + build | no | yes ) + as_fn_error $? "\"$withval\" is not valid here; please specify compiler flags appropriate for your environment." "$LINENO" 5 + ;; + * ) + coin_has_metis=yes + metis_cflags="$withval" + ;; + esac + fi + fi + +# --with-prim-data will be present unless the client specified nodata. +# Specifying --with-prim=no overrides the individual option for data. + + + +# At this point, coin_has_prim can be one of noInfo (no user options +# specified), skipping (user said no), requested or build (user said yes +# or build and gave no further guidance), or yes (user specified one or +# more --with-prim options). If we're already at yes or skipping, we're +# done looking. + +# If there are no user options (noInfo) and the default is no, we're skipping. +# Otherwise, the default must be yes or build; consider the package requested. +# A default action we don't recognise defaults to yes. + + if test "$coin_has_metis" = noInfo ; then + case $dflt_action in + no ) + coin_has_metis=skipping + ;; + build ) + coin_has_metis=build + ;; + * ) + coin_has_metis=requested + ;; + esac + fi + +# Now coin_has_prim can be one of skipping, yes, build, or requested. For +# build or requested, use the parameter values or invent some. + + case $coin_has_metis in + build | requested) + metis_lflags="-lmetis "$METISCHECK_LFLAGS"" + if test "$coin_has_metis" = build ; then + metis_cflags="-I\$(pkgincludedir)/ThirdParty" + fi + + coin_has_metis=yes + ;; + skipping | yes ) + ;; + * ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unexpected status \"$coin_has_metis\" in COIN_FIND_PRIM_LIB" >&5 +$as_echo "$as_me: WARNING: Unexpected status \"$coin_has_metis\" in COIN_FIND_PRIM_LIB" >&2;} + ;; + esac + +# At this point, coin_has_prim is yes or skipping. Time to run a link check, +# if we have a function (metis_nodend). Use whatever we've collected for lflags, plus +# other libraries () as the other libraries parameter to AC_SEARCH_LIBS, +# leaving the library parameter blank. + + if test $coin_has_metis != skipping ; then + ac_save_LIBS=$LIBS + LIBS="$metis_lflags " + cat > conftest.$ac_ext <<_ACEOF + program main + call metis_nodend + end +_ACEOF +if ac_fn_fc_try_link "$LINENO"; then : + +else + coin_has_metis=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_save_LIBS + fi + +# The final value of coin_has_prim will be yes, no, or skipping. No means that +# the link check failed. Yes means that we passed the link check, or no link +# check was performed. Skipping means the user said `don't use.' + +# Define BUILDTOOLS_DEBUG to enable debugging output + + if test "$BUILDTOOLS_DEBUG" = 1 ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: FIND_PRIM_LIB result for metis: \"$coin_has_metis\"" >&5 +$as_echo "$as_me: FIND_PRIM_LIB result for metis: \"$coin_has_metis\"" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Collected values for package 'metis'" >&5 +$as_echo "$as_me: Collected values for package 'metis'" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: metis_lflags is \"$metis_lflags\"" >&5 +$as_echo "$as_me: metis_lflags is \"$metis_lflags\"" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: metis_cflags is \"$metis_cflags\"" >&5 +$as_echo "$as_me: metis_cflags is \"$metis_cflags\"" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: metis_data is \"$metis_data\"" >&5 +$as_echo "$as_me: metis_data is \"$metis_data\"" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: metis_pcfiles is \"$metis_pcfiles\"" >&5 +$as_echo "$as_me: metis_pcfiles is \"$metis_pcfiles\"" >&6;} + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $coin_has_metis" >&5 +$as_echo "$coin_has_metis" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $coin_has_metis due to COIN_SKIP_PROJECTS" >&5 +$as_echo "$coin_has_metis due to COIN_SKIP_PROJECTS" >&6; } + fi + +# Possibilities are `yes', `no', or `skipping'. Normalise to `yes' or `no'. + + if test "$coin_has_metis" != yes ; then + coin_has_metis=no + fi + +# Create an automake conditional COIN_HAS_PRIM. + + if test $coin_has_metis = yes; then + COIN_HAS_METIS_TRUE= + COIN_HAS_METIS_FALSE='#' +else + COIN_HAS_METIS_TRUE='#' + COIN_HAS_METIS_FALSE= +fi + + +# If we've located the package, define preprocessor symbol COIN_HAS_PRIM +# and augment the necessary variables for the client packages. + + if test $coin_has_metis = yes ; then + +$as_echo "#define COINHSL_HAS_METIS 1" >>confdefs.h + + HSL_LFLAGS="$metis_lflags $HSL_LFLAGS" + HSL_CFLAGS="$metis_cflags $HSL_CFLAGS" + + +# Finally, set up PRIM_DATA, unless the user specified nodata. + + + fi + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +else + coin_has_metis=no +fi + +if test $coin_has_metis = yes ; then + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + coin_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $metis_cflags" + ac_fn_c_check_header_mongrel "$LINENO" "metis.h" "ac_cv_header_metis_h" "$ac_includes_default" +if test "x$ac_cv_header_metis_h" = xyes; then : + +else + coin_has_metis=no +fi + + + CPPFLAGS="$coin_CPPFLAGS" + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi + +# check whether we can redefine metis_nodend to coinmetis_nodend from metis_adapter +if test $coin_has_metis = yes ; then + ac_ext=${ac_fc_srcext-f} +ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' +ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_fc_compiler_gnu +ac_fc_pp_define_srcext_save=$ac_fc_srcext +ac_ext=${ac_fc_srcext-f} +ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' +ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_fc_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran flag to compile preprocessed .F files" >&5 +$as_echo_n "checking for Fortran flag to compile preprocessed .F files... " >&6; } +if ${ac_cv_fc_pp_srcext_F+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=F +ac_fcflags_pp_srcext_save=$ac_fcflags_srcext +ac_fcflags_srcext= +ac_cv_fc_pp_srcext_F=unknown +case $ac_ext in #( + [fF]77) ac_try=f77-cpp-input;; #( + *) ac_try=f95-cpp-input;; +esac +for ac_flag in none -ftpp -fpp -Tf "-fpp -Tf" -xpp=fpp -Mpreprocess "-e Z" \ + -cpp -xpp=cpp -qsuffix=cpp=F "-x $ac_try" +cpp -Cpp; do + test "x$ac_flag" != xnone && ac_fcflags_srcext="$ac_flag" + cat > conftest.$ac_ext <<_ACEOF + program main + +#if 0 +#include + choke me +#endif + end +_ACEOF +if ac_fn_fc_try_compile "$LINENO"; then : + cat > conftest.$ac_ext <<_ACEOF + program main + +#if 1 +#include + choke me +#endif + end +_ACEOF +if ac_fn_fc_try_compile "$LINENO"; then : + +else + ac_cv_fc_pp_srcext_F=$ac_flag; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +rm -f conftest.$ac_objext conftest.F +ac_fcflags_srcext=$ac_fcflags_pp_srcext_save + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_pp_srcext_F" >&5 +$as_echo "$ac_cv_fc_pp_srcext_F" >&6; } +if test "x$ac_cv_fc_pp_srcext_F" = xunknown; then + as_fn_error $? "Fortran could not compile preprocessed .F files" "$LINENO" 5 +else + ac_fc_srcext=F + if test "x$ac_cv_fc_pp_srcext_F" = xnone; then + ac_fcflags_srcext="" + FCFLAGS_F="" + else + ac_fcflags_srcext=$ac_cv_fc_pp_srcext_F + FCFLAGS_F=$ac_cv_fc_pp_srcext_F + fi + + +fi +ac_ext=${ac_fc_srcext-f} +ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' +ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_fc_compiler_gnu + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to define symbols for preprocessed Fortran" >&5 +$as_echo_n "checking how to define symbols for preprocessed Fortran... " >&6; } +if ${ac_cv_fc_pp_define+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_fc_pp_define_srcext_save=$ac_fc_srcext +ac_cv_fc_pp_define=unknown +ac_fc_pp_define_FCFLAGS_save=$FCFLAGS +for ac_flag in -D -WF,-D -Wp,-D -Wc,-D +do + FCFLAGS="$ac_fc_pp_define_FCFLAGS_save ${ac_flag}FOOBAR ${ac_flag}ZORK=42" + cat > conftest.$ac_ext <<_ACEOF + program main + +#ifndef FOOBAR + choke me +#endif +#if ZORK != 42 + choke me +#endif + end +_ACEOF +if ac_fn_fc_try_compile "$LINENO"; then : + ac_cv_fc_pp_define=$ac_flag +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test x"$ac_cv_fc_pp_define" != xunknown && break +done +FCFLAGS=$ac_fc_pp_define_FCFLAGS_save + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_pp_define" >&5 +$as_echo "$ac_cv_fc_pp_define" >&6; } +ac_fc_srcext=$ac_fc_pp_define_srcext_save +if test "x$ac_cv_fc_pp_define" = xunknown; then + FC_DEFINE= + coin_has_metis=no +else + FC_DEFINE=$ac_cv_fc_pp_define + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +if test $coin_has_metis = yes ; then + ac_ext=${ac_fc_srcext-f} +ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' +ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_fc_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran flag to compile preprocessed .f files" >&5 +$as_echo_n "checking for Fortran flag to compile preprocessed .f files... " >&6; } +if ${ac_cv_fc_pp_srcext_f+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=f +ac_fcflags_pp_srcext_save=$ac_fcflags_srcext +ac_fcflags_srcext= +ac_cv_fc_pp_srcext_f=unknown +case $ac_ext in #( + [fF]77) ac_try=f77-cpp-input;; #( + *) ac_try=f95-cpp-input;; +esac +for ac_flag in none -ftpp -fpp -Tf "-fpp -Tf" -xpp=fpp -Mpreprocess "-e Z" \ + -cpp -xpp=cpp -qsuffix=cpp=f "-x $ac_try" +cpp -Cpp; do + test "x$ac_flag" != xnone && ac_fcflags_srcext="$ac_flag" + cat > conftest.$ac_ext <<_ACEOF + program main + +#if 0 +#include + choke me +#endif + end +_ACEOF +if ac_fn_fc_try_compile "$LINENO"; then : + cat > conftest.$ac_ext <<_ACEOF + program main + +#if 1 +#include + choke me +#endif + end +_ACEOF +if ac_fn_fc_try_compile "$LINENO"; then : + +else + ac_cv_fc_pp_srcext_f=$ac_flag; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +rm -f conftest.$ac_objext conftest.f +ac_fcflags_srcext=$ac_fcflags_pp_srcext_save + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_pp_srcext_f" >&5 +$as_echo "$ac_cv_fc_pp_srcext_f" >&6; } +if test "x$ac_cv_fc_pp_srcext_f" = xunknown; then + coin_has_metis=no +else + ac_fc_srcext=f + if test "x$ac_cv_fc_pp_srcext_f" = xnone; then + ac_fcflags_srcext="" + FCFLAGS_f="" + else + ac_fcflags_srcext=$ac_cv_fc_pp_srcext_f + FCFLAGS_f=$ac_cv_fc_pp_srcext_f + fi + + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +if test $coin_has_metis = yes ; then + ac_ext=${ac_fc_srcext-f} +ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' +ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_fc_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran flag to compile preprocessed .f90 files" >&5 +$as_echo_n "checking for Fortran flag to compile preprocessed .f90 files... " >&6; } +if ${ac_cv_fc_pp_srcext_f90+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=f90 +ac_fcflags_pp_srcext_save=$ac_fcflags_srcext +ac_fcflags_srcext= +ac_cv_fc_pp_srcext_f90=unknown +case $ac_ext in #( + [fF]77) ac_try=f77-cpp-input;; #( + *) ac_try=f95-cpp-input;; +esac +for ac_flag in none -ftpp -fpp -Tf "-fpp -Tf" -xpp=fpp -Mpreprocess "-e Z" \ + -cpp -xpp=cpp -qsuffix=cpp=f90 "-x $ac_try" +cpp -Cpp; do + test "x$ac_flag" != xnone && ac_fcflags_srcext="$ac_flag" + cat > conftest.$ac_ext <<_ACEOF + program main + +#if 0 +#include + choke me +#endif + end +_ACEOF +if ac_fn_fc_try_compile "$LINENO"; then : + cat > conftest.$ac_ext <<_ACEOF + program main + +#if 1 +#include + choke me +#endif + end +_ACEOF +if ac_fn_fc_try_compile "$LINENO"; then : + +else + ac_cv_fc_pp_srcext_f90=$ac_flag; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +rm -f conftest.$ac_objext conftest.f90 +ac_fcflags_srcext=$ac_fcflags_pp_srcext_save + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_pp_srcext_f90" >&5 +$as_echo "$ac_cv_fc_pp_srcext_f90" >&6; } +if test "x$ac_cv_fc_pp_srcext_f90" = xunknown; then + coin_has_metis=no +else + ac_fc_srcext=f90 + if test "x$ac_cv_fc_pp_srcext_f90" = xnone; then + ac_fcflags_srcext="" + FCFLAGS_f90="" + else + ac_fcflags_srcext=$ac_cv_fc_pp_srcext_f90 + FCFLAGS_f90=$ac_cv_fc_pp_srcext_f90 + fi + + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi + if test $coin_has_metis = yes; then + COIN_HAS_METIS_TRUE= + COIN_HAS_METIS_FALSE='#' +else + COIN_HAS_METIS_TRUE='#' + COIN_HAS_METIS_FALSE= +fi + + +# MA86 and MA97 can use OpenMP +if test $coin_has_hsl_ma86$coin_has_hsl_ma97 != nono ; then + ac_ext=${ac_fc_srcext-f} +ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' +ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_fc_compiler_gnu + + + OPENMP_FCFLAGS= + # Check whether --enable-openmp was given. +if test "${enable_openmp+set}" = set; then : + enableval=$enable_openmp; +fi + + if test "$enable_openmp" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $FC option to support OpenMP" >&5 +$as_echo_n "checking for $FC option to support OpenMP... " >&6; } +if ${ac_cv_prog_fc_openmp+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat > conftest.$ac_ext <<_ACEOF + + program main + implicit none +!$ integer tid + tid = 42 + call omp_set_num_threads(2) + end + +_ACEOF +if ac_fn_fc_try_link "$LINENO"; then : + ac_cv_prog_fc_openmp='none needed' +else + ac_cv_prog_fc_openmp='unsupported' + for ac_option in -fopenmp -xopenmp -openmp -mp -omp -qsmp=omp -homp \ + -Popenmp --openmp; do + ac_save_FCFLAGS=$FCFLAGS + FCFLAGS="$FCFLAGS $ac_option" + cat > conftest.$ac_ext <<_ACEOF + + program main + implicit none +!$ integer tid + tid = 42 + call omp_set_num_threads(2) + end + +_ACEOF +if ac_fn_fc_try_link "$LINENO"; then : + ac_cv_prog_fc_openmp=$ac_option +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + FCFLAGS=$ac_save_FCFLAGS + if test "$ac_cv_prog_fc_openmp" != unsupported; then + break + fi + done +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_fc_openmp" >&5 +$as_echo "$ac_cv_prog_fc_openmp" >&6; } + case $ac_cv_prog_fc_openmp in #( + "none needed" | unsupported) + ;; #( + *) + OPENMP_FCFLAGS=$ac_cv_prog_fc_openmp ;; + esac + fi + + + FCFLAGS="$FCFLAGS $OPENMP_FCFLAGS" + HSL_LFLAGS="$HSL_LFLAGS $OPENMP_FCFLAGS" + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi + +############################################################################# +# Write the output # +############################################################################# + +ac_config_files="$ac_config_files Makefile coinhsl.pc" + + +ac_config_headers="$ac_config_headers config.h CoinHslConfig.h" + + + + if test "$BUILDTOOLS_DEBUG" = 1 ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: FINALIZE_FLAGS for HSL:" >&5 +$as_echo "$as_me: FINALIZE_FLAGS for HSL:" >&6;} + fi + HSL_LFLAGS_NOPC=$HSL_LFLAGS + + HSL_CFLAGS_NOPC=$HSL_CFLAGS + + if test -n "${HSL_PCFILES}" ; then + temp_CFLAGS=`PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG --cflags ${HSL_PCFILES}` + temp_LFLAGS=`PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG --libs ${HSL_PCFILES}` + HSL_CFLAGS="$temp_CFLAGS ${HSL_CFLAGS}" + HSL_LFLAGS="$temp_LFLAGS ${HSL_LFLAGS}" + fi + + # setup XYZ_EXPORT symbol for library users + libexport_attribute= + if test "$enable_shared" = yes ; then + case $build_os in + cygwin* | mingw* | msys* | cegcc* ) + libexport_attribute="__declspec(dllimport)" + if test "$enable_static" = yes ; then + as_fn_error $? "Cannot do DLL and static LIB builds simultaneously. Do not add --enable-static without --disable-shared." "$LINENO" 5 + fi + ;; + esac + fi + +cat >>confdefs.h <<_ACEOF +#define HSL_EXPORT $libexport_attribute +_ACEOF + + + # add -DXYZ_BUILD to XYZ_CFLAGS + HSL_CFLAGS="${HSL_CFLAGS} -DHSL_BUILD" + + # Define BUILDTOOLS_DEBUG to enable debugging output + if test "$BUILDTOOLS_DEBUG" = 1 ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: HSL_LFLAGS_NOPC: \"${HSL_LFLAGS_NOPC}\"" >&5 +$as_echo "$as_me: HSL_LFLAGS_NOPC: \"${HSL_LFLAGS_NOPC}\"" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: HSL_CFLAGS_NOPC: \"${HSL_CFLAGS_NOPC}\"" >&5 +$as_echo "$as_me: HSL_CFLAGS_NOPC: \"${HSL_CFLAGS_NOPC}\"" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: adding \"${HSL_PCFILES}\"" >&5 +$as_echo "$as_me: adding \"${HSL_PCFILES}\"" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: HSL_LFLAGS: \"${HSL_LFLAGS}\"" >&5 +$as_echo "$as_me: HSL_LFLAGS: \"${HSL_LFLAGS}\"" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: HSL_CFLAGS: \"${HSL_CFLAGS}\"" >&5 +$as_echo "$as_me: HSL_CFLAGS: \"${HSL_CFLAGS}\"" >&6;} + fi + + + + cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +if test -z "${ALWAYS_FALSE_TRUE}" && test -z "${ALWAYS_FALSE_FALSE}"; then + as_fn_error $? "conditional \"ALWAYS_FALSE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +$as_echo_n "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 +$as_echo "done" >&6; } + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then + as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${COIN_RELOCATABLE_TRUE}" && test -z "${COIN_RELOCATABLE_FALSE}"; then + as_fn_error $? "conditional \"COIN_RELOCATABLE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${COIN_HAS_F77_TRUE}" && test -z "${COIN_HAS_F77_FALSE}"; then + as_fn_error $? "conditional \"COIN_HAS_F77\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${COIN_STATIC_BUILD_TRUE}" && test -z "${COIN_STATIC_BUILD_FALSE}"; then + as_fn_error $? "conditional \"COIN_STATIC_BUILD\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${COIN_HAS_PKGCONFIG_TRUE}" && test -z "${COIN_HAS_PKGCONFIG_FALSE}"; then + as_fn_error $? "conditional \"COIN_HAS_PKGCONFIG\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${COIN_HAS_MC19_TRUE}" && test -z "${COIN_HAS_MC19_FALSE}"; then + as_fn_error $? "conditional \"COIN_HAS_MC19\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${COIN_HAS_MA27_TRUE}" && test -z "${COIN_HAS_MA27_FALSE}"; then + as_fn_error $? "conditional \"COIN_HAS_MA27\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${COIN_HAS_MA28_TRUE}" && test -z "${COIN_HAS_MA28_FALSE}"; then + as_fn_error $? "conditional \"COIN_HAS_MA28\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${COIN_HAS_MA57_TRUE}" && test -z "${COIN_HAS_MA57_FALSE}"; then + as_fn_error $? "conditional \"COIN_HAS_MA57\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${COIN_HAS_HSL_MA77_TRUE}" && test -z "${COIN_HAS_HSL_MA77_FALSE}"; then + as_fn_error $? "conditional \"COIN_HAS_HSL_MA77\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${COIN_HAS_HSL_MA86_TRUE}" && test -z "${COIN_HAS_HSL_MA86_FALSE}"; then + as_fn_error $? "conditional \"COIN_HAS_HSL_MA86\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${COIN_HAS_HSL_MA97_TRUE}" && test -z "${COIN_HAS_HSL_MA97_FALSE}"; then + as_fn_error $? "conditional \"COIN_HAS_HSL_MA97\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${COIN_HAS_HSL_MC68_TRUE}" && test -z "${COIN_HAS_HSL_MC68_FALSE}"; then + as_fn_error $? "conditional \"COIN_HAS_HSL_MC68\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${COIN_HAS_DEPSF90_TRUE}" && test -z "${COIN_HAS_DEPSF90_FALSE}"; then + as_fn_error $? "conditional \"COIN_HAS_DEPSF90\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${COIN_HAS_LAPACK_TRUE}" && test -z "${COIN_HAS_LAPACK_FALSE}"; then + as_fn_error $? "conditional \"COIN_HAS_LAPACK\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${COIN_HAS_LAPACK_TRUE}" && test -z "${COIN_HAS_LAPACK_FALSE}"; then + as_fn_error $? "conditional \"COIN_HAS_LAPACK\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${COIN_HAS_METIS_TRUE}" && test -z "${COIN_HAS_METIS_FALSE}"; then + as_fn_error $? "conditional \"COIN_HAS_METIS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${COIN_HAS_METIS_TRUE}" && test -z "${COIN_HAS_METIS_FALSE}"; then + as_fn_error $? "conditional \"COIN_HAS_METIS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by CoinHSL $as_me 2.1.0, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to . +CoinHSL home page: ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +CoinHSL config.status 2.1.0 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}" + + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' +macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' +enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' +pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' +enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' +shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`' +SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' +ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' +PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' +host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' +host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' +host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' +build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' +build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' +build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' +SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' +Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' +GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' +EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' +FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' +LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' +NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' +LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' +ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' +exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' +lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' +lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' +lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' +reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' +file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' +want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' +DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' +sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' +AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' +archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' +STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' +RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' +lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' +CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' +compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' +GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' +lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`' +nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' +lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' +lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`' +objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' +need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' +MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' +LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' +OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' +libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' +module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' +postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' +need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' +version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' +runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' +libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' +soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' +install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' +finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' +configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' +configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' +old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' +striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' +predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' +postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' +predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' +postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' +LD_F77='`$ECHO "$LD_F77" | $SED "$delay_single_quote_subst"`' +LD_FC='`$ECHO "$LD_FC" | $SED "$delay_single_quote_subst"`' +reload_flag_F77='`$ECHO "$reload_flag_F77" | $SED "$delay_single_quote_subst"`' +reload_flag_FC='`$ECHO "$reload_flag_FC" | $SED "$delay_single_quote_subst"`' +reload_cmds_F77='`$ECHO "$reload_cmds_F77" | $SED "$delay_single_quote_subst"`' +reload_cmds_FC='`$ECHO "$reload_cmds_FC" | $SED "$delay_single_quote_subst"`' +old_archive_cmds_F77='`$ECHO "$old_archive_cmds_F77" | $SED "$delay_single_quote_subst"`' +old_archive_cmds_FC='`$ECHO "$old_archive_cmds_FC" | $SED "$delay_single_quote_subst"`' +compiler_F77='`$ECHO "$compiler_F77" | $SED "$delay_single_quote_subst"`' +compiler_FC='`$ECHO "$compiler_FC" | $SED "$delay_single_quote_subst"`' +GCC_F77='`$ECHO "$GCC_F77" | $SED "$delay_single_quote_subst"`' +GCC_FC='`$ECHO "$GCC_FC" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag_F77='`$ECHO "$lt_prog_compiler_no_builtin_flag_F77" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag_FC='`$ECHO "$lt_prog_compiler_no_builtin_flag_FC" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic_F77='`$ECHO "$lt_prog_compiler_pic_F77" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic_FC='`$ECHO "$lt_prog_compiler_pic_FC" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl_F77='`$ECHO "$lt_prog_compiler_wl_F77" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl_FC='`$ECHO "$lt_prog_compiler_wl_FC" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static_F77='`$ECHO "$lt_prog_compiler_static_F77" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static_FC='`$ECHO "$lt_prog_compiler_static_FC" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o_F77='`$ECHO "$lt_cv_prog_compiler_c_o_F77" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o_FC='`$ECHO "$lt_cv_prog_compiler_c_o_FC" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc_F77='`$ECHO "$archive_cmds_need_lc_F77" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc_FC='`$ECHO "$archive_cmds_need_lc_FC" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes_F77='`$ECHO "$enable_shared_with_static_runtimes_F77" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes_FC='`$ECHO "$enable_shared_with_static_runtimes_FC" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec_F77='`$ECHO "$export_dynamic_flag_spec_F77" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec_FC='`$ECHO "$export_dynamic_flag_spec_FC" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec_F77='`$ECHO "$whole_archive_flag_spec_F77" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec_FC='`$ECHO "$whole_archive_flag_spec_FC" | $SED "$delay_single_quote_subst"`' +compiler_needs_object_F77='`$ECHO "$compiler_needs_object_F77" | $SED "$delay_single_quote_subst"`' +compiler_needs_object_FC='`$ECHO "$compiler_needs_object_FC" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds_F77='`$ECHO "$old_archive_from_new_cmds_F77" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds_FC='`$ECHO "$old_archive_from_new_cmds_FC" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds_F77='`$ECHO "$old_archive_from_expsyms_cmds_F77" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds_FC='`$ECHO "$old_archive_from_expsyms_cmds_FC" | $SED "$delay_single_quote_subst"`' +archive_cmds_F77='`$ECHO "$archive_cmds_F77" | $SED "$delay_single_quote_subst"`' +archive_cmds_FC='`$ECHO "$archive_cmds_FC" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds_F77='`$ECHO "$archive_expsym_cmds_F77" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds_FC='`$ECHO "$archive_expsym_cmds_FC" | $SED "$delay_single_quote_subst"`' +module_cmds_F77='`$ECHO "$module_cmds_F77" | $SED "$delay_single_quote_subst"`' +module_cmds_FC='`$ECHO "$module_cmds_FC" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds_F77='`$ECHO "$module_expsym_cmds_F77" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds_FC='`$ECHO "$module_expsym_cmds_FC" | $SED "$delay_single_quote_subst"`' +with_gnu_ld_F77='`$ECHO "$with_gnu_ld_F77" | $SED "$delay_single_quote_subst"`' +with_gnu_ld_FC='`$ECHO "$with_gnu_ld_FC" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag_F77='`$ECHO "$allow_undefined_flag_F77" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag_FC='`$ECHO "$allow_undefined_flag_FC" | $SED "$delay_single_quote_subst"`' +no_undefined_flag_F77='`$ECHO "$no_undefined_flag_F77" | $SED "$delay_single_quote_subst"`' +no_undefined_flag_FC='`$ECHO "$no_undefined_flag_FC" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_F77='`$ECHO "$hardcode_libdir_flag_spec_F77" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_FC='`$ECHO "$hardcode_libdir_flag_spec_FC" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator_F77='`$ECHO "$hardcode_libdir_separator_F77" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator_FC='`$ECHO "$hardcode_libdir_separator_FC" | $SED "$delay_single_quote_subst"`' +hardcode_direct_F77='`$ECHO "$hardcode_direct_F77" | $SED "$delay_single_quote_subst"`' +hardcode_direct_FC='`$ECHO "$hardcode_direct_FC" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute_F77='`$ECHO "$hardcode_direct_absolute_F77" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute_FC='`$ECHO "$hardcode_direct_absolute_FC" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L_F77='`$ECHO "$hardcode_minus_L_F77" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L_FC='`$ECHO "$hardcode_minus_L_FC" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var_F77='`$ECHO "$hardcode_shlibpath_var_F77" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var_FC='`$ECHO "$hardcode_shlibpath_var_FC" | $SED "$delay_single_quote_subst"`' +hardcode_automatic_F77='`$ECHO "$hardcode_automatic_F77" | $SED "$delay_single_quote_subst"`' +hardcode_automatic_FC='`$ECHO "$hardcode_automatic_FC" | $SED "$delay_single_quote_subst"`' +inherit_rpath_F77='`$ECHO "$inherit_rpath_F77" | $SED "$delay_single_quote_subst"`' +inherit_rpath_FC='`$ECHO "$inherit_rpath_FC" | $SED "$delay_single_quote_subst"`' +link_all_deplibs_F77='`$ECHO "$link_all_deplibs_F77" | $SED "$delay_single_quote_subst"`' +link_all_deplibs_FC='`$ECHO "$link_all_deplibs_FC" | $SED "$delay_single_quote_subst"`' +always_export_symbols_F77='`$ECHO "$always_export_symbols_F77" | $SED "$delay_single_quote_subst"`' +always_export_symbols_FC='`$ECHO "$always_export_symbols_FC" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds_F77='`$ECHO "$export_symbols_cmds_F77" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds_FC='`$ECHO "$export_symbols_cmds_FC" | $SED "$delay_single_quote_subst"`' +exclude_expsyms_F77='`$ECHO "$exclude_expsyms_F77" | $SED "$delay_single_quote_subst"`' +exclude_expsyms_FC='`$ECHO "$exclude_expsyms_FC" | $SED "$delay_single_quote_subst"`' +include_expsyms_F77='`$ECHO "$include_expsyms_F77" | $SED "$delay_single_quote_subst"`' +include_expsyms_FC='`$ECHO "$include_expsyms_FC" | $SED "$delay_single_quote_subst"`' +prelink_cmds_F77='`$ECHO "$prelink_cmds_F77" | $SED "$delay_single_quote_subst"`' +prelink_cmds_FC='`$ECHO "$prelink_cmds_FC" | $SED "$delay_single_quote_subst"`' +postlink_cmds_F77='`$ECHO "$postlink_cmds_F77" | $SED "$delay_single_quote_subst"`' +postlink_cmds_FC='`$ECHO "$postlink_cmds_FC" | $SED "$delay_single_quote_subst"`' +file_list_spec_F77='`$ECHO "$file_list_spec_F77" | $SED "$delay_single_quote_subst"`' +file_list_spec_FC='`$ECHO "$file_list_spec_FC" | $SED "$delay_single_quote_subst"`' +hardcode_action_F77='`$ECHO "$hardcode_action_F77" | $SED "$delay_single_quote_subst"`' +hardcode_action_FC='`$ECHO "$hardcode_action_FC" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs_F77='`$ECHO "$compiler_lib_search_dirs_F77" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs_FC='`$ECHO "$compiler_lib_search_dirs_FC" | $SED "$delay_single_quote_subst"`' +predep_objects_F77='`$ECHO "$predep_objects_F77" | $SED "$delay_single_quote_subst"`' +predep_objects_FC='`$ECHO "$predep_objects_FC" | $SED "$delay_single_quote_subst"`' +postdep_objects_F77='`$ECHO "$postdep_objects_F77" | $SED "$delay_single_quote_subst"`' +postdep_objects_FC='`$ECHO "$postdep_objects_FC" | $SED "$delay_single_quote_subst"`' +predeps_F77='`$ECHO "$predeps_F77" | $SED "$delay_single_quote_subst"`' +predeps_FC='`$ECHO "$predeps_FC" | $SED "$delay_single_quote_subst"`' +postdeps_F77='`$ECHO "$postdeps_F77" | $SED "$delay_single_quote_subst"`' +postdeps_FC='`$ECHO "$postdeps_FC" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path_F77='`$ECHO "$compiler_lib_search_path_F77" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path_FC='`$ECHO "$compiler_lib_search_path_FC" | $SED "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in SHELL \ +ECHO \ +PATH_SEPARATOR \ +SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +OBJDUMP \ +deplibs_check_method \ +file_magic_cmd \ +file_magic_glob \ +want_nocaseglob \ +DLLTOOL \ +sharedlib_from_linklib_cmd \ +AR \ +AR_FLAGS \ +archiver_list_spec \ +STRIP \ +RANLIB \ +CC \ +CFLAGS \ +compiler \ +lt_cv_sys_global_symbol_pipe \ +lt_cv_sys_global_symbol_to_cdecl \ +lt_cv_sys_global_symbol_to_import \ +lt_cv_sys_global_symbol_to_c_name_address \ +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +lt_cv_nm_interface \ +nm_file_list_spec \ +lt_cv_truncate_bin \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_pic \ +lt_prog_compiler_wl \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +MANIFEST_TOOL \ +DSYMUTIL \ +NMEDIT \ +LIPO \ +OTOOL \ +OTOOL64 \ +shrext_cmds \ +export_dynamic_flag_spec \ +whole_archive_flag_spec \ +compiler_needs_object \ +with_gnu_ld \ +allow_undefined_flag \ +no_undefined_flag \ +hardcode_libdir_flag_spec \ +hardcode_libdir_separator \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +install_override_mode \ +finish_eval \ +old_striplib \ +striplib \ +compiler_lib_search_dirs \ +predep_objects \ +postdep_objects \ +predeps \ +postdeps \ +compiler_lib_search_path \ +LD_F77 \ +LD_FC \ +reload_flag_F77 \ +reload_flag_FC \ +compiler_F77 \ +compiler_FC \ +lt_prog_compiler_no_builtin_flag_F77 \ +lt_prog_compiler_no_builtin_flag_FC \ +lt_prog_compiler_pic_F77 \ +lt_prog_compiler_pic_FC \ +lt_prog_compiler_wl_F77 \ +lt_prog_compiler_wl_FC \ +lt_prog_compiler_static_F77 \ +lt_prog_compiler_static_FC \ +lt_cv_prog_compiler_c_o_F77 \ +lt_cv_prog_compiler_c_o_FC \ +export_dynamic_flag_spec_F77 \ +export_dynamic_flag_spec_FC \ +whole_archive_flag_spec_F77 \ +whole_archive_flag_spec_FC \ +compiler_needs_object_F77 \ +compiler_needs_object_FC \ +with_gnu_ld_F77 \ +with_gnu_ld_FC \ +allow_undefined_flag_F77 \ +allow_undefined_flag_FC \ +no_undefined_flag_F77 \ +no_undefined_flag_FC \ +hardcode_libdir_flag_spec_F77 \ +hardcode_libdir_flag_spec_FC \ +hardcode_libdir_separator_F77 \ +hardcode_libdir_separator_FC \ +exclude_expsyms_F77 \ +exclude_expsyms_FC \ +include_expsyms_F77 \ +include_expsyms_FC \ +file_list_spec_F77 \ +file_list_spec_FC \ +compiler_lib_search_dirs_F77 \ +compiler_lib_search_dirs_FC \ +predep_objects_F77 \ +predep_objects_FC \ +postdep_objects_F77 \ +postdep_objects_FC \ +predeps_F77 \ +predeps_FC \ +postdeps_F77 \ +postdeps_FC \ +compiler_lib_search_path_F77 \ +compiler_lib_search_path_FC; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in reload_cmds \ +old_postinstall_cmds \ +old_postuninstall_cmds \ +old_archive_cmds \ +extract_expsyms_cmds \ +old_archive_from_new_cmds \ +old_archive_from_expsyms_cmds \ +archive_cmds \ +archive_expsym_cmds \ +module_cmds \ +module_expsym_cmds \ +export_symbols_cmds \ +prelink_cmds \ +postlink_cmds \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +configure_time_dlsearch_path \ +configure_time_lt_sys_library_path \ +reload_cmds_F77 \ +reload_cmds_FC \ +old_archive_cmds_F77 \ +old_archive_cmds_FC \ +old_archive_from_new_cmds_F77 \ +old_archive_from_new_cmds_FC \ +old_archive_from_expsyms_cmds_F77 \ +old_archive_from_expsyms_cmds_FC \ +archive_cmds_F77 \ +archive_cmds_FC \ +archive_expsym_cmds_F77 \ +archive_expsym_cmds_FC \ +module_cmds_F77 \ +module_cmds_FC \ +module_expsym_cmds_F77 \ +module_expsym_cmds_FC \ +export_symbols_cmds_F77 \ +export_symbols_cmds_FC \ +prelink_cmds_F77 \ +prelink_cmds_FC \ +postlink_cmds_F77 \ +postlink_cmds_FC; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +ac_aux_dir='$ac_aux_dir' + +# See if we are running on zsh, and set the options that allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + + + PACKAGE='$PACKAGE' + VERSION='$VERSION' + RM='$RM' + ofile='$ofile' + + + + + + + + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "libtoolclpatch") CONFIG_COMMANDS="$CONFIG_COMMANDS libtoolclpatch" ;; + "libtoolmingwpatch") CONFIG_COMMANDS="$CONFIG_COMMANDS libtoolmingwpatch" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "coinhsl.pc") CONFIG_FILES="$CONFIG_FILES coinhsl.pc" ;; + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "CoinHslConfig.h") CONFIG_HEADERS="$CONFIG_HEADERS CoinHslConfig.h" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + # TODO: see whether this extra hack can be removed once we start + # requiring Autoconf 2.70 or later. + case $CONFIG_FILES in #( + *\'*) : + eval set x "$CONFIG_FILES" ;; #( + *) : + set x $CONFIG_FILES ;; #( + *) : + ;; +esac + shift + # Used to flag and report bootstrapping failures. + am_rc=0 + for am_mf + do + # Strip MF so we end up with the name of the file. + am_mf=`$as_echo "$am_mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile which includes + # dependency-tracking related rules and includes. + # Grep'ing the whole file directly is not great: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ + || continue + am_dirpart=`$as_dirname -- "$am_mf" || +$as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$am_mf" : 'X\(//\)[^/]' \| \ + X"$am_mf" : 'X\(//\)$' \| \ + X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$am_mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + am_filepart=`$as_basename -- "$am_mf" || +$as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ + X"$am_mf" : 'X\(//\)$' \| \ + X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$am_mf" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + { echo "$as_me:$LINENO: cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles" >&5 + (cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } || am_rc=$? + done + if test $am_rc -ne 0; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "Something went wrong bootstrapping makefile fragments + for automatic dependency tracking. If GNU make was not used, consider + re-running the configure script with MAKE=\"gmake\" (or whatever is + necessary). You can also try re-running configure with the + '--disable-dependency-tracking' option to at least be able to build + the package (albeit without support for automatic dependency tracking). +See \`config.log' for more details" "$LINENO" 5; } + fi + { am_dirpart=; unset am_dirpart;} + { am_filepart=; unset am_filepart;} + { am_mf=; unset am_mf;} + { am_rc=; unset am_rc;} + rm -f conftest-deps.mk +} + ;; + "libtool":C) + + # See if we are running on zsh, and set the options that allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST + fi + + cfgfile=${ofile}T + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL +# Generated automatically by $as_me ($PACKAGE) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +# Copyright (C) 2014 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program or library that is built +# using GNU Libtool, you may include this file under the same +# distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +# The names of the tagged configurations supported by this script. +available_tags='F77 FC ' + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + +# ### BEGIN LIBTOOL CONFIG + +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# Shared archive member basename,for filename based shared library versioning on AIX. +shared_archive_member_spec=$shared_archive_member_spec + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that protects backslashes. +ECHO=$lt_ECHO + +# The PATH separator for the build system. +PATH_SEPARATOR=$lt_PATH_SEPARATOR + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="\$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP=$lt_GREP + +# An ERE matcher. +EGREP=$lt_EGREP + +# A literal string matcher. +FGREP=$lt_FGREP + +# A BSD- or MS-compatible name lister. +NM=$lt_NM + +# Whether we need soft or hard links. +LN_S=$lt_LN_S + +# What is the maximum length of a command? +max_cmd_len=$max_cmd_len + +# Object file suffix (normally "o"). +objext=$ac_objext + +# Executable file suffix (normally ""). +exeext=$exeext + +# whether the shell understands "unset". +lt_unset=$lt_unset + +# turn spaces into newlines. +SP2NL=$lt_lt_SP2NL + +# turn newlines into spaces. +NL2SP=$lt_lt_NL2SP + +# convert \$build file names to \$host format. +to_host_file_cmd=$lt_cv_to_host_file_cmd + +# convert \$build files to toolchain format. +to_tool_file_cmd=$lt_cv_to_tool_file_cmd + +# An object symbol dumper. +OBJDUMP=$lt_OBJDUMP + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method = "file_magic". +file_magic_cmd=$lt_file_magic_cmd + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob=$lt_file_magic_glob + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob=$lt_want_nocaseglob + +# DLL creation program. +DLLTOOL=$lt_DLLTOOL + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd + +# The archiver. +AR=$lt_AR + +# Flags to create an archive. +AR_FLAGS=$lt_AR_FLAGS + +# How to feed a file listing to the archiver. +archiver_list_spec=$lt_archiver_list_spec + +# A symbol stripping program. +STRIP=$lt_STRIP + +# Commands used to install an old-style archive. +RANLIB=$lt_RANLIB +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=$lock_old_archive_extraction + +# A C compiler. +LTCC=$lt_CC + +# LTCC compiler flags. +LTCFLAGS=$lt_CFLAGS + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm into a list of symbols to manually relocate. +global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + +# The name lister interface. +nm_interface=$lt_lt_cv_nm_interface + +# Specify filename containing input files for \$NM. +nm_file_list_spec=$lt_nm_file_list_spec + +# The root where to search for dependent libraries,and where our libraries should be installed. +lt_sysroot=$lt_sysroot + +# Command to truncate a binary pipe. +lt_truncate_bin=$lt_lt_cv_truncate_bin + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=$MAGIC_CMD + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Manifest tool. +MANIFEST_TOOL=$lt_MANIFEST_TOOL + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL=$lt_DSYMUTIL + +# Tool to change global to local symbols on Mac OS X. +NMEDIT=$lt_NMEDIT + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO=$lt_LIPO + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL=$lt_OTOOL + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=$lt_OTOOL64 + +# Old archive suffix (normally "a"). +libext=$libext + +# Shared library suffix (normally ".so"). +shrext_cmds=$lt_shrext_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink=$lt_variables_saved_for_relink + +# Do we need the "lib" prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Library versioning type. +version_type=$version_type + +# Shared library runtime path variable. +runpath_var=$runpath_var + +# Shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Permission mode override for installation of shared libraries. +install_override_mode=$lt_install_override_mode + +# Command to use after installation of a shared archive. +postinstall_cmds=$lt_postinstall_cmds + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval=$lt_finish_eval + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Compile-time system search path for libraries. +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Detected run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path + +# Explicit LT_SYS_LIBRARY_PATH set during ./configure time. +configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + + +# The linker used to build libraries. +LD=$lt_LD + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds + +# A language specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU compiler? +with_gcc=$GCC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \$shlibpath_var if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects +postdep_objects=$lt_postdep_objects +predeps=$lt_predeps +postdeps=$lt_postdeps + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + +# ### END LIBTOOL CONFIG + +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + +ltmain=$ac_aux_dir/ltmain.sh + + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + + cat <<_LT_EOF >> "$ofile" + +# ### BEGIN LIBTOOL TAG CONFIG: F77 + +# The linker used to build libraries. +LD=$lt_LD_F77 + +# How to create reloadable object files. +reload_flag=$lt_reload_flag_F77 +reload_cmds=$lt_reload_cmds_F77 + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds_F77 + +# A language specific compiler. +CC=$lt_compiler_F77 + +# Is the compiler the GNU compiler? +with_gcc=$GCC_F77 + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77 + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_F77 + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_F77 + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_F77 + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77 + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_F77 + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77 + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77 + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77 + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object_F77 + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77 + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77 + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds_F77 +archive_expsym_cmds=$lt_archive_expsym_cmds_F77 + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds_F77 +module_expsym_cmds=$lt_module_expsym_cmds_F77 + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld_F77 + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_F77 + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_F77 + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77 + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77 + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct_F77 + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \$shlibpath_var if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute_F77 + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L_F77 + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_F77 + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic_F77 + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath_F77 + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_F77 + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols_F77 + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_F77 + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_F77 + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_F77 + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds_F77 + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds_F77 + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec_F77 + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_F77 + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_F77 + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects_F77 +postdep_objects=$lt_postdep_objects_F77 +predeps=$lt_predeps_F77 +postdeps=$lt_postdeps_F77 + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_F77 + +# ### END LIBTOOL TAG CONFIG: F77 +_LT_EOF + + + cat <<_LT_EOF >> "$ofile" + +# ### BEGIN LIBTOOL TAG CONFIG: FC + +# The linker used to build libraries. +LD=$lt_LD_FC + +# How to create reloadable object files. +reload_flag=$lt_reload_flag_FC +reload_cmds=$lt_reload_cmds_FC + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds_FC + +# A language specific compiler. +CC=$lt_compiler_FC + +# Is the compiler the GNU compiler? +with_gcc=$GCC_FC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_FC + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_FC + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_FC + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_FC + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_FC + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_FC + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_FC + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_FC + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_FC + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object_FC + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_FC + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_FC + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds_FC +archive_expsym_cmds=$lt_archive_expsym_cmds_FC + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds_FC +module_expsym_cmds=$lt_module_expsym_cmds_FC + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld_FC + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_FC + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_FC + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_FC + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_FC + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct_FC + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \$shlibpath_var if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute_FC + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L_FC + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_FC + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic_FC + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath_FC + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_FC + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols_FC + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_FC + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_FC + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_FC + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds_FC + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds_FC + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec_FC + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_FC + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_FC + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects_FC +postdep_objects=$lt_postdep_objects_FC +predeps=$lt_predeps_FC +postdeps=$lt_postdeps_FC + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_FC + +# ### END LIBTOOL TAG CONFIG: FC +_LT_EOF + + ;; + "libtoolclpatch":C) sed -e '/^deplibs_check_method/s/.*/deplibs_check_method="pass_all"/g' \ + \ + -e '/func_append old_deplibs/s/\(.*\)/case $arg in *mkl_*.lib) ;; *) \1 ;; esac/g' \ + -e '/static library .deplib is not portable/a case $deplib in *mkl_*.lib) newdependency_libs="$deplib $newdependency_libs" ;; esac' \ + libtool > libtool.tmp + mv libtool.tmp libtool + chmod 755 libtool ;; + "libtoolmingwpatch":C) sed -e '/^deplibs_check_method/s/.*/deplibs_check_method="pass_all"/g' libtool > libtool.tmp + mv libtool.tmp libtool + chmod 755 libtool ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + + + #AC_MSG_NOTICE([In case of trouble, first consult the troubleshooting page at https://projects.coin-or.org/BuildTools/wiki/user-troubleshooting]) + { $as_echo "$as_me:${as_lineno-$LINENO}: Configuration of $PACKAGE_NAME successful" >&5 +$as_echo "$as_me: Configuration of $PACKAGE_NAME successful" >&6;} + diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..1af344d --- /dev/null +++ b/configure.ac @@ -0,0 +1,177 @@ +# Copyright (C) 2006, 2009 International Business Machines. +# All Rights Reserved. +# This file is distributed under the Eclipse Public License. + +# Author: Andreas Waechter IBM 2006-04-13 + +############################################################################# +# Names and other basic things # +############################################################################# + +AC_PREREQ(2.59) + +AC_INIT([CoinHSL],[2.1.0],[https://github.com/coin-or-tools/ThirdParty-HSL/issues/new],,[https://github.com/coin-or-tools/ThirdParty-HSL]) + +AC_COPYRIGHT([ +Copyright 2006, 2009 International Business Machines and others. +All Rights Reserved. +This file is part of the open source package BuildTools which is distributed +under the Eclipse Public License.]) + +# List one file in the package so that the configure script can test +# whether the package is actually there +AC_CONFIG_SRCDIR([coinhsl/common/deps.f]) + +AC_COIN_INITIALIZE + +############################################################################# +# Standard build tool stuff # +############################################################################# + +# Get the name of the C compiler (for metis_adapter.c) +AC_COIN_PROG_CC + +# Get the name of the Fortran 77 compiler and appropriate compiler options +AC_COIN_PROG_F77 +if test -z "$F77" ; then + AC_MSG_ERROR([No Fortran compiler.]) +fi +AC_COIN_F77_SETUP + +# Get the name of the Fortran 90 compiler and appropriate compiler options +AC_COIN_PROG_FC + +# Initialize libtool +AC_COIN_PROG_LIBTOOL(no-win32-dll) + +# Add FLIBS to HSL_LFLAGS, so that they get into the .pc files section for static builds +HSL_LFLAGS="$HSL_LFLAGS $FLIBS" + +############################################################################# +# Find out which files are available # +############################################################################# + +# do this unconditionally to make sure COIN_HAS_PKGCONFIG is also defined if no >= MA57 +AC_COIN_HAS_PKGCONFIG + +AC_DEFUN([MY_CHECK_HSLFILE], +[AC_MSG_CHECKING([for m4_toupper(m4_bpatsubst($1, hsl_))]) +if test -r "$srcdir/coinhsl/$1/$1d.f" ; then + AC_DEFINE(m4_toupper(COINHSL_HAS_$1), [1], Define to 1 if m4_toupper(m4_bpatsubst($1, hsl_)) is available.) + coin_has_$1=yes +else + coin_has_$1=no +fi +AC_MSG_RESULT($coin_has_$1) +AM_CONDITIONAL(m4_toupper(COIN_HAS_$1),[test $coin_has_$1 = yes]) +]) + +AC_DEFUN([MY_CHECK_HSLFILE_F90], +[if test -n "$FC" ; then + AC_MSG_CHECKING([for m4_toupper(m4_bpatsubst($1, hsl_))]) + if test -r "$srcdir/coinhsl/$1/$1d.f90" ; then + AC_DEFINE([COINHSL_HAS_]m4_toupper(m4_bpatsubst($1, hsl_)), [1], Define to 1 if m4_toupper(m4_bpatsubst($1, hsl_)) is available.) + coin_has_$1=yes + else + coin_has_$1=no + fi + AC_MSG_RESULT($coin_has_$1) +else + coin_has_$1=no +fi +AM_CONDITIONAL(m4_toupper(COIN_HAS_$1),[test $coin_has_$1 = yes]) +]) + +MY_CHECK_HSLFILE(mc19) +MY_CHECK_HSLFILE(ma27) +MY_CHECK_HSLFILE(ma28) +MY_CHECK_HSLFILE(ma57) +MY_CHECK_HSLFILE_F90(hsl_ma77) +MY_CHECK_HSLFILE_F90(hsl_ma86) +MY_CHECK_HSLFILE_F90(hsl_ma97) + +coin_has_hsl_mc68=no +if test -n "$FC"; then + AC_MSG_CHECKING([for C interface to MC68]) + if test -r "$srcdir/coinhsl/hsl_mc68/C/hsl_mc68i_ciface.f90" ; then + AC_DEFINE(COINHSL_HAS_MC68, [1], Define to 1 if MC68 is available.) + coin_has_hsl_mc68=yes + fi + AC_MSG_RESULT($coin_has_hsl_mc68) +fi +AM_CONDITIONAL(COIN_HAS_HSL_MC68,[test $coin_has_hsl_mc68 = yes]) + +# the F90 codes depend on deps90.f90 +coin_has_depsf90=no +if test $coin_has_hsl_mc68$coin_has_hsl_ma77$coin_has_hsl_ma86$coin_has_hsl_ma97 != nononono ; then + AC_MSG_CHECKING([for deps90.f90]) + if test -r "$srcdir/coinhsl/common/deps90.f90" ; then + coin_has_depsf90=yes + fi + AC_MSG_RESULT($coin_has_depsf90) + if test $coin_has_depsf90 = no; then + AC_MSG_ERROR([Required file common/deps90.f90 not found]) + fi +fi +AM_CONDITIONAL(COIN_HAS_DEPSF90,[test $coin_has_depsf90 = yes]) + +# MA57, MA77, and MA86 require BLAS, MA97 requires LAPACK +if test $coin_has_ma57$coin_has_hsl_ma77$coin_has_hsl_ma86$coin_has_hsl_ma97 != nononono ; then + AC_COIN_CHK_LAPACK(HSL) + if test $coin_has_lapack != yes ; then + AC_MSG_ERROR([Required package LAPACK not found.]) + fi +else + AM_CONDITIONAL(COIN_HAS_LAPACK, [false]) +fi + +# MA57, MA77, MA97, and MC68 can use Metis +if test $coin_has_ma57$coin_has_hsl_ma77$coin_has_hsl_ma97$coin_has_hsl_mc68 != nononono ; then + AC_COIN_CHK_LIBM(METISCHECK) + AC_LANG_PUSH(Fortran) + AC_COIN_CHK_LIB(Metis,[HSL],[-lmetis "$METISCHECK_LFLAGS"],[],[],[metis_nodend]) + AC_LANG_POP(Fortran) +else + coin_has_metis=no +fi + +if test $coin_has_metis = yes ; then + AC_LANG_PUSH(C) + coin_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $metis_cflags" + AC_CHECK_HEADER([metis.h],,[coin_has_metis=no]) + CPPFLAGS="$coin_CPPFLAGS" + AC_LANG_POP(C) +fi + +# check whether we can redefine metis_nodend to coinmetis_nodend from metis_adapter +if test $coin_has_metis = yes ; then + AC_FC_PP_DEFINE([],[coin_has_metis=no]) +fi +if test $coin_has_metis = yes ; then + AC_FC_PP_SRCEXT(f,[],[coin_has_metis=no]) +fi +if test $coin_has_metis = yes ; then + AC_FC_PP_SRCEXT(f90,[],[coin_has_metis=no]) +fi +AM_CONDITIONAL(COIN_HAS_METIS, [test $coin_has_metis = yes]) + +# MA86 and MA97 can use OpenMP +if test $coin_has_hsl_ma86$coin_has_hsl_ma97 != nono ; then + AC_LANG_PUSH(Fortran) + AC_OPENMP + FCFLAGS="$FCFLAGS $OPENMP_FCFLAGS" + HSL_LFLAGS="$HSL_LFLAGS $OPENMP_FCFLAGS" + AC_LANG_POP(Fortran) +fi + +############################################################################# +# Write the output # +############################################################################# + +AC_CONFIG_FILES([Makefile coinhsl.pc]) + +AC_CONFIG_HEADER(config.h CoinHslConfig.h) + +AC_COIN_FINALIZE_FLAGS([HSL]) +AC_COIN_FINALIZE diff --git a/depcomp b/depcomp new file mode 100755 index 0000000..6b39162 --- /dev/null +++ b/depcomp @@ -0,0 +1,791 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2018-03-07.03; # UTC + +# Copyright (C) 1999-2020 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by 'PROGRAMS ARGS'. + object Object file output by 'PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputting dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +# Get the directory component of the given path, and save it in the +# global variables '$dir'. Note that this directory component will +# be either empty or ending with a '/' character. This is deliberate. +set_dir_from () +{ + case $1 in + */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; + *) dir=;; + esac +} + +# Get the suffix-stripped basename of the given path, and save it the +# global variable '$base'. +set_base_from () +{ + base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` +} + +# If no dependency file was actually created by the compiler invocation, +# we still have to create a dummy depfile, to avoid errors with the +# Makefile "include basename.Plo" scheme. +make_dummy_depfile () +{ + echo "#dummy" > "$depfile" +} + +# Factor out some common post-processing of the generated depfile. +# Requires the auxiliary global variable '$tmpdepfile' to be set. +aix_post_process_depfile () +{ + # If the compiler actually managed to produce a dependency file, + # post-process it. + if test -f "$tmpdepfile"; then + # Each line is of the form 'foo.o: dependency.h'. + # Do two passes, one to just change these to + # $object: dependency.h + # and one to simply output + # dependency.h: + # which is needed to avoid the deleted-header problem. + { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" + sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" + } > "$depfile" + rm -f "$tmpdepfile" + else + make_dummy_depfile + fi +} + +# A tabulation character. +tab=' ' +# A newline character. +nl=' +' +# Character ranges might be problematic outside the C locale. +# These definitions help. +upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ +lower=abcdefghijklmnopqrstuvwxyz +digits=0123456789 +alpha=${upper}${lower} + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Avoid interferences from the environment. +gccflag= dashmflag= + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvisualcpp +fi + +if test "$depmode" = msvc7msys; then + # This is just like msvc7 but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvc7 +fi + +if test "$depmode" = xlc; then + # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. + gccflag=-qmakedep=gcc,-MF + depmode=gcc +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. +## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. +## (see the conditional assignment to $gccflag above). +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). Also, it might not be +## supported by the other compilers which use the 'gcc' depmode. +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The second -e expression handles DOS-style file names with drive + # letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the "deleted header file" problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. +## Some versions of gcc put a space before the ':'. On the theory +## that the space means something, we add a space to the output as +## well. hp depmode also adds that space, but also prefixes the VPATH +## to the object. Take care to not repeat it in the output. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like '#:fec' to the end of the + # dependency line. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ + | tr "$nl" ' ' >> "$depfile" + echo >> "$depfile" + # The second pass generates a dummy entry for each header file. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" + ;; + +xlc) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts '$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + aix_post_process_depfile + ;; + +tcc) + # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 + # FIXME: That version still under development at the moment of writing. + # Make that this statement remains true also for stable, released + # versions. + # It will wrap lines (doesn't matter whether long or short) with a + # trailing '\', as in: + # + # foo.o : \ + # foo.c \ + # foo.h \ + # + # It will put a trailing '\' even on the last line, and will use leading + # spaces rather than leading tabs (at least since its commit 0394caf7 + # "Emit spaces for -MD"). + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. + # We have to change lines of the first kind to '$object: \'. + sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" + # And for each line of the second kind, we have to emit a 'dep.h:' + # dummy dependency, to avoid the deleted-header problem. + sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" + rm -f "$tmpdepfile" + ;; + +## The order of this option in the case statement is important, since the +## shell code in configure will try each of these formats in the order +## listed in this file. A plain '-MD' option would be understood by many +## compilers, so we must ensure this comes after the gcc and icc options. +pgcc) + # Portland's C compiler understands '-MD'. + # Will always output deps to 'file.d' where file is the root name of the + # source file under compilation, even if file resides in a subdirectory. + # The object file name does not affect the name of the '.d' file. + # pgcc 10.2 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using '\' : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + set_dir_from "$object" + # Use the source, not the object, to determine the base name, since + # that's sadly what pgcc will do too. + set_base_from "$source" + tmpdepfile=$base.d + + # For projects that build the same source file twice into different object + # files, the pgcc approach of using the *source* file root name can cause + # problems in parallel builds. Use a locking strategy to avoid stomping on + # the same $tmpdepfile. + lockdir=$base.d-lock + trap " + echo '$0: caught signal, cleaning up...' >&2 + rmdir '$lockdir' + exit 1 + " 1 2 13 15 + numtries=100 + i=$numtries + while test $i -gt 0; do + # mkdir is a portable test-and-set. + if mkdir "$lockdir" 2>/dev/null; then + # This process acquired the lock. + "$@" -MD + stat=$? + # Release the lock. + rmdir "$lockdir" + break + else + # If the lock is being held by a different process, wait + # until the winning process is done or we timeout. + while test -d "$lockdir" && test $i -gt 0; do + sleep 1 + i=`expr $i - 1` + done + fi + i=`expr $i - 1` + done + trap - 1 2 13 15 + if test $i -le 0; then + echo "$0: failed to acquire lock after $numtries attempts" >&2 + echo "$0: check lockdir '$lockdir'" >&2 + exit 1 + fi + + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" + # Add 'dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in 'foo.d' instead, so we check for that too. + # Subdirectories are respected. + set_dir_from "$object" + set_base_from "$object" + + if test "$libtool" = yes; then + # Libtool generates 2 separate objects for the 2 libraries. These + # two compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir$base.o.d # libtool 1.5 + tmpdepfile2=$dir.libs/$base.o.d # Likewise. + tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + # Same post-processing that is required for AIX mode. + aix_post_process_depfile + ;; + +msvc7) + if test "$libtool" = yes; then + showIncludes=-Wc,-showIncludes + else + showIncludes=-showIncludes + fi + "$@" $showIncludes > "$tmpdepfile" + stat=$? + grep -v '^Note: including file: ' "$tmpdepfile" + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The first sed program below extracts the file names and escapes + # backslashes for cygpath. The second sed program outputs the file + # name when reading, but also accumulates all include files in the + # hold buffer in order to output them again at the end. This only + # works with sed implementations that can handle large buffers. + sed < "$tmpdepfile" -n ' +/^Note: including file: *\(.*\)/ { + s//\1/ + s/\\/\\\\/g + p +}' | $cygpath_u | sort -u | sed -n ' +s/ /\\ /g +s/\(.*\)/'"$tab"'\1 \\/p +s/.\(.*\) \\/\1:/ +H +$ { + s/.*/'"$tab"'/ + G + p +}' >> "$depfile" + echo >> "$depfile" # make sure the fragment doesn't end with a backslash + rm -f "$tmpdepfile" + ;; + +msvc7msys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for ':' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. + "$@" $dashmflag | + sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this sed invocation + # correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no eat=no + for arg + do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + if test $eat = yes; then + eat=no + continue + fi + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix=`echo "$object" | sed 's/^.*\././'` + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + # makedepend may prepend the VPATH from the source file name to the object. + # No need to regex-escape $object, excess matching of '.' is harmless. + sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process the last invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed '1,2d' "$tmpdepfile" \ + | tr ' ' "$nl" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E \ + | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + | sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + IFS=" " + for arg + do + case "$arg" in + -o) + shift + ;; + $object) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" + echo "$tab" >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/install-sh b/install-sh new file mode 100755 index 0000000..20d8b2e --- /dev/null +++ b/install-sh @@ -0,0 +1,529 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2018-03-11.20; # UTC + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# 'make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +tab=' ' +nl=' +' +IFS=" $tab$nl" + +# Set DOITPROG to "echo" to test this script. + +doit=${DOITPROG-} +doit_exec=${doit:-exec} + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +is_target_a_directory=possibly + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) + is_target_a_directory=always + dst_arg=$2 + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + shift;; + + -T) is_target_a_directory=never;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +# We allow the use of options -d and -T together, by making -d +# take the precedence; this is for compatibility with GNU install. + +if test -n "$dir_arg"; then + if test -n "$dst_arg"; then + echo "$0: target directory not allowed when installing a directory." >&2 + exit 1 + fi +fi + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call 'install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + if test $# -gt 1 || test "$is_target_a_directory" = always; then + if test ! -d "$dst_arg"; then + echo "$0: $dst_arg: Is not a directory." >&2 + exit 1 + fi + fi +fi + +if test -z "$dir_arg"; then + do_exit='(exit $ret); exit $ret' + trap "ret=129; $do_exit" 1 + trap "ret=130; $do_exit" 2 + trap "ret=141; $do_exit" 13 + trap "ret=143; $do_exit" 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names problematic for 'test' and other utilities. + case $src in + -* | [=\(\)!]) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + dst=$dst_arg + + # If destination is a directory, append the input filename. + if test -d "$dst"; then + if test "$is_target_a_directory" = never; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dstbase=`basename "$src"` + case $dst in + */) dst=$dst$dstbase;; + *) dst=$dst/$dstbase;; + esac + dstdir_status=0 + else + dstdir=`dirname "$dst"` + test -d "$dstdir" + dstdir_status=$? + fi + fi + + case $dstdir in + */) dstdirslash=$dstdir;; + *) dstdirslash=$dstdir/;; + esac + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + # Note that $RANDOM variable is not portable (e.g. dash); Use it + # here however when possible just to lower collision chance. + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + + trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 + + # Because "mkdir -p" follows existing symlinks and we likely work + # directly in world-writeable /tmp, make sure that the '$tmpdir' + # directory is successfully created first before we actually test + # 'mkdir -p' feature. + if (umask $mkdir_umask && + $mkdirprog $mkdir_mode "$tmpdir" && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + test_tmpdir="$tmpdir/a" + ls_ld_tmpdir=`ls -ld "$test_tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + [-=\(\)!]*) prefix='./';; + *) prefix='';; + esac + + oIFS=$IFS + IFS=/ + set -f + set fnord $dstdir + shift + set +f + IFS=$oIFS + + prefixes= + + for d + do + test X"$d" = X && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=${dstdirslash}_inst.$$_ + rmtmp=${dstdirslash}_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && + { test -z "$stripcmd" || { + # Create $dsttmp read-write so that cp doesn't create it read-only, + # which would cause strip to fail. + if test -z "$doit"; then + : >"$dsttmp" # No need to fork-exec 'touch'. + else + $doit touch "$dsttmp" + fi + } + } && + $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + set +f && + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/ltmain.sh b/ltmain.sh new file mode 100755 index 0000000..0f0a2da --- /dev/null +++ b/ltmain.sh @@ -0,0 +1,11147 @@ +#! /bin/sh +## DO NOT EDIT - This file generated from ./build-aux/ltmain.in +## by inline-source v2014-01-03.01 + +# libtool (GNU libtool) 2.4.6 +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +PROGRAM=libtool +PACKAGE=libtool +VERSION=2.4.6 +package_revision=2.4.6 + + +## ------ ## +## Usage. ## +## ------ ## + +# Run './libtool --help' for help with using this script from the +# command line. + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# After configure completes, it has a better idea of some of the +# shell tools we need than the defaults used by the functions shared +# with bootstrap, so set those here where they can still be over- +# ridden by the user, but otherwise take precedence. + +: ${AUTOCONF="autoconf"} +: ${AUTOMAKE="automake"} + + +## -------------------------- ## +## Source external libraries. ## +## -------------------------- ## + +# Much of our low-level functionality needs to be sourced from external +# libraries, which are installed to $pkgauxdir. + +# Set a version string for this script. +scriptversion=2015-01-20.17; # UTC + +# General shell script boiler plate, and helper functions. +# Written by Gary V. Vaughan, 2004 + +# Copyright (C) 2004-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. + +# As a special exception to the GNU General Public License, if you distribute +# this file as part of a program or library that is built using GNU Libtool, +# you may include this file under the same distribution terms that you use +# for the rest of that program. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# Evaluate this file near the top of your script to gain access to +# the functions and variables defined here: +# +# . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh +# +# If you need to override any of the default environment variable +# settings, do that before evaluating this file. + + +## -------------------- ## +## Shell normalisation. ## +## -------------------- ## + +# Some shells need a little help to be as Bourne compatible as possible. +# Before doing anything else, make sure all that help has been provided! + +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac +fi + +# NLS nuisances: We save the old values in case they are required later. +_G_user_locale= +_G_safe_locale= +for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test set = \"\${$_G_var+set}\"; then + save_$_G_var=\$$_G_var + $_G_var=C + export $_G_var + _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" + _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" + fi" +done + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Make sure IFS has a sensible default +sp=' ' +nl=' +' +IFS="$sp $nl" + +# There are apparently some retarded systems that use ';' as a PATH separator! +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + + +## ------------------------- ## +## Locate command utilities. ## +## ------------------------- ## + + +# func_executable_p FILE +# ---------------------- +# Check that FILE is an executable regular file. +func_executable_p () +{ + test -f "$1" && test -x "$1" +} + + +# func_path_progs PROGS_LIST CHECK_FUNC [PATH] +# -------------------------------------------- +# Search for either a program that responds to --version with output +# containing "GNU", or else returned by CHECK_FUNC otherwise, by +# trying all the directories in PATH with each of the elements of +# PROGS_LIST. +# +# CHECK_FUNC should accept the path to a candidate program, and +# set $func_check_prog_result if it truncates its output less than +# $_G_path_prog_max characters. +func_path_progs () +{ + _G_progs_list=$1 + _G_check_func=$2 + _G_PATH=${3-"$PATH"} + + _G_path_prog_max=0 + _G_path_prog_found=false + _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} + for _G_dir in $_G_PATH; do + IFS=$_G_save_IFS + test -z "$_G_dir" && _G_dir=. + for _G_prog_name in $_G_progs_list; do + for _exeext in '' .EXE; do + _G_path_prog=$_G_dir/$_G_prog_name$_exeext + func_executable_p "$_G_path_prog" || continue + case `"$_G_path_prog" --version 2>&1` in + *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; + *) $_G_check_func $_G_path_prog + func_path_progs_result=$func_check_prog_result + ;; + esac + $_G_path_prog_found && break 3 + done + done + done + IFS=$_G_save_IFS + test -z "$func_path_progs_result" && { + echo "no acceptable sed could be found in \$PATH" >&2 + exit 1 + } +} + + +# We want to be able to use the functions in this file before configure +# has figured out where the best binaries are kept, which means we have +# to search for them ourselves - except when the results are already set +# where we skip the searches. + +# Unless the user overrides by setting SED, search the path for either GNU +# sed, or the sed that truncates its output the least. +test -z "$SED" && { + _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for _G_i in 1 2 3 4 5 6 7; do + _G_sed_script=$_G_sed_script$nl$_G_sed_script + done + echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed + _G_sed_script= + + func_check_prog_sed () + { + _G_path_prog=$1 + + _G_count=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo '' >> conftest.nl + "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin + rm -f conftest.sed + SED=$func_path_progs_result +} + + +# Unless the user overrides by setting GREP, search the path for either GNU +# grep, or the grep that truncates its output the least. +test -z "$GREP" && { + func_check_prog_grep () + { + _G_path_prog=$1 + + _G_count=0 + _G_path_prog_max=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo 'GREP' >> conftest.nl + "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin + GREP=$func_path_progs_result +} + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# All uppercase variable names are used for environment variables. These +# variables can be overridden by the user before calling a script that +# uses them if a suitable command of that name is not already available +# in the command search PATH. + +: ${CP="cp -f"} +: ${ECHO="printf %s\n"} +: ${EGREP="$GREP -E"} +: ${FGREP="$GREP -F"} +: ${LN_S="ln -s"} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} + + +## -------------------- ## +## Useful sed snippets. ## +## -------------------- ## + +sed_dirname='s|/[^/]*$||' +sed_basename='s|^.*/||' + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='s|\([`"$\\]\)|\\\1|g' + +# Same as above, but do not quote variable references. +sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution that turns a string into a regex matching for the +# string literally. +sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' + +# Sed substitution that converts a w32 file name or path +# that contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-'\' parameter expansions in output of sed_double_quote_subst that +# were '\'-ed in input to the same. If an odd number of '\' preceded a +# '$' in input to sed_double_quote_subst, that '$' was protected from +# expansion. Since each input '\' is now two '\'s, look for any number +# of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. +_G_bs='\\' +_G_bs2='\\\\' +_G_bs4='\\\\\\\\' +_G_dollar='\$' +sed_double_backslash="\ + s/$_G_bs4/&\\ +/g + s/^$_G_bs2$_G_dollar/$_G_bs&/ + s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g + s/\n//g" + + +## ----------------- ## +## Global variables. ## +## ----------------- ## + +# Except for the global variables explicitly listed below, the following +# functions in the '^func_' namespace, and the '^require_' namespace +# variables initialised in the 'Resource management' section, sourcing +# this file will not pollute your global namespace with anything +# else. There's no portable way to scope variables in Bourne shell +# though, so actually running these functions will sometimes place +# results into a variable named after the function, and often use +# temporary variables in the '^_G_' namespace. If you are careful to +# avoid using those namespaces casually in your sourcing script, things +# should continue to work as you expect. And, of course, you can freely +# overwrite any of the functions or variables defined here before +# calling anything to customize them. + +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +# Allow overriding, eg assuming that you follow the convention of +# putting '$debug_cmd' at the start of all your functions, you can get +# bash to show function call trace with: +# +# debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name +debug_cmd=${debug_cmd-":"} +exit_cmd=: + +# By convention, finish your script with: +# +# exit $exit_status +# +# so that you can set exit_status to non-zero if you want to indicate +# something went wrong during execution without actually bailing out at +# the point of failure. +exit_status=$EXIT_SUCCESS + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath=$0 + +# The name of this program. +progname=`$ECHO "$progpath" |$SED "$sed_basename"` + +# Make sure we have an absolute progpath for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` + progdir=`cd "$progdir" && pwd` + progpath=$progdir/$progname + ;; + *) + _G_IFS=$IFS + IFS=${PATH_SEPARATOR-:} + for progdir in $PATH; do + IFS=$_G_IFS + test -x "$progdir/$progname" && break + done + IFS=$_G_IFS + test -n "$progdir" || progdir=`pwd` + progpath=$progdir/$progname + ;; +esac + + +## ----------------- ## +## Standard options. ## +## ----------------- ## + +# The following options affect the operation of the functions defined +# below, and should be set appropriately depending on run-time para- +# meters passed on the command line. + +opt_dry_run=false +opt_quiet=false +opt_verbose=false + +# Categories 'all' and 'none' are always available. Append any others +# you will pass as the first argument to func_warning from your own +# code. +warning_categories= + +# By default, display warnings according to 'opt_warning_types'. Set +# 'warning_func' to ':' to elide all warnings, or func_fatal_error to +# treat the next displayed warning as a fatal error. +warning_func=func_warn_and_continue + +# Set to 'all' to display all warnings, 'none' to suppress all +# warnings, or a space delimited list of some subset of +# 'warning_categories' to display only the listed warnings. +opt_warning_types=all + + +## -------------------- ## +## Resource management. ## +## -------------------- ## + +# This section contains definitions for functions that each ensure a +# particular resource (a file, or a non-empty configuration variable for +# example) is available, and if appropriate to extract default values +# from pertinent package files. Call them using their associated +# 'require_*' variable to ensure that they are executed, at most, once. +# +# It's entirely deliberate that calling these functions can set +# variables that don't obey the namespace limitations obeyed by the rest +# of this file, in order that that they be as useful as possible to +# callers. + + +# require_term_colors +# ------------------- +# Allow display of bold text on terminals that support it. +require_term_colors=func_require_term_colors +func_require_term_colors () +{ + $debug_cmd + + test -t 1 && { + # COLORTERM and USE_ANSI_COLORS environment variables take + # precedence, because most terminfo databases neglect to describe + # whether color sequences are supported. + test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} + + if test 1 = "$USE_ANSI_COLORS"; then + # Standard ANSI escape sequences + tc_reset='' + tc_bold=''; tc_standout='' + tc_red=''; tc_green='' + tc_blue=''; tc_cyan='' + else + # Otherwise trust the terminfo database after all. + test -n "`tput sgr0 2>/dev/null`" && { + tc_reset=`tput sgr0` + test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` + tc_standout=$tc_bold + test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` + test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` + test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` + test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` + test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` + } + fi + } + + require_term_colors=: +} + + +## ----------------- ## +## Function library. ## +## ----------------- ## + +# This section contains a variety of useful functions to call in your +# scripts. Take note of the portable wrappers for features provided by +# some modern shells, which will fall back to slower equivalents on +# less featureful shells. + + +# func_append VAR VALUE +# --------------------- +# Append VALUE onto the existing contents of VAR. + + # We should try to minimise forks, especially on Windows where they are + # unreasonably slow, so skip the feature probes when bash or zsh are + # being used: + if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then + : ${_G_HAVE_ARITH_OP="yes"} + : ${_G_HAVE_XSI_OPS="yes"} + # The += operator was introduced in bash 3.1 + case $BASH_VERSION in + [12].* | 3.0 | 3.0*) ;; + *) + : ${_G_HAVE_PLUSEQ_OP="yes"} + ;; + esac + fi + + # _G_HAVE_PLUSEQ_OP + # Can be empty, in which case the shell is probed, "yes" if += is + # useable or anything else if it does not work. + test -z "$_G_HAVE_PLUSEQ_OP" \ + && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ + && _G_HAVE_PLUSEQ_OP=yes + +if test yes = "$_G_HAVE_PLUSEQ_OP" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_append () + { + $debug_cmd + + eval "$1+=\$2" + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_append () + { + $debug_cmd + + eval "$1=\$$1\$2" + } +fi + + +# func_append_quoted VAR VALUE +# ---------------------------- +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +if test yes = "$_G_HAVE_PLUSEQ_OP"; then + eval 'func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1+=\\ \$func_quote_for_eval_result" + }' +else + func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1=\$$1\\ \$func_quote_for_eval_result" + } +fi + + +# func_append_uniq VAR VALUE +# -------------------------- +# Append unique VALUE onto the existing contents of VAR, assuming +# entries are delimited by the first character of VALUE. For example: +# +# func_append_uniq options " --another-option option-argument" +# +# will only append to $options if " --another-option option-argument " +# is not already present somewhere in $options already (note spaces at +# each end implied by leading space in second argument). +func_append_uniq () +{ + $debug_cmd + + eval _G_current_value='`$ECHO $'$1'`' + _G_delim=`expr "$2" : '\(.\)'` + + case $_G_delim$_G_current_value$_G_delim in + *"$2$_G_delim"*) ;; + *) func_append "$@" ;; + esac +} + + +# func_arith TERM... +# ------------------ +# Set func_arith_result to the result of evaluating TERMs. + test -z "$_G_HAVE_ARITH_OP" \ + && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ + && _G_HAVE_ARITH_OP=yes + +if test yes = "$_G_HAVE_ARITH_OP"; then + eval 'func_arith () + { + $debug_cmd + + func_arith_result=$(( $* )) + }' +else + func_arith () + { + $debug_cmd + + func_arith_result=`expr "$@"` + } +fi + + +# func_basename FILE +# ------------------ +# Set func_basename_result to FILE with everything up to and including +# the last / stripped. +if test yes = "$_G_HAVE_XSI_OPS"; then + # If this shell supports suffix pattern removal, then use it to avoid + # forking. Hide the definitions single quotes in case the shell chokes + # on unsupported syntax... + _b='func_basename_result=${1##*/}' + _d='case $1 in + */*) func_dirname_result=${1%/*}$2 ;; + * ) func_dirname_result=$3 ;; + esac' + +else + # ...otherwise fall back to using sed. + _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' + _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` + if test "X$func_dirname_result" = "X$1"; then + func_dirname_result=$3 + else + func_append func_dirname_result "$2" + fi' +fi + +eval 'func_basename () +{ + $debug_cmd + + '"$_b"' +}' + + +# func_dirname FILE APPEND NONDIR_REPLACEMENT +# ------------------------------------------- +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +eval 'func_dirname () +{ + $debug_cmd + + '"$_d"' +}' + + +# func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT +# -------------------------------------------------------- +# Perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# For efficiency, we do not delegate to the functions above but instead +# duplicate the functionality here. +eval 'func_dirname_and_basename () +{ + $debug_cmd + + '"$_b"' + '"$_d"' +}' + + +# func_echo ARG... +# ---------------- +# Echo program name prefixed message. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_echo_all ARG... +# -------------------- +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + + +# func_echo_infix_1 INFIX ARG... +# ------------------------------ +# Echo program name, followed by INFIX on the first line, with any +# additional lines not showing INFIX. +func_echo_infix_1 () +{ + $debug_cmd + + $require_term_colors + + _G_infix=$1; shift + _G_indent=$_G_infix + _G_prefix="$progname: $_G_infix: " + _G_message=$* + + # Strip color escape sequences before counting printable length + for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" + do + test -n "$_G_tc" && { + _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` + _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` + } + done + _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes + + func_echo_infix_1_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_infix_1_IFS + $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 + _G_prefix=$_G_indent + done + IFS=$func_echo_infix_1_IFS +} + + +# func_error ARG... +# ----------------- +# Echo program name prefixed message to standard error. +func_error () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 +} + + +# func_fatal_error ARG... +# ----------------------- +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + $debug_cmd + + func_error "$*" + exit $EXIT_FAILURE +} + + +# func_grep EXPRESSION FILENAME +# ----------------------------- +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $debug_cmd + + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_len STRING +# --------------- +# Set func_len_result to the length of STRING. STRING may not +# start with a hyphen. + test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_len () + { + $debug_cmd + + func_len_result=${#1} + }' +else + func_len () + { + $debug_cmd + + func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` + } +fi + + +# func_mkdir_p DIRECTORY-PATH +# --------------------------- +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + $debug_cmd + + _G_directory_path=$1 + _G_dir_list= + + if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then + + # Protect directory names starting with '-' + case $_G_directory_path in + -*) _G_directory_path=./$_G_directory_path ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$_G_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + _G_dir_list=$_G_directory_path:$_G_dir_list + + # If the last portion added has no slash in it, the list is done + case $_G_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` + done + _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` + + func_mkdir_p_IFS=$IFS; IFS=: + for _G_dir in $_G_dir_list; do + IFS=$func_mkdir_p_IFS + # mkdir can fail with a 'File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$_G_dir" 2>/dev/null || : + done + IFS=$func_mkdir_p_IFS + + # Bail out if we (or some other process) failed to create a directory. + test -d "$_G_directory_path" || \ + func_fatal_error "Failed to create '$1'" + fi +} + + +# func_mktempdir [BASENAME] +# ------------------------- +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, BASENAME is the basename for that directory. +func_mktempdir () +{ + $debug_cmd + + _G_template=${TMPDIR-/tmp}/${1-$progname} + + if test : = "$opt_dry_run"; then + # Return a directory name, but don't create it in dry-run mode + _G_tmpdir=$_G_template-$$ + else + + # If mktemp works, use that first and foremost + _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` + + if test ! -d "$_G_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + _G_tmpdir=$_G_template-${RANDOM-0}$$ + + func_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$_G_tmpdir" + umask $func_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$_G_tmpdir" || \ + func_fatal_error "cannot create temporary directory '$_G_tmpdir'" + fi + + $ECHO "$_G_tmpdir" +} + + +# func_normal_abspath PATH +# ------------------------ +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +func_normal_abspath () +{ + $debug_cmd + + # These SED scripts presuppose an absolute path with a trailing slash. + _G_pathcar='s|^/\([^/]*\).*$|\1|' + _G_pathcdr='s|^/[^/]*||' + _G_removedotparts=':dotsl + s|/\./|/|g + t dotsl + s|/\.$|/|' + _G_collapseslashes='s|/\{1,\}|/|g' + _G_finalslash='s|/*$|/|' + + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` + while :; do + # Processed it all yet? + if test / = "$func_normal_abspath_tpath"; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result"; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result +} + + +# func_notquiet ARG... +# -------------------- +# Echo program name prefixed message only when not in quiet mode. +func_notquiet () +{ + $debug_cmd + + $opt_quiet || func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + + +# func_relative_path SRCDIR DSTDIR +# -------------------------------- +# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. +func_relative_path () +{ + $debug_cmd + + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=$func_dirname_result + if test -z "$func_relative_path_tlibdir"; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done + + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test -n "$func_stripname_result"; then + func_append func_relative_path_result "/$func_stripname_result" + fi + + # Normalisation. If bindir is libdir, return '.' else relative path. + if test -n "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + fi + + test -n "$func_relative_path_result" || func_relative_path_result=. + + : +} + + +# func_quote_for_eval ARG... +# -------------------------- +# Aesthetically quote ARGs to be evaled later. +# This function returns two values: +# i) func_quote_for_eval_result +# double-quoted, suitable for a subsequent eval +# ii) func_quote_for_eval_unquoted_result +# has all characters that are still active within double +# quotes backslashified. +func_quote_for_eval () +{ + $debug_cmd + + func_quote_for_eval_unquoted_result= + func_quote_for_eval_result= + while test 0 -lt $#; do + case $1 in + *[\\\`\"\$]*) + _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;; + *) + _G_unquoted_arg=$1 ;; + esac + if test -n "$func_quote_for_eval_unquoted_result"; then + func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg" + else + func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg" + fi + + case $_G_unquoted_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and variable expansion + # for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_quoted_arg=\"$_G_unquoted_arg\" + ;; + *) + _G_quoted_arg=$_G_unquoted_arg + ;; + esac + + if test -n "$func_quote_for_eval_result"; then + func_append func_quote_for_eval_result " $_G_quoted_arg" + else + func_append func_quote_for_eval_result "$_G_quoted_arg" + fi + shift + done +} + + +# func_quote_for_expand ARG +# ------------------------- +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + $debug_cmd + + case $1 in + *[\\\`\"]*) + _G_arg=`$ECHO "$1" | $SED \ + -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;; + *) + _G_arg=$1 ;; + esac + + case $_G_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_arg=\"$_G_arg\" + ;; + esac + + func_quote_for_expand_result=$_G_arg +} + + +# func_stripname PREFIX SUFFIX NAME +# --------------------------------- +# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_stripname () + { + $debug_cmd + + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary variable first. + func_stripname_result=$3 + func_stripname_result=${func_stripname_result#"$1"} + func_stripname_result=${func_stripname_result%"$2"} + }' +else + func_stripname () + { + $debug_cmd + + case $2 in + .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; + *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; + esac + } +fi + + +# func_show_eval CMD [FAIL_EXP] +# ----------------------------- +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + func_quote_for_expand "$_G_cmd" + eval "func_notquiet $func_quote_for_expand_result" + + $opt_dry_run || { + eval "$_G_cmd" + _G_status=$? + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_show_eval_locale CMD [FAIL_EXP] +# ------------------------------------ +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + $opt_quiet || { + func_quote_for_expand "$_G_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + $opt_dry_run || { + eval "$_G_user_locale + $_G_cmd" + _G_status=$? + eval "$_G_safe_locale" + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_tr_sh +# ---------- +# Turn $1 into a string suitable for a shell variable name. +# Result is stored in $func_tr_sh_result. All characters +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, +# if $1 begins with a digit, a '_' is prepended as well. +func_tr_sh () +{ + $debug_cmd + + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} + + +# func_verbose ARG... +# ------------------- +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $debug_cmd + + $opt_verbose && func_echo "$*" + + : +} + + +# func_warn_and_continue ARG... +# ----------------------------- +# Echo program name prefixed warning message to standard error. +func_warn_and_continue () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 +} + + +# func_warning CATEGORY ARG... +# ---------------------------- +# Echo program name prefixed warning message to standard error. Warning +# messages can be filtered according to CATEGORY, where this function +# elides messages where CATEGORY is not listed in the global variable +# 'opt_warning_types'. +func_warning () +{ + $debug_cmd + + # CATEGORY must be in the warning_categories list! + case " $warning_categories " in + *" $1 "*) ;; + *) func_internal_error "invalid warning category '$1'" ;; + esac + + _G_category=$1 + shift + + case " $opt_warning_types " in + *" $_G_category "*) $warning_func ${1+"$@"} ;; + esac +} + + +# func_sort_ver VER1 VER2 +# ----------------------- +# 'sort -V' is not generally available. +# Note this deviates from the version comparison in automake +# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a +# but this should suffice as we won't be specifying old +# version formats or redundant trailing .0 in bootstrap.conf. +# If we did want full compatibility then we should probably +# use m4_version_compare from autoconf. +func_sort_ver () +{ + $debug_cmd + + printf '%s\n%s\n' "$1" "$2" \ + | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n +} + +# func_lt_ver PREV CURR +# --------------------- +# Return true if PREV and CURR are in the correct order according to +# func_sort_ver, otherwise false. Use it like this: +# +# func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." +func_lt_ver () +{ + $debug_cmd + + test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: +#! /bin/sh + +# Set a version string for this script. +scriptversion=2014-01-07.03; # UTC + +# A portable, pluggable option parser for Bourne shell. +# Written by Gary V. Vaughan, 2010 + +# Copyright (C) 2010-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# This file is a library for parsing options in your shell scripts along +# with assorted other useful supporting features that you can make use +# of too. +# +# For the simplest scripts you might need only: +# +# #!/bin/sh +# . relative/path/to/funclib.sh +# . relative/path/to/options-parser +# scriptversion=1.0 +# func_options ${1+"$@"} +# eval set dummy "$func_options_result"; shift +# ...rest of your script... +# +# In order for the '--version' option to work, you will need to have a +# suitably formatted comment like the one at the top of this file +# starting with '# Written by ' and ending with '# warranty; '. +# +# For '-h' and '--help' to work, you will also need a one line +# description of your script's purpose in a comment directly above the +# '# Written by ' line, like the one at the top of this file. +# +# The default options also support '--debug', which will turn on shell +# execution tracing (see the comment above debug_cmd below for another +# use), and '--verbose' and the func_verbose function to allow your script +# to display verbose messages only when your user has specified +# '--verbose'. +# +# After sourcing this file, you can plug processing for additional +# options by amending the variables from the 'Configuration' section +# below, and following the instructions in the 'Option parsing' +# section further down. + +## -------------- ## +## Configuration. ## +## -------------- ## + +# You should override these variables in your script after sourcing this +# file so that they reflect the customisations you have added to the +# option parser. + +# The usage line for option parsing errors and the start of '-h' and +# '--help' output messages. You can embed shell variables for delayed +# expansion at the time the message is displayed, but you will need to +# quote other shell meta-characters carefully to prevent them being +# expanded when the contents are evaled. +usage='$progpath [OPTION]...' + +# Short help message in response to '-h' and '--help'. Add to this or +# override it after sourcing this library to reflect the full set of +# options your script accepts. +usage_message="\ + --debug enable verbose shell tracing + -W, --warnings=CATEGORY + report the warnings falling in CATEGORY [all] + -v, --verbose verbosely report processing + --version print version information and exit + -h, --help print short or long help message and exit +" + +# Additional text appended to 'usage_message' in response to '--help'. +long_help_message=" +Warning categories include: + 'all' show all warnings + 'none' turn off all the warnings + 'error' warnings are treated as fatal errors" + +# Help message printed before fatal option parsing errors. +fatal_help="Try '\$progname --help' for more information." + + + +## ------------------------- ## +## Hook function management. ## +## ------------------------- ## + +# This section contains functions for adding, removing, and running hooks +# to the main code. A hook is just a named list of of function, that can +# be run in order later on. + +# func_hookable FUNC_NAME +# ----------------------- +# Declare that FUNC_NAME will run hooks added with +# 'func_add_hook FUNC_NAME ...'. +func_hookable () +{ + $debug_cmd + + func_append hookable_fns " $1" +} + + +# func_add_hook FUNC_NAME HOOK_FUNC +# --------------------------------- +# Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must +# first have been declared "hookable" by a call to 'func_hookable'. +func_add_hook () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not accept hook functions." ;; + esac + + eval func_append ${1}_hooks '" $2"' +} + + +# func_remove_hook FUNC_NAME HOOK_FUNC +# ------------------------------------ +# Remove HOOK_FUNC from the list of functions called by FUNC_NAME. +func_remove_hook () +{ + $debug_cmd + + eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' +} + + +# func_run_hooks FUNC_NAME [ARG]... +# --------------------------------- +# Run all hook functions registered to FUNC_NAME. +# It is assumed that the list of hook functions contains nothing more +# than a whitespace-delimited list of legal shell function names, and +# no effort is wasted trying to catch shell meta-characters or preserve +# whitespace. +func_run_hooks () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not support hook funcions.n" ;; + esac + + eval _G_hook_fns=\$$1_hooks; shift + + for _G_hook in $_G_hook_fns; do + eval $_G_hook '"$@"' + + # store returned options list back into positional + # parameters for next 'cmd' execution. + eval _G_hook_result=\$${_G_hook}_result + eval set dummy "$_G_hook_result"; shift + done + + func_quote_for_eval ${1+"$@"} + func_run_hooks_result=$func_quote_for_eval_result +} + + + +## --------------- ## +## Option parsing. ## +## --------------- ## + +# In order to add your own option parsing hooks, you must accept the +# full positional parameter list in your hook function, remove any +# options that you action, and then pass back the remaining unprocessed +# options in '_result', escaped suitably for +# 'eval'. Like this: +# +# my_options_prep () +# { +# $debug_cmd +# +# # Extend the existing usage message. +# usage_message=$usage_message' +# -s, --silent don'\''t print informational messages +# ' +# +# func_quote_for_eval ${1+"$@"} +# my_options_prep_result=$func_quote_for_eval_result +# } +# func_add_hook func_options_prep my_options_prep +# +# +# my_silent_option () +# { +# $debug_cmd +# +# # Note that for efficiency, we parse as many options as we can +# # recognise in a loop before passing the remainder back to the +# # caller on the first unrecognised argument we encounter. +# while test $# -gt 0; do +# opt=$1; shift +# case $opt in +# --silent|-s) opt_silent=: ;; +# # Separate non-argument short options: +# -s*) func_split_short_opt "$_G_opt" +# set dummy "$func_split_short_opt_name" \ +# "-$func_split_short_opt_arg" ${1+"$@"} +# shift +# ;; +# *) set dummy "$_G_opt" "$*"; shift; break ;; +# esac +# done +# +# func_quote_for_eval ${1+"$@"} +# my_silent_option_result=$func_quote_for_eval_result +# } +# func_add_hook func_parse_options my_silent_option +# +# +# my_option_validation () +# { +# $debug_cmd +# +# $opt_silent && $opt_verbose && func_fatal_help "\ +# '--silent' and '--verbose' options are mutually exclusive." +# +# func_quote_for_eval ${1+"$@"} +# my_option_validation_result=$func_quote_for_eval_result +# } +# func_add_hook func_validate_options my_option_validation +# +# You'll alse need to manually amend $usage_message to reflect the extra +# options you parse. It's preferable to append if you can, so that +# multiple option parsing hooks can be added safely. + + +# func_options [ARG]... +# --------------------- +# All the functions called inside func_options are hookable. See the +# individual implementations for details. +func_hookable func_options +func_options () +{ + $debug_cmd + + func_options_prep ${1+"$@"} + eval func_parse_options \ + ${func_options_prep_result+"$func_options_prep_result"} + eval func_validate_options \ + ${func_parse_options_result+"$func_parse_options_result"} + + eval func_run_hooks func_options \ + ${func_validate_options_result+"$func_validate_options_result"} + + # save modified positional parameters for caller + func_options_result=$func_run_hooks_result +} + + +# func_options_prep [ARG]... +# -------------------------- +# All initialisations required before starting the option parse loop. +# Note that when calling hook functions, we pass through the list of +# positional parameters. If a hook function modifies that list, and +# needs to propogate that back to rest of this script, then the complete +# modified list must be put in 'func_run_hooks_result' before +# returning. +func_hookable func_options_prep +func_options_prep () +{ + $debug_cmd + + # Option defaults: + opt_verbose=false + opt_warning_types= + + func_run_hooks func_options_prep ${1+"$@"} + + # save modified positional parameters for caller + func_options_prep_result=$func_run_hooks_result +} + + +# func_parse_options [ARG]... +# --------------------------- +# The main option parsing loop. +func_hookable func_parse_options +func_parse_options () +{ + $debug_cmd + + func_parse_options_result= + + # this just eases exit handling + while test $# -gt 0; do + # Defer to hook functions for initial option parsing, so they + # get priority in the event of reusing an option name. + func_run_hooks func_parse_options ${1+"$@"} + + # Adjust func_parse_options positional parameters to match + eval set dummy "$func_run_hooks_result"; shift + + # Break out of the loop if we already parsed every option. + test $# -gt 0 || break + + _G_opt=$1 + shift + case $_G_opt in + --debug|-x) debug_cmd='set -x' + func_echo "enabling shell trace mode" + $debug_cmd + ;; + + --no-warnings|--no-warning|--no-warn) + set dummy --warnings none ${1+"$@"} + shift + ;; + + --warnings|--warning|-W) + test $# = 0 && func_missing_arg $_G_opt && break + case " $warning_categories $1" in + *" $1 "*) + # trailing space prevents matching last $1 above + func_append_uniq opt_warning_types " $1" + ;; + *all) + opt_warning_types=$warning_categories + ;; + *none) + opt_warning_types=none + warning_func=: + ;; + *error) + opt_warning_types=$warning_categories + warning_func=func_fatal_error + ;; + *) + func_fatal_error \ + "unsupported warning category: '$1'" + ;; + esac + shift + ;; + + --verbose|-v) opt_verbose=: ;; + --version) func_version ;; + -\?|-h) func_usage ;; + --help) func_help ;; + + # Separate optargs to long options (plugins may need this): + --*=*) func_split_equals "$_G_opt" + set dummy "$func_split_equals_lhs" \ + "$func_split_equals_rhs" ${1+"$@"} + shift + ;; + + # Separate optargs to short options: + -W*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-v*|-x*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) break ;; + -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; + *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + esac + done + + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + func_parse_options_result=$func_quote_for_eval_result +} + + +# func_validate_options [ARG]... +# ------------------------------ +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +func_hookable func_validate_options +func_validate_options () +{ + $debug_cmd + + # Display all warnings if -W was not given. + test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" + + func_run_hooks func_validate_options ${1+"$@"} + + # Bail if the options were screwed! + $exit_cmd $EXIT_FAILURE + + # save modified positional parameters for caller + func_validate_options_result=$func_run_hooks_result +} + + + +## ----------------- ## +## Helper functions. ## +## ----------------- ## + +# This section contains the helper functions used by the rest of the +# hookable option parser framework in ascii-betical order. + + +# func_fatal_help ARG... +# ---------------------- +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + eval \$ECHO \""$fatal_help"\" + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + + +# func_help +# --------- +# Echo long help message to standard output and exit. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message" + exit 0 +} + + +# func_missing_arg ARGNAME +# ------------------------ +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + $debug_cmd + + func_error "Missing argument for '$1'." + exit_cmd=exit +} + + +# func_split_equals STRING +# ------------------------ +# Set func_split_equals_lhs and func_split_equals_rhs shell variables after +# splitting STRING at the '=' sign. +test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=${1%%=*} + func_split_equals_rhs=${1#*=} + test "x$func_split_equals_lhs" = "x$1" \ + && func_split_equals_rhs= + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` + func_split_equals_rhs= + test "x$func_split_equals_lhs" = "x$1" \ + || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` + } +fi #func_split_equals + + +# func_split_short_opt SHORTOPT +# ----------------------------- +# Set func_split_short_opt_name and func_split_short_opt_arg shell +# variables after splitting SHORTOPT after the 2nd character. +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"} + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'` + func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` + } +fi #func_split_short_opt + + +# func_usage +# ---------- +# Echo short help message to standard output and exit. +func_usage () +{ + $debug_cmd + + func_usage_message + $ECHO "Run '$progname --help |${PAGER-more}' for full usage" + exit 0 +} + + +# func_usage_message +# ------------------ +# Echo short help message to standard output. +func_usage_message () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + echo + $SED -n 's|^# || + /^Written by/{ + x;p;x + } + h + /^Written by/q' < "$progpath" + echo + eval \$ECHO \""$usage_message"\" +} + + +# func_version +# ------------ +# Echo version message to standard output and exit. +func_version () +{ + $debug_cmd + + printf '%s\n' "$progname $scriptversion" + $SED -n ' + /(C)/!b go + :more + /\./!{ + N + s|\n# | | + b more + } + :go + /^# Written by /,/# warranty; / { + s|^# || + s|^# *$|| + s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| + p + } + /^# Written by / { + s|^# || + p + } + /^warranty; /q' < "$progpath" + + exit $? +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: + +# Set a version string. +scriptversion='(GNU libtool) 2.4.6' + + +# func_echo ARG... +# ---------------- +# Libtool also displays the current mode in messages, so override +# funclib.sh func_echo with this custom definition. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_warning ARG... +# ------------------- +# Libtool warnings are not categorized, so override funclib.sh +# func_warning with this simpler definition. +func_warning () +{ + $debug_cmd + + $warning_func ${1+"$@"} +} + + +## ---------------- ## +## Options parsing. ## +## ---------------- ## + +# Hook in the functions to make sure our own options are parsed during +# the option parsing loop. + +usage='$progpath [OPTION]... [MODE-ARG]...' + +# Short help message in response to '-h'. +usage_message="Options: + --config show all configuration variables + --debug enable verbose shell tracing + -n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --mode=MODE use operation mode MODE + --no-warnings equivalent to '-Wnone' + --preserve-dup-deps don't remove duplicate dependency libraries + --quiet, --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG + -v, --verbose print more informational messages than default + --version print version information + -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] + -h, --help, --help-all print short, long, or detailed help message +" + +# Additional text appended to 'usage_message' in response to '--help'. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message + +MODE must be one of the following: + + clean remove files from the build directory + compile compile a source file into a libtool object + execute automatically set library path, then run a program + finish complete the installation of libtool libraries + install install libraries or executables + link create a library or an executable + uninstall remove libraries from an installed directory + +MODE-ARGS vary depending on the MODE. When passed as first option, +'--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. +Try '$progname --help --mode=MODE' for a more detailed description of MODE. + +When reporting a bug, please describe a test case to reproduce it and +include the following information: + + host-triplet: $host + shell: $SHELL + compiler: $LTCC + compiler flags: $LTCFLAGS + linker: $LD (gnu? $with_gnu_ld) + version: $progname (GNU libtool) 2.4.6 + automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` + autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` + +Report bugs to . +GNU libtool home page: . +General help using GNU software: ." + exit 0 +} + + +# func_lo2o OBJECT-NAME +# --------------------- +# Transform OBJECT-NAME from a '.lo' suffix to the platform specific +# object suffix. + +lo2o=s/\\.lo\$/.$objext/ +o2lo=s/\\.$objext\$/.lo/ + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_lo2o () + { + case $1 in + *.lo) func_lo2o_result=${1%.lo}.$objext ;; + * ) func_lo2o_result=$1 ;; + esac + }' + + # func_xform LIBOBJ-OR-SOURCE + # --------------------------- + # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) + # suffix to a '.lo' libtool-object suffix. + eval 'func_xform () + { + func_xform_result=${1%.*}.lo + }' +else + # ...otherwise fall back to using sed. + func_lo2o () + { + func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` + } + + func_xform () + { + func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` + } +fi + + +# func_fatal_configuration ARG... +# ------------------------------- +# Echo program name prefixed message to standard error, followed by +# a configuration failure hint, and exit. +func_fatal_configuration () +{ + func__fatal_error ${1+"$@"} \ + "See the $PACKAGE documentation for more information." \ + "Fatal configuration error." +} + + +# func_config +# ----------- +# Display the configuration for all the tags in this script. +func_config () +{ + re_begincf='^# ### BEGIN LIBTOOL' + re_endcf='^# ### END LIBTOOL' + + # Default configuration. + $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" + + # Now print the configurations for the tags. + for tagname in $taglist; do + $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" + done + + exit $? +} + + +# func_features +# ------------- +# Display the features supported by this script. +func_features () +{ + echo "host: $host" + if test yes = "$build_libtool_libs"; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test yes = "$build_old_libs"; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + + exit $? +} + + +# func_enable_tag TAGNAME +# ----------------------- +# Verify that TAGNAME is valid, and either flag an error and exit, or +# enable the TAGNAME tag. We also add TAGNAME to the global $taglist +# variable here. +func_enable_tag () +{ + # Global variable: + tagname=$1 + + re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" + re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" + sed_extractcf=/$re_begincf/,/$re_endcf/p + + # Validate tagname. + case $tagname in + *[!-_A-Za-z0-9,/]*) + func_fatal_error "invalid tag name: $tagname" + ;; + esac + + # Don't test for the "default" C tag, as we know it's + # there but not specially marked. + case $tagname in + CC) ;; + *) + if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + + +# func_check_version_match +# ------------------------ +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +# libtool_options_prep [ARG]... +# ----------------------------- +# Preparation for options parsed by libtool. +libtool_options_prep () +{ + $debug_mode + + # Option defaults: + opt_config=false + opt_dlopen= + opt_dry_run=false + opt_help=false + opt_mode= + opt_preserve_dup_deps=false + opt_quiet=false + + nonopt= + preserve_args= + + # Shorthand for --mode=foo, only valid as the first argument + case $1 in + clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; + compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; + execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; + finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; + install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; + link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; + uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; + esac + + # Pass back the list of options. + func_quote_for_eval ${1+"$@"} + libtool_options_prep_result=$func_quote_for_eval_result +} +func_add_hook func_options_prep libtool_options_prep + + +# libtool_parse_options [ARG]... +# --------------------------------- +# Provide handling for libtool specific options. +libtool_parse_options () +{ + $debug_cmd + + # Perform our own loop to consume as many options as possible in + # each iteration. + while test $# -gt 0; do + _G_opt=$1 + shift + case $_G_opt in + --dry-run|--dryrun|-n) + opt_dry_run=: + ;; + + --config) func_config ;; + + --dlopen|-dlopen) + opt_dlopen="${opt_dlopen+$opt_dlopen +}$1" + shift + ;; + + --preserve-dup-deps) + opt_preserve_dup_deps=: ;; + + --features) func_features ;; + + --finish) set dummy --mode finish ${1+"$@"}; shift ;; + + --help) opt_help=: ;; + + --help-all) opt_help=': help-all' ;; + + --mode) test $# = 0 && func_missing_arg $_G_opt && break + opt_mode=$1 + case $1 in + # Valid mode arguments: + clean|compile|execute|finish|install|link|relink|uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $_G_opt" + exit_cmd=exit + break + ;; + esac + shift + ;; + + --no-silent|--no-quiet) + opt_quiet=false + func_append preserve_args " $_G_opt" + ;; + + --no-warnings|--no-warning|--no-warn) + opt_warning=false + func_append preserve_args " $_G_opt" + ;; + + --no-verbose) + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --silent|--quiet) + opt_quiet=: + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --tag) test $# = 0 && func_missing_arg $_G_opt && break + opt_tag=$1 + func_append preserve_args " $_G_opt $1" + func_enable_tag "$1" + shift + ;; + + --verbose|-v) opt_quiet=false + opt_verbose=: + func_append preserve_args " $_G_opt" + ;; + + # An option not handled by this hook function: + *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + esac + done + + + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + libtool_parse_options_result=$func_quote_for_eval_result +} +func_add_hook func_parse_options libtool_parse_options + + + +# libtool_validate_options [ARG]... +# --------------------------------- +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +libtool_validate_options () +{ + # save first non-option argument + if test 0 -lt $#; then + nonopt=$1 + shift + fi + + # preserve --debug + test : = "$debug_cmd" || func_append preserve_args " --debug" + + case $host in + # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 + # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 + *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps + ;; + esac + + $opt_help || { + # Sanity checks first: + func_check_version_match + + test yes != "$build_libtool_libs" \ + && test yes != "$build_old_libs" \ + && func_fatal_configuration "not configured to build any kind of library" + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test execute != "$opt_mode"; then + func_error "unrecognized option '-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help=$help + help="Try '$progname --help --mode=$opt_mode' for more information." + } + + # Pass back the unparsed argument list + func_quote_for_eval ${1+"$@"} + libtool_validate_options_result=$func_quote_for_eval_result +} +func_add_hook func_validate_options libtool_validate_options + + +# Process options as early as possible so that --help and --version +# can return quickly. +func_options ${1+"$@"} +eval set dummy "$func_options_result"; shift + + + +## ----------- ## +## Main. ## +## ----------- ## + +magic='%%%MAGIC variable%%%' +magic_exe='%%%MAGIC EXE variable%%%' + +# Global variables. +extracted_archives= +extracted_serial=0 + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# func_generated_by_libtool +# True iff stdin has been generated by Libtool. This function is only +# a basic sanity check; it will hardly flush out determined imposters. +func_generated_by_libtool_p () +{ + $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if 'file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case $lalib_p_line in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test yes = "$lalib_p" +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + test -f "$1" && + $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $debug_cmd + + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# 'FILE.' does not work on cygwin managed mounts. +func_source () +{ + $debug_cmd + + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_resolve_sysroot PATH +# Replace a leading = in PATH with a sysroot. Store the result into +# func_resolve_sysroot_result +func_resolve_sysroot () +{ + func_resolve_sysroot_result=$1 + case $func_resolve_sysroot_result in + =*) + func_stripname '=' '' "$func_resolve_sysroot_result" + func_resolve_sysroot_result=$lt_sysroot$func_stripname_result + ;; + esac +} + +# func_replace_sysroot PATH +# If PATH begins with the sysroot, replace it with = and +# store the result into func_replace_sysroot_result. +func_replace_sysroot () +{ + case $lt_sysroot:$1 in + ?*:"$lt_sysroot"*) + func_stripname "$lt_sysroot" '' "$1" + func_replace_sysroot_result='='$func_stripname_result + ;; + *) + # Including no sysroot. + func_replace_sysroot_result=$1 + ;; + esac +} + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $debug_cmd + + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case "$@ " in + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with '--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=$1 + if test yes = "$build_libtool_libs"; then + write_lobj=\'$2\' + else + write_lobj=none + fi + + if test yes = "$build_old_libs"; then + write_oldobj=\'$3\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T </dev/null` + if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then + func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | + $SED -e "$sed_naive_backslashify"` + else + func_convert_core_file_wine_to_w32_result= + fi + fi +} +# end: func_convert_core_file_wine_to_w32 + + +# func_convert_core_path_wine_to_w32 ARG +# Helper function used by path conversion functions when $build is *nix, and +# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly +# configured wine environment available, with the winepath program in $build's +# $PATH. Assumes ARG has no leading or trailing path separator characters. +# +# ARG is path to be converted from $build format to win32. +# Result is available in $func_convert_core_path_wine_to_w32_result. +# Unconvertible file (directory) names in ARG are skipped; if no directory names +# are convertible, then the result may be empty. +func_convert_core_path_wine_to_w32 () +{ + $debug_cmd + + # unfortunately, winepath doesn't convert paths, only file names + func_convert_core_path_wine_to_w32_result= + if test -n "$1"; then + oldIFS=$IFS + IFS=: + for func_convert_core_path_wine_to_w32_f in $1; do + IFS=$oldIFS + func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" + if test -n "$func_convert_core_file_wine_to_w32_result"; then + if test -z "$func_convert_core_path_wine_to_w32_result"; then + func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result + else + func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" + fi + fi + done + IFS=$oldIFS + fi +} +# end: func_convert_core_path_wine_to_w32 + + +# func_cygpath ARGS... +# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when +# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) +# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or +# (2), returns the Cygwin file name or path in func_cygpath_result (input +# file name or path is assumed to be in w32 format, as previously converted +# from $build's *nix or MSYS format). In case (3), returns the w32 file name +# or path in func_cygpath_result (input file name or path is assumed to be in +# Cygwin format). Returns an empty string on error. +# +# ARGS are passed to cygpath, with the last one being the file name or path to +# be converted. +# +# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH +# environment variable; do not put it in $PATH. +func_cygpath () +{ + $debug_cmd + + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then + func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` + if test "$?" -ne 0; then + # on failure, ensure result is empty + func_cygpath_result= + fi + else + func_cygpath_result= + func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" + fi +} +#end: func_cygpath + + +# func_convert_core_msys_to_w32 ARG +# Convert file name or path ARG from MSYS format to w32 format. Return +# result in func_convert_core_msys_to_w32_result. +func_convert_core_msys_to_w32 () +{ + $debug_cmd + + # awkward: cmd appends spaces to result + func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` +} +#end: func_convert_core_msys_to_w32 + + +# func_convert_file_check ARG1 ARG2 +# Verify that ARG1 (a file name in $build format) was converted to $host +# format in ARG2. Otherwise, emit an error message, but continue (resetting +# func_to_host_file_result to ARG1). +func_convert_file_check () +{ + $debug_cmd + + if test -z "$2" && test -n "$1"; then + func_error "Could not determine host file name corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_file_result=$1 + fi +} +# end func_convert_file_check + + +# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH +# Verify that FROM_PATH (a path in $build format) was converted to $host +# format in TO_PATH. Otherwise, emit an error message, but continue, resetting +# func_to_host_file_result to a simplistic fallback value (see below). +func_convert_path_check () +{ + $debug_cmd + + if test -z "$4" && test -n "$3"; then + func_error "Could not determine the host path corresponding to" + func_error " '$3'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This is a deliberately simplistic "conversion" and + # should not be "improved". See libtool.info. + if test "x$1" != "x$2"; then + lt_replace_pathsep_chars="s|$1|$2|g" + func_to_host_path_result=`echo "$3" | + $SED -e "$lt_replace_pathsep_chars"` + else + func_to_host_path_result=$3 + fi + fi +} +# end func_convert_path_check + + +# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG +# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT +# and appending REPL if ORIG matches BACKPAT. +func_convert_path_front_back_pathsep () +{ + $debug_cmd + + case $4 in + $1 ) func_to_host_path_result=$3$func_to_host_path_result + ;; + esac + case $4 in + $2 ) func_append func_to_host_path_result "$3" + ;; + esac +} +# end func_convert_path_front_back_pathsep + + +################################################## +# $build to $host FILE NAME CONVERSION FUNCTIONS # +################################################## +# invoked via '$to_host_file_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# Result will be available in $func_to_host_file_result. + + +# func_to_host_file ARG +# Converts the file name ARG from $build format to $host format. Return result +# in func_to_host_file_result. +func_to_host_file () +{ + $debug_cmd + + $to_host_file_cmd "$1" +} +# end func_to_host_file + + +# func_to_tool_file ARG LAZY +# converts the file name ARG from $build format to toolchain format. Return +# result in func_to_tool_file_result. If the conversion in use is listed +# in (the comma separated) LAZY, no conversion takes place. +func_to_tool_file () +{ + $debug_cmd + + case ,$2, in + *,"$to_tool_file_cmd",*) + func_to_tool_file_result=$1 + ;; + *) + $to_tool_file_cmd "$1" + func_to_tool_file_result=$func_to_host_file_result + ;; + esac +} +# end func_to_tool_file + + +# func_convert_file_noop ARG +# Copy ARG to func_to_host_file_result. +func_convert_file_noop () +{ + func_to_host_file_result=$1 +} +# end func_convert_file_noop + + +# func_convert_file_msys_to_w32 ARG +# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_file_result. +func_convert_file_msys_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_to_host_file_result=$func_convert_core_msys_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_w32 + + +# func_convert_file_cygwin_to_w32 ARG +# Convert file name ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_file_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # because $build is cygwin, we call "the" cygpath in $PATH; no need to use + # LT_CYGPATH in this case. + func_to_host_file_result=`cygpath -m "$1"` + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_cygwin_to_w32 + + +# func_convert_file_nix_to_w32 ARG +# Convert file name ARG from *nix to w32 format. Requires a wine environment +# and a working winepath. Returns result in func_to_host_file_result. +func_convert_file_nix_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_file_wine_to_w32 "$1" + func_to_host_file_result=$func_convert_core_file_wine_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_w32 + + +# func_convert_file_msys_to_cygwin ARG +# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_file_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_cygpath -u "$func_convert_core_msys_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_cygwin + + +# func_convert_file_nix_to_cygwin ARG +# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed +# in a wine environment, working winepath, and LT_CYGPATH set. Returns result +# in func_to_host_file_result. +func_convert_file_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. + func_convert_core_file_wine_to_w32 "$1" + func_cygpath -u "$func_convert_core_file_wine_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_cygwin + + +############################################# +# $build to $host PATH CONVERSION FUNCTIONS # +############################################# +# invoked via '$to_host_path_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# The result will be available in $func_to_host_path_result. +# +# Path separators are also converted from $build format to $host format. If +# ARG begins or ends with a path separator character, it is preserved (but +# converted to $host format) on output. +# +# All path conversion functions are named using the following convention: +# file name conversion function : func_convert_file_X_to_Y () +# path conversion function : func_convert_path_X_to_Y () +# where, for any given $build/$host combination the 'X_to_Y' value is the +# same. If conversion functions are added for new $build/$host combinations, +# the two new functions must follow this pattern, or func_init_to_host_path_cmd +# will break. + + +# func_init_to_host_path_cmd +# Ensures that function "pointer" variable $to_host_path_cmd is set to the +# appropriate value, based on the value of $to_host_file_cmd. +to_host_path_cmd= +func_init_to_host_path_cmd () +{ + $debug_cmd + + if test -z "$to_host_path_cmd"; then + func_stripname 'func_convert_file_' '' "$to_host_file_cmd" + to_host_path_cmd=func_convert_path_$func_stripname_result + fi +} + + +# func_to_host_path ARG +# Converts the path ARG from $build format to $host format. Return result +# in func_to_host_path_result. +func_to_host_path () +{ + $debug_cmd + + func_init_to_host_path_cmd + $to_host_path_cmd "$1" +} +# end func_to_host_path + + +# func_convert_path_noop ARG +# Copy ARG to func_to_host_path_result. +func_convert_path_noop () +{ + func_to_host_path_result=$1 +} +# end func_convert_path_noop + + +# func_convert_path_msys_to_w32 ARG +# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_path_result. +func_convert_path_msys_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from ARG. MSYS + # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; + # and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_msys_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_msys_to_w32 + + +# func_convert_path_cygwin_to_w32 ARG +# Convert path ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_path_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_cygwin_to_w32 + + +# func_convert_path_nix_to_w32 ARG +# Convert path ARG from *nix to w32 format. Requires a wine environment and +# a working winepath. Returns result in func_to_host_file_result. +func_convert_path_nix_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_path_wine_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_nix_to_w32 + + +# func_convert_path_msys_to_cygwin ARG +# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_path_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_msys_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_msys_to_cygwin + + +# func_convert_path_nix_to_cygwin ARG +# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a +# a wine environment, working winepath, and LT_CYGPATH set. Returns result in +# func_to_host_file_result. +func_convert_path_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_nix_to_cygwin + + +# func_dll_def_p FILE +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with _LT_DLL_DEF_P in libtool.m4 +func_dll_def_p () +{ + $debug_cmd + + func_dll_def_p_tmp=`$SED -n \ + -e 's/^[ ]*//' \ + -e '/^\(;.*\)*$/d' \ + -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ + -e q \ + "$1"` + test DEF = "$func_dll_def_p_tmp" +} + + +# func_mode_compile arg... +func_mode_compile () +{ + $debug_cmd + + # Get the compilation command and the source file. + base_compile= + srcfile=$nonopt # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + pie_flag= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg=$arg + arg_mode=normal + ;; + + target ) + libobj=$arg + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + test -n "$libobj" && \ + func_fatal_error "you cannot specify '-o' more than once" + arg_mode=target + continue + ;; + + -pie | -fpie | -fPIE) + func_append pie_flag " $arg" + continue + ;; + + -shared | -static | -prefer-pic | -prefer-non-pic) + func_append later " $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + lastarg= + save_ifs=$IFS; IFS=, + for arg in $args; do + IFS=$save_ifs + func_append_quoted lastarg "$arg" + done + IFS=$save_ifs + func_stripname ' ' '' "$lastarg" + lastarg=$func_stripname_result + + # Add the arguments to base_compile. + func_append base_compile " $lastarg" + continue + ;; + + *) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg=$srcfile + srcfile=$arg + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + func_append_quoted base_compile "$lastarg" + done # for arg + + case $arg_mode in + arg) + func_fatal_error "you must specify an argument for -Xcompile" + ;; + target) + func_fatal_error "you must specify a target with '-o'" + ;; + *) + # Get the name of the library object. + test -z "$libobj" && { + func_basename "$srcfile" + libobj=$func_basename_result + } + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + case $libobj in + *.[cCFSifmso] | \ + *.ada | *.adb | *.ads | *.asm | \ + *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ + *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) + func_xform "$libobj" + libobj=$func_xform_result + ;; + esac + + case $libobj in + *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; + *) + func_fatal_error "cannot determine name of library object from '$libobj'" + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -shared) + test yes = "$build_libtool_libs" \ + || func_fatal_configuration "cannot build a shared library" + build_old_libs=no + continue + ;; + + -static) + build_libtool_libs=no + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + func_quote_for_eval "$libobj" + test "X$libobj" != "X$func_quote_for_eval_result" \ + && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && func_warning "libobj name '$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname=$func_basename_result + xdir=$func_dirname_result + lobj=$xdir$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test yes = "$build_old_libs"; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test no = "$compiler_c_o"; then + output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext + lockfile=$output_obj.lock + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test yes = "$need_locks"; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test warn = "$need_locks"; then + if test -f "$lockfile"; then + $ECHO "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + func_append removelist " $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + func_append removelist " $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 + srcfile=$func_to_tool_file_result + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # Only build a PIC object if we are building libtool libraries. + if test yes = "$build_libtool_libs"; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test no != "$pic_mode"; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + func_append command " -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test yes = "$suppress_opt"; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test yes = "$build_old_libs"; then + if test yes != "$pic_mode"; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test yes = "$compiler_c_o"; then + func_append command " -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + func_append command "$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test no != "$need_locks"; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { + test compile = "$opt_mode" && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $opt_mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $ECHO \ +"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to build PIC objects only + -prefer-non-pic try to build non-PIC objects only + -shared do not build a '.o' file suitable for static linking + -static only build a '.o' file suitable for static linking + -Wc,FLAG pass FLAG directly to the compiler + +COMPILE-COMMAND is a command to be used in creating a 'standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix '.c' with the +library object suffix, '.lo'." + ;; + + execute) + $ECHO \ +"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to '-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $ECHO \ +"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the '--dry-run' option if you just want to see what would be executed." + ;; + + install) + $ECHO \ +"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the 'install' or 'cp' program. + +The following components of INSTALL-COMMAND are treated specially: + + -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -bindir BINDIR specify path to binaries directory (for systems where + libraries must be found in the PATH setting at runtime) + -dlopen FILE '-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE use a list of object files found in FILE to specify objects + -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + -Wc,FLAG + -Xcompiler FLAG pass linker-specific FLAG directly to the compiler + -Wl,FLAG + -Xlinker FLAG pass linker-specific FLAG directly to the linker + -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) + +All other options (arguments beginning with '-') are ignored. + +Every other argument is treated as a filename. Files ending in '.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in '.la', then a libtool library is created, +only library objects ('.lo' files) may be specified, and '-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created +using 'ar' and 'ranlib', or on Windows using 'lib'. + +If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file +is created, otherwise an executable program is created." + ;; + + uninstall) + $ECHO \ +"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + + *) + func_fatal_help "invalid operation mode '$opt_mode'" + ;; + esac + + echo + $ECHO "Try '$progname --help' for more information about other modes." +} + +# Now that we've collected a possible --mode arg, show help if necessary +if $opt_help; then + if test : = "$opt_help"; then + func_mode_help + else + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + func_mode_help + done + } | $SED -n '1p; 2,$s/^Usage:/ or: /p' + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + echo + func_mode_help + done + } | + $SED '1d + /^When reporting/,/^Report/{ + H + d + } + $x + /information about other modes/d + /more detailed .*MODE/d + s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' + fi + exit $? +fi + + +# func_mode_execute arg... +func_mode_execute () +{ + $debug_cmd + + # The first argument is the command name. + cmd=$nonopt + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $opt_dlopen; do + test -f "$file" \ + || func_fatal_help "'$file' is not a file" + + dir= + case $file in + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "'$file' was not linked with '-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir=$func_dirname_result + + if test -f "$dir/$objdir/$dlname"; then + func_append dir "/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir=$func_dirname_result + ;; + + *) + func_warning "'-dlopen' is ignored for non-libtool libraries and objects" + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir=$absdir + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic=$magic + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -* | *.la | *.lo ) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file=$progdir/$program + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file=$progdir/$program + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_append_quoted args "$file" + done + + if $opt_dry_run; then + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" + echo "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + else + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd=\$cmd$args + fi +} + +test execute = "$opt_mode" && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $debug_cmd + + libs= + libdirs= + admincmds= + + for opt in "$nonopt" ${1+"$@"} + do + if test -d "$opt"; then + func_append libdirs " $opt" + + elif test -f "$opt"; then + if func_lalib_unsafe_p "$opt"; then + func_append libs " $opt" + else + func_warning "'$opt' is not a valid libtool archive" + fi + + else + func_fatal_error "invalid argument '$opt'" + fi + done + + if test -n "$libs"; then + if test -n "$lt_sysroot"; then + sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` + sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" + else + sysroot_cmd= + fi + + # Remove sysroot references + if $opt_dry_run; then + for lib in $libs; do + echo "removing references to $lt_sysroot and '=' prefixes from $lib" + done + else + tmpdir=`func_mktempdir` + for lib in $libs; do + $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ + > $tmpdir/tmp-la + mv -f $tmpdir/tmp-la $lib + done + ${RM}r "$tmpdir" + fi + fi + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || func_append admincmds " + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_quiet && exit $EXIT_SUCCESS + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use the '-LLIBDIR'" + echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + echo " - add LIBDIR to the '$shlibpath_var' environment variable" + echo " during execution" + fi + if test -n "$runpath_var"; then + echo " - add LIBDIR to the '$runpath_var' environment variable" + echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the '$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + echo " - have your system administrator add LIBDIR to '/etc/ld.so.conf'" + fi + echo + + echo "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" + echo "pages." + ;; + *) + echo "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + echo "----------------------------------------------------------------------" + fi + exit $EXIT_SUCCESS +} + +test finish = "$opt_mode" && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $debug_cmd + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || + # Allow the use of GNU shtool's install command. + case $nonopt in *shtool*) :;; *) false;; esac + then + # Aesthetically quote it. + func_quote_for_eval "$nonopt" + install_prog="$func_quote_for_eval_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_for_eval "$arg" + func_append install_prog "$func_quote_for_eval_result" + install_shared_prog=$install_prog + case " $install_prog " in + *[\\\ /]cp\ *) install_cp=: ;; + *) install_cp=false ;; + esac + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=false + stripme= + no_mode=: + for arg + do + arg2= + if test -n "$dest"; then + func_append files " $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=: ;; + -f) + if $install_cp; then :; else + prev=$arg + fi + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + if test X-m = "X$prev" && test -n "$install_override_mode"; then + arg2=$install_override_mode + no_mode=false + fi + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + func_append install_prog " $func_quote_for_eval_result" + if test -n "$arg2"; then + func_quote_for_eval "$arg2" + fi + func_append install_shared_prog " $func_quote_for_eval_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the '$prev' option requires an argument" + + if test -n "$install_override_mode" && $no_mode; then + if $install_cp; then :; else + func_quote_for_eval "$install_override_mode" + func_append install_shared_prog " -m $func_quote_for_eval_result" + fi + fi + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=: + if $isdir; then + destdir=$dest + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir=$func_dirname_result + destname=$func_basename_result + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "'$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "'$destdir' must be an absolute directory name" + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic=$magic + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + func_append staticlibs " $file" + ;; + + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) func_append current_libdirs " $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) func_append future_libdirs " $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir=$func_dirname_result + func_append dir "$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking '$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname=$1 + shift + + srcname=$realname + test -n "$relink_command" && srcname=${realname}T + + # Install the shared library and build the symlinks. + func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme=$stripme + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme= + ;; + esac + ;; + os2*) + case $realname in + *_dll.a) + tstripme= + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try 'ln -sf' first, because the 'ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib=$destdir/$realname + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name=$func_basename_result + instname=$dir/${name}i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && func_append staticlibs " $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile=$destdir/$destname + else + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest=$destfile + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to '$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test yes = "$build_old_libs"; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile=$destdir/$destname + else + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext= + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=.exe + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script '$wrapper'" + + finalize=: + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "'$lib' has not been installed in '$libdir'" + finalize=false + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test no = "$fast_install" && test -n "$relink_command"; then + $opt_dry_run || { + if $finalize; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file=$func_basename_result + outputname=$tmpdir/$file + # Replace the output file specification. + relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_quiet || { + func_quote_for_expand "$relink_command" + eval "func_echo $func_quote_for_expand_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink '$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file=$outputname + else + func_warning "cannot relink '$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name=$func_basename_result + + # Set up the ranlib parameters. + oldlib=$destdir/$name + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $tool_oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run '$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test install = "$opt_mode" && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $debug_cmd + + my_outputname=$1 + my_originator=$2 + my_pic_p=${3-false} + my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms=${my_outputname}S.c + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist=$output_objdir/$my_outputname.nm + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +#if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" +#endif + +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* External symbol declarations for the compiler. */\ +" + + if test yes = "$dlself"; then + func_verbose "generating symbol list for '$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_to_tool_file "$progfile" func_convert_file_msys_to_w32 + func_verbose "extracting global C symbols from '$func_to_tool_file_result'" + $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols=$output_objdir/$outputname.exp + $opt_dry_run || { + $RM $export_symbols + eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from '$dlprefile'" + func_basename "$dlprefile" + name=$func_basename_result + case $host in + *cygwin* | *mingw* | *cegcc* ) + # if an import library, we need to obtain dlname + if func_win32_import_lib_p "$dlprefile"; then + func_tr_sh "$dlprefile" + eval "curr_lafile=\$libfile_$func_tr_sh_result" + dlprefile_dlbasename= + if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then + # Use subshell, to avoid clobbering current variable values + dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` + if test -n "$dlprefile_dlname"; then + func_basename "$dlprefile_dlname" + dlprefile_dlbasename=$func_basename_result + else + # no lafile. user explicitly requested -dlpreopen . + $sharedlib_from_linklib_cmd "$dlprefile" + dlprefile_dlbasename=$sharedlib_from_linklib_result + fi + fi + $opt_dry_run || { + if test -n "$dlprefile_dlbasename"; then + eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' + else + func_warning "Could not compute DLL name from $name" + eval '$ECHO ": $name " >> "$nlist"' + fi + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + } + else # not an import lib + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + fi + ;; + *) + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + ;; + esac + done + + $opt_dry_run || { + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $MV "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if $GREP -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + $GREP -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + func_show_eval '$RM "${nlist}I"' + if test -n "$global_symbol_to_import"; then + eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' + fi + + echo >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +extern LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[];\ +" + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ +static void lt_syminit(void) +{ + LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; + for (; symbol->name; ++symbol) + {" + $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" + echo >> "$output_objdir/$my_dlsyms" "\ + } +}" + fi + echo >> "$output_objdir/$my_dlsyms" "\ +LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{ {\"$my_originator\", (void *) 0}," + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ + {\"@INIT@\", (void *) <_syminit}," + fi + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + echo >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + $my_pic_p && pic_flag_for_symtable=" $pic_flag" + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) func_append symtab_cflags " $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' + + # Transform the symbol file into the correct name. + symfileobj=$output_objdir/${my_outputname}S.$objext + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for '$my_dlsyms'" + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` + fi +} + +# func_cygming_gnu_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is a GNU/binutils-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_gnu_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` + test -n "$func_cygming_gnu_implib_tmp" +} + +# func_cygming_ms_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is an MS-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_ms_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` + test -n "$func_cygming_ms_implib_tmp" +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +# Despite the name, also deal with 64 bit binaries. +func_win32_libid () +{ + $debug_cmd + + win32_libid_type=unknown + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then + case $nm_interface in + "MS dumpbin") + if func_cygming_ms_implib_p "$1" || + func_cygming_gnu_implib_p "$1" + then + win32_nmres=import + else + win32_nmres= + fi + ;; + *) + func_to_tool_file "$1" func_convert_file_msys_to_w32 + win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | + $SED -n -e ' + 1,100{ + / I /{ + s|.*|import| + p + q + } + }'` + ;; + esac + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + +# func_cygming_dll_for_implib ARG +# +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib () +{ + $debug_cmd + + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` +} + +# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs +# +# The is the core of a fallback implementation of a +# platform-specific function to extract the name of the +# DLL associated with the specified import library LIBNAME. +# +# SECTION_NAME is either .idata$6 or .idata$7, depending +# on the platform and compiler that created the implib. +# +# Echos the name of the DLL associated with the +# specified import library. +func_cygming_dll_for_implib_fallback_core () +{ + $debug_cmd + + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` + $OBJDUMP -s --section "$1" "$2" 2>/dev/null | + $SED '/^Contents of section '"$match_literal"':/{ + # Place marker at beginning of archive member dllname section + s/.*/====MARK====/ + p + d + } + # These lines can sometimes be longer than 43 characters, but + # are always uninteresting + /:[ ]*file format pe[i]\{,1\}-/d + /^In archive [^:]*:/d + # Ensure marker is printed + /^====MARK====/p + # Remove all lines with less than 43 characters + /^.\{43\}/!d + # From remaining lines, remove first 43 characters + s/^.\{43\}//' | + $SED -n ' + # Join marker and all lines until next marker into a single line + /^====MARK====/ b para + H + $ b para + b + :para + x + s/\n//g + # Remove the marker + s/^====MARK====// + # Remove trailing dots and whitespace + s/[\. \t]*$// + # Print + /./p' | + # we now have a list, one entry per line, of the stringified + # contents of the appropriate section of all members of the + # archive that possess that section. Heuristic: eliminate + # all those that have a first or second character that is + # a '.' (that is, objdump's representation of an unprintable + # character.) This should work for all archives with less than + # 0x302f exports -- but will fail for DLLs whose name actually + # begins with a literal '.' or a single character followed by + # a '.'. + # + # Of those that remain, print the first one. + $SED -e '/^\./d;/^.\./d;q' +} + +# func_cygming_dll_for_implib_fallback ARG +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# +# This fallback implementation is for use when $DLLTOOL +# does not support the --identify-strict option. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib_fallback () +{ + $debug_cmd + + if func_cygming_gnu_implib_p "$1"; then + # binutils import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` + elif func_cygming_ms_implib_p "$1"; then + # ms-generated import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` + else + # unknown + sharedlib_from_linklib_result= + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $debug_cmd + + f_ex_an_ar_dir=$1; shift + f_ex_an_ar_oldlib=$1 + if test yes = "$lock_old_archive_extraction"; then + lockfile=$f_ex_an_ar_oldlib.lock + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + fi + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ + 'stat=$?; rm -f "$lockfile"; exit $stat' + if test yes = "$lock_old_archive_extraction"; then + $opt_dry_run || rm -f "$lockfile" + fi + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $debug_cmd + + my_gentop=$1; shift + my_oldlibs=${1+"$@"} + my_oldobjs= + my_xlib= + my_xabs= + my_xdir= + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib=$func_basename_result + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir=$my_gentop/$my_xlib_u + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + func_basename "$darwin_archive" + darwin_base_archive=$func_basename_result + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches; do + func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch" + $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive" + cd "unfat-$$/$darwin_base_archive-$darwin_arch" + func_extract_an_archive "`pwd`" "$darwin_base_archive" + cd "$darwin_curdir" + $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` + done + + func_extract_archives_result=$my_oldobjs +} + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory where it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=${1-no} + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$ECHO are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + file=\"\$0\"" + + qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` + $ECHO "\ + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + ECHO=\"$qECHO\" + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ that is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options that match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's $0 value, followed by "$@". +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=\$0 + shift + for lt_opt + do + case \"\$lt_opt\" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` + cat \"\$lt_dump_D/\$lt_dump_F\" + exit 0 + ;; + --lt-*) + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n \"\$lt_option_debug\"; then + echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from \$@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + case \" \$* \" in + *\\ --lt-*) + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done ;; + esac + func_exec_program_core \${1+\"\$@\"} +} + + # Parse options + func_parse_lt_options \"\$0\" \${1+\"\$@\"} + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` + done + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test yes = "$fast_install"; then + $ECHO "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $MKDIR \"\$progdir\" + else + $RM \"\$progdir/\$file\" + fi" + + $ECHO "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + \$ECHO \"\$relink_command_output\" >&2 + $RM \"\$progdir/\$file\" + exit 1 + fi + fi + + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $RM \"\$progdir/\$program\"; + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $RM \"\$progdir/\$file\" + fi" + else + $ECHO "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # fixup the dll searchpath if we need to. + # + # Fix the DLL searchpath if we need to. Do this before prepending + # to shlibpath, because on Windows, both are PATH and uninstalled + # libraries must come first. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + # Export our shlibpath_var if we have one. + if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` + + export $shlibpath_var +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + func_exec_program \${1+\"\$@\"} + fi + else + # The program doesn't exist. + \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 + \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" +} + + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat < +#include +#ifdef _MSC_VER +# include +# include +# include +#else +# include +# include +# ifdef __CYGWIN__ +# include +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* declarations of non-ANSI functions */ +#if defined __MINGW32__ +# ifdef __STRICT_ANSI__ +int _putenv (const char *); +# endif +#elif defined __CYGWIN__ +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +/* #elif defined other_platform || defined ... */ +#endif + +/* portability defines, excluding path handling macros */ +#if defined _MSC_VER +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +# define S_IXUSR _S_IEXEC +#elif defined __MINGW32__ +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +#elif defined __CYGWIN__ +# define HAVE_SETENV +# define FOPEN_WB "wb" +/* #elif defined other platforms ... */ +#endif + +#if defined PATH_MAX +# define LT_PATHMAX PATH_MAX +#elif defined MAXPATHLEN +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +/* path handling portability macros */ +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \ + defined __OS2__ +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free (stale); stale = 0; } \ +} while (0) + +#if defined LT_DEBUGWRAPPER +static int lt_debug = 1; +#else +static int lt_debug = 0; +#endif + +const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_debugprintf (const char *file, int line, const char *fmt, ...); +void lt_fatal (const char *file, int line, const char *message, ...); +static const char *nonnull (const char *s); +static const char *nonempty (const char *s); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); +char **prepare_spawn (char **argv); +void lt_dump_script (FILE *f); +EOF + + cat <= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", + nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + size_t tmp_len; + char *concat_name; + + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", + nonempty (wrapper)); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined HAVE_DOS_BASED_FILE_SYSTEM + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined HAVE_DOS_BASED_FILE_SYSTEM + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = (size_t) (q - p); + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + lt_debugprintf (__FILE__, __LINE__, + "checking path component for symlinks: %s\n", + tmp_pathspec); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + lt_fatal (__FILE__, __LINE__, + "error accessing file \"%s\": %s", + tmp_pathspec, nonnull (strerror (errno))); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal (__FILE__, __LINE__, + "could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (STREQ (str, pat)) + *str = '\0'; + } + return str; +} + +void +lt_debugprintf (const char *file, int line, const char *fmt, ...) +{ + va_list args; + if (lt_debug) + { + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); + } +} + +static void +lt_error_core (int exit_status, const char *file, + int line, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *file, int line, const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); + va_end (ap); +} + +static const char * +nonnull (const char *s) +{ + return s ? s : "(null)"; +} + +static const char * +nonempty (const char *s) +{ + return (s && !*s) ? "(empty)" : nonnull (s); +} + +void +lt_setenv (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_setenv) setting '%s' to '%s'\n", + nonnull (name), nonnull (value)); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + size_t len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + size_t orig_value_len = strlen (orig_value); + size_t add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + size_t len = strlen (new_value); + while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[--len] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +EOF + case $host_os in + mingw*) + cat <<"EOF" + +/* Prepares an argument vector before calling spawn(). + Note that spawn() does not by itself call the command interpreter + (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : + ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&v); + v.dwPlatformId == VER_PLATFORM_WIN32_NT; + }) ? "cmd.exe" : "command.com"). + Instead it simply concatenates the arguments, separated by ' ', and calls + CreateProcess(). We must quote the arguments since Win32 CreateProcess() + interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a + special way: + - Space and tab are interpreted as delimiters. They are not treated as + delimiters if they are surrounded by double quotes: "...". + - Unescaped double quotes are removed from the input. Their only effect is + that within double quotes, space and tab are treated like normal + characters. + - Backslashes not followed by double quotes are not special. + - But 2*n+1 backslashes followed by a double quote become + n backslashes followed by a double quote (n >= 0): + \" -> " + \\\" -> \" + \\\\\" -> \\" + */ +#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +char ** +prepare_spawn (char **argv) +{ + size_t argc; + char **new_argv; + size_t i; + + /* Count number of arguments. */ + for (argc = 0; argv[argc] != NULL; argc++) + ; + + /* Allocate new argument vector. */ + new_argv = XMALLOC (char *, argc + 1); + + /* Put quoted arguments into the new argument vector. */ + for (i = 0; i < argc; i++) + { + const char *string = argv[i]; + + if (string[0] == '\0') + new_argv[i] = xstrdup ("\"\""); + else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) + { + int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); + size_t length; + unsigned int backslashes; + const char *s; + char *quoted_string; + char *p; + + length = 0; + backslashes = 0; + if (quote_around) + length++; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + length += backslashes + 1; + length++; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + length += backslashes + 1; + + quoted_string = XMALLOC (char, length + 1); + + p = quoted_string; + backslashes = 0; + if (quote_around) + *p++ = '"'; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + { + unsigned int j; + for (j = backslashes + 1; j > 0; j--) + *p++ = '\\'; + } + *p++ = c; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + { + unsigned int j; + for (j = backslashes; j > 0; j--) + *p++ = '\\'; + *p++ = '"'; + } + *p = '\0'; + + new_argv[i] = quoted_string; + } + else + new_argv[i] = (char *) string; + } + new_argv[argc] = NULL; + + return new_argv; +} +EOF + ;; + esac + + cat <<"EOF" +void lt_dump_script (FILE* f) +{ +EOF + func_emit_wrapper yes | + $SED -n -e ' +s/^\(.\{79\}\)\(..*\)/\1\ +\2/ +h +s/\([\\"]\)/\\\1/g +s/$/\\n/ +s/\([^\n]*\).*/ fputs ("\1", f);/p +g +D' + cat <<"EOF" +} +EOF +} +# end: func_emit_cwrapperexe_src + +# func_win32_import_lib_p ARG +# True if ARG is an import lib, as indicated by $file_magic_cmd +func_win32_import_lib_p () +{ + $debug_cmd + + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in + *import*) : ;; + *) false ;; + esac +} + +# func_suncc_cstd_abi +# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! +# Several compiler flags select an ABI that is incompatible with the +# Cstd library. Avoid specifying it if any are in CXXFLAGS. +func_suncc_cstd_abi () +{ + $debug_cmd + + case " $compile_command " in + *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) + suncc_use_cstd_abi=no + ;; + *) + suncc_use_cstd_abi=yes + ;; + esac +} + +# func_mode_link arg... +func_mode_link () +{ + $debug_cmd + + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # what system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll that has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + bindir= + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + os2dllname= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=false + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + single_module=$wl-single_module + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test yes != "$build_libtool_libs" \ + && func_fatal_configuration "cannot build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg=$1 + shift + func_quote_for_eval "$arg" + qarg=$func_quote_for_eval_unquoted_result + func_append libtool_args " $func_quote_for_eval_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" + ;; + esac + + case $prev in + bindir) + bindir=$arg + prev= + continue + ;; + dlfiles|dlprefiles) + $preload || { + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=: + } + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test no = "$dlself"; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test dlprefiles = "$prev"; then + dlself=yes + elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test dlfiles = "$prev"; then + func_append dlfiles " $arg" + else + func_append dlprefiles " $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols=$arg + test -f "$arg" \ + || func_fatal_error "symbol file '$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex=$arg + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) func_append deplibs " $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir=$arg + prev= + continue + ;; + mllvm) + # Clang does not use LLVM to link, so we can simply discard any + # '-mllvm $arg' options when doing the link step. + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# func_append moreargs " $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + if test none != "$pic_object"; then + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + fi + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object=$pic_object + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file '$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + os2dllname) + os2dllname=$arg + prev= + continue + ;; + precious_regex) + precious_files_regex=$arg + prev= + continue + ;; + release) + release=-$arg + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test rpath = "$prev"; then + case "$rpath " in + *" $arg "*) ;; + *) func_append rpath " $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) func_append xrpath " $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds=$arg + prev= + continue + ;; + weak) + func_append weak_libs " $arg" + prev= + continue + ;; + xcclinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $wl$qarg" + prev= + func_append compile_command " $wl$qarg" + func_append finalize_command " $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg=$arg + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + # See comment for -static flag below, for more details. + func_append compile_command " $link_static_flag" + func_append finalize_command " $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "'-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -bindir) + prev=bindir + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test X-export-symbols = "X$arg"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + func_append compile_command " $arg" + func_append finalize_command " $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname "-L" '' "$arg" + if test -z "$func_stripname_result"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between '-L' and '$1'" + else + func_fatal_error "need path for '-L' option" + fi + fi + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of '$dir'" + dir=$absdir + ;; + esac + case "$deplibs " in + *" -L$dir "* | *" $arg "*) + # Will only happen for absolute or sysroot arguments + ;; + *) + # Preserve sysroot, but never include relative directories + case $dir in + [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; + *) func_append deplibs " -L$dir" ;; + esac + func_append lib_search_path " $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) func_append dllsearchpath ":$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test X-lc = "X$arg" || test X-lm = "X$arg"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test X-lc = "X$arg" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + # Do not include libc due to us having libc/libc_r. + test X-lc = "X$arg" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + func_append deplibs " System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test X-lc = "X$arg" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test X-lc = "X$arg" && continue + ;; + esac + elif test X-lc_r = "X$arg"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + func_append deplibs " $arg" + continue + ;; + + -mllvm) + prev=mllvm + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot|--sysroot) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) func_append new_inherited_linker_flags " $arg" ;; + esac + continue + ;; + + -multi_module) + single_module=$wl-multi_module + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "'-no-install' is ignored for $host" + func_warning "assuming '-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -os2dllname) + prev=os2dllname + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + =*) + func_stripname '=' '' "$dir" + dir=$lt_sysroot$func_stripname_result + ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs=$IFS; IFS=, + for flag in $args; do + IFS=$save_ifs + func_quote_for_eval "$flag" + func_append arg " $func_quote_for_eval_result" + func_append compiler_flags " $func_quote_for_eval_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs=$IFS; IFS=, + for flag in $args; do + IFS=$save_ifs + func_quote_for_eval "$flag" + func_append arg " $wl$func_quote_for_eval_result" + func_append compiler_flags " $wl$func_quote_for_eval_result" + func_append linker_flags " $func_quote_for_eval_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + + # Flags to be passed through unchanged, with rationale: + # -64, -mips[0-9] enable 64-bit mode for the SGI compiler + # -r[0-9][0-9]* specify processor for the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler + # +DA*, +DD* enable 64-bit mode for the HP compiler + # -q* compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* architecture-specific flags for GCC + # -F/path path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* profiling flags for GCC + # -fstack-protector* stack protector flags for GCC + # @file GCC response files + # -tp=* Portland pgcc target processor selection + # --sysroot=* for sysroot support + # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + # -stdlib=* select c++ std lib with clang + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ + -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + func_append compile_command " $arg" + func_append finalize_command " $arg" + func_append compiler_flags " $arg" + continue + ;; + + -Z*) + if test os2 = "`expr $host : '.*\(os2\)'`"; then + # OS/2 uses -Zxxx to specify OS/2-specific options + compiler_flags="$compiler_flags $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case $arg in + -Zlinker | -Zstack) + prev=xcompiler + ;; + esac + continue + else + # Otherwise treat like 'Some other compiler flag' below + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + fi + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + + *.$objext) + # A standard object. + func_append objs " $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + test none = "$pic_object" || { + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + } + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object=$pic_object + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + func_append deplibs " $arg" + func_append old_deplibs " $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + func_resolve_sysroot "$arg" + if test dlfiles = "$prev"; then + # This library was specified with -dlopen. + func_append dlfiles " $func_resolve_sysroot_result" + prev= + elif test dlprefiles = "$prev"; then + # The library was specified with -dlpreopen. + func_append dlprefiles " $func_resolve_sysroot_result" + prev= + else + func_append deplibs " $func_resolve_sysroot_result" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the '$prevarg' option requires an argument" + + if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname=$func_basename_result + libobjs_save=$libobjs + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + # Definition is injected by LT_CONFIG during libtool generation. + func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" + + func_dirname "$output" "/" "" + output_objdir=$func_dirname_result$objdir + func_to_tool_file "$output_objdir/" + tool_output_objdir=$func_to_tool_file_result + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if $opt_preserve_dup_deps; then + case "$libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append libs " $deplib" + done + + if test lib = "$linkmode"; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; + esac + func_append pre_post_deps " $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + + case $linkmode in + lib) + passes="conv dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can '-dlopen' only libtool libraries: $file" + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=false + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + + for pass in $passes; do + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test lib,link = "$linkmode,$pass"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs=$tmp_deplibs + fi + + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass"; then + libs=$deplibs + deplibs= + fi + if test prog = "$linkmode"; then + case $pass in + dlopen) libs=$dlfiles ;; + dlpreopen) libs=$dlprefiles ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test lib,dlpreopen = "$linkmode,$pass"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + func_resolve_sysroot "$lib" + case $lib in + *.la) func_source "$func_resolve_sysroot_result" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + func_basename "$deplib" + deplib_base=$func_basename_result + case " $weak_libs " in + *" $deplib_base "*) ;; + *) func_append deplibs " $deplib" ;; + esac + done + done + libs=$dlprefiles + fi + if test dlopen = "$pass"; then + # Collect dlpreopened libraries + save_deplibs=$deplibs + deplibs= + fi + + for deplib in $libs; do + lib= + found=false + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append compiler_flags " $deplib" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test lib != "$linkmode" && test prog != "$linkmode"; then + func_warning "'-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test lib = "$linkmode"; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib=$searchdir/lib$name$search_ext + if test -f "$lib"; then + if test .la = "$search_ext"; then + found=: + else + found=false + fi + break 2 + fi + done + done + if $found; then + # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll=$l + done + if test "X$ll" = "X$old_library"; then # only static version available + found=false + func_dirname "$lib" "" "." + ladir=$func_dirname_result + lib=$ladir/$old_library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + else + # deplib doesn't seem to be a libtool library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + ;; # -l + *.ltframework) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test conv = "$pass" && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + prog) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + if test scan = "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + *) + func_warning "'-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test link = "$pass"; then + func_stripname '-R' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) + func_resolve_sysroot "$deplib" + lib=$func_resolve_sysroot_result + ;; + *.$libext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=false + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=: + fi + ;; + pass_all) + valid_a_lib=: + ;; + esac + if $valid_a_lib; then + echo + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + else + echo + $ECHO "*** Warning: Trying to link with static lib archive $deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because the file extensions .$libext of this argument makes me believe" + echo "*** that it is just a static archive that I should not use here." + fi + ;; + esac + continue + ;; + prog) + if test link != "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + elif test prog = "$linkmode"; then + if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + func_append newdlprefiles " $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append newdlfiles " $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=: + continue + ;; + esac # case $deplib + + $found || test -f "$lib" \ + || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "'$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir=$func_dirname_result + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass" || + { test prog != "$linkmode" && test lib != "$linkmode"; }; then + test -n "$dlopen" && func_append dlfiles " $dlopen" + test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" + fi + + if test conv = "$pass"; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for '$lib'" + fi + # It is a libtool convenience library, so add in its objects. + func_append convenience " $ladir/$objdir/$old_library" + func_append old_convenience " $ladir/$objdir/$old_library" + elif test prog != "$linkmode" && test lib != "$linkmode"; then + func_fatal_error "'$lib' is not a convenience library" + fi + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + if test -n "$old_library" && + { test yes = "$prefer_static_libs" || + test built,no = "$prefer_static_libs,$installed"; }; then + linklib=$old_library + else + for l in $old_library $library_names; do + linklib=$l + done + fi + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for '$lib'" + fi + + # This library was specified with -dlopen. + if test dlopen = "$pass"; then + test -z "$libdir" \ + && func_fatal_error "cannot -dlopen a convenience library: '$lib'" + if test -z "$dlname" || + test yes != "$dlopen_support" || + test no = "$build_libtool_libs" + then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + func_append dlprefiles " $lib $dependency_libs" + else + func_append newdlfiles " $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + func_warning "cannot determine absolute directory name of '$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir=$ladir + fi + ;; + esac + func_basename "$lib" + laname=$func_basename_result + + # Find the relevant object directory and library name. + if test yes = "$installed"; then + if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library '$lib' was moved." + dir=$ladir + absdir=$abs_ladir + libdir=$abs_ladir + else + dir=$lt_sysroot$libdir + absdir=$lt_sysroot$libdir + fi + test yes = "$hardcode_automatic" && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir=$ladir + absdir=$abs_ladir + # Remove this search path later + func_append notinst_path " $abs_ladir" + else + dir=$ladir/$objdir + absdir=$abs_ladir/$objdir + # Remove this search path later + func_append notinst_path " $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test dlpreopen = "$pass"; then + if test -z "$libdir" && test prog = "$linkmode"; then + func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'" + fi + case $host in + # special handling for platforms with PE-DLLs. + *cygwin* | *mingw* | *cegcc* ) + # Linker will automatically link against shared library if both + # static and shared are present. Therefore, ensure we extract + # symbols from the import library if a shared library is present + # (otherwise, the dlopen module name will be incorrect). We do + # this by putting the import library name into $newdlprefiles. + # We recover the dlopen module name by 'saving' the la file + # name in a special purpose variable, and (later) extracting the + # dlname from the la file. + if test -n "$dlname"; then + func_tr_sh "$dir/$linklib" + eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" + func_append newdlprefiles " $dir/$linklib" + else + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + fi + ;; + * ) + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + func_append newdlprefiles " $dir/$dlname" + else + func_append newdlprefiles " $dir/$linklib" + fi + ;; + esac + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test lib = "$linkmode"; then + deplibs="$dir/$old_library $deplibs" + elif test prog,link = "$linkmode,$pass"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test prog = "$linkmode" && test link != "$pass"; then + func_append newlib_search_path " $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=false + if test no != "$link_all_deplibs" || test -z "$library_names" || + test no = "$build_libtool_libs"; then + linkalldeplibs=: + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + esac + # Need to link against all dependency_libs? + if $linkalldeplibs; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test prog,link = "$linkmode,$pass"; then + if test -n "$library_names" && + { { test no = "$prefer_static_libs" || + test built,yes = "$prefer_static_libs,$installed"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then + # Make sure the rpath contains only unique directories. + case $temp_rpath: in + *"$absdir:"*) ;; + *) func_append temp_rpath "$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if $alldeplibs && + { test pass_all = "$deplibs_check_method" || + { test yes = "$build_libtool_libs" && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test built = "$use_static_libs" && test yes = "$installed"; then + use_static_libs=no + fi + if test -n "$library_names" && + { test no = "$use_static_libs" || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc* | *os2*) + # No point in relinking DLLs because paths are not encoded + func_append notinst_deplibs " $lib" + need_relink=no + ;; + *) + if test no = "$installed"; then + func_append notinst_deplibs " $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule= + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule=$dlpremoduletest + break + fi + done + if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then + echo + if test prog = "$linkmode"; then + $ECHO "*** Warning: Linking the executable $output against the loadable module" + else + $ECHO "*** Warning: Linking the shared library $output against the loadable module" + fi + $ECHO "*** $linklib is not portable!" + fi + if test lib = "$linkmode" && + test yes = "$hardcode_into_libs"; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname=$1 + shift + libname=`eval "\\$ECHO \"$libname_spec\""` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname=$dlname + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw* | *cegcc* | *os2*) + func_arith $current - $age + major=$func_arith_result + versuffix=-$major + ;; + esac + eval soname=\"$soname_spec\" + else + soname=$realname + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot=$soname + func_basename "$soroot" + soname=$func_basename_result + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from '$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for '$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test prog = "$linkmode" || test relink != "$opt_mode"; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test no = "$hardcode_direct"; then + add=$dir/$linklib + case $host in + *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;; + *-*-sysv4*uw2*) add_dir=-L$dir ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir=-L$dir ;; + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we cannot + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null; then + if test "X$dlopenmodule" != "X$lib"; then + $ECHO "*** Warning: lib $linklib is a module, not a shared library" + if test -z "$old_library"; then + echo + echo "*** And there doesn't seem to be a static archive available" + echo "*** The link will probably fail, sorry" + else + add=$dir/$old_library + fi + elif test -n "$old_library"; then + add=$dir/$old_library + fi + fi + esac + elif test no = "$hardcode_minus_L"; then + case $host in + *-*-sunos*) add_shlibpath=$dir ;; + esac + add_dir=-L$dir + add=-l$name + elif test no = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + relink) + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$dir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$absdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test yes != "$lib_linked"; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) func_append compile_shlibpath "$add_shlibpath:" ;; + esac + fi + if test prog = "$linkmode"; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test yes != "$hardcode_direct" && + test yes != "$hardcode_minus_L" && + test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + fi + fi + fi + + if test prog = "$linkmode" || test relink = "$opt_mode"; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$libdir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$libdir + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + add=-l$name + elif test yes = "$hardcode_automatic"; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib"; then + add=$inst_prefix_dir$libdir/$linklib + else + add=$libdir/$linklib + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir=-L$libdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + fi + + if test prog = "$linkmode"; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test prog = "$linkmode"; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test unsupported != "$hardcode_direct"; then + test -n "$old_library" && linklib=$old_library + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test yes = "$build_libtool_libs"; then + # Not a shared library + if test pass_all != "$deplibs_check_method"; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + echo + $ECHO "*** Warning: This system cannot link to static lib archive $lib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + if test yes = "$module"; then + echo "*** But as you try to build a module library, libtool will still create " + echo "*** a static module, that should work as long as the dlopening application" + echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using 'nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** 'nm' from GNU binutils and a full rebuild may help." + fi + if test no = "$build_old_libs"; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test lib = "$linkmode"; then + if test -n "$dependency_libs" && + { test yes != "$hardcode_into_libs" || + test yes = "$build_old_libs" || + test yes = "$link_static"; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) func_append xrpath " $temp_xrpath";; + esac;; + *) func_append temp_deplibs " $libdir";; + esac + done + dependency_libs=$temp_deplibs + fi + + func_append newlib_search_path " $absdir" + # Link against this library + test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result";; + *) func_resolve_sysroot "$deplib" ;; + esac + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $func_resolve_sysroot_result "*) + func_append specialdeplibs " $func_resolve_sysroot_result" ;; + esac + fi + func_append tmp_libs " $func_resolve_sysroot_result" + done + + if test no != "$link_all_deplibs"; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + path= + case $deplib in + -L*) path=$deplib ;; + *.la) + func_resolve_sysroot "$deplib" + deplib=$func_resolve_sysroot_result + func_dirname "$deplib" "" "." + dir=$func_dirname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of '$dir'" + absdir=$dir + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names"; then + for tmp in $deplibrary_names; do + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl"; then + depdepl=$absdir/$objdir/$depdepl + darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`$OTOOL64 -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl" + func_append linker_flags " -dylib_file $darwin_install_name:$depdepl" + path= + fi + fi + ;; + *) + path=-L$absdir/$objdir + ;; + esac + else + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "'$deplib' seems to be moved" + + path=-L$absdir + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test link = "$pass"; then + if test prog = "$linkmode"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs=$newdependency_libs + if test dlpreopen = "$pass"; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test dlopen != "$pass"; then + test conv = "$pass" || { + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) func_append lib_search_path " $dir" ;; + esac + done + newlib_search_path= + } + + if test prog,link = "$linkmode,$pass"; then + vars="compile_deplibs finalize_deplibs" + else + vars=deplibs + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) func_append tmp_libs " $deplib" ;; + esac + ;; + *) func_append tmp_libs " $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + + # Add Sun CC postdeps if required: + test CXX = "$tagname" && { + case $host_os in + linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C++ 5.9 + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + + solaris*) + func_cc_basename "$CC" + case $func_cc_basename_result in + CC* | sunCC*) + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + esac + } + + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i= + ;; + esac + if test -n "$i"; then + func_append tmp_libs " $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test prog = "$linkmode"; then + dlfiles=$newdlfiles + fi + if test prog = "$linkmode" || test lib = "$linkmode"; then + dlprefiles=$newdlprefiles + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "'-l' and '-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "'-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "'-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "'-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "'-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "'-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs=$output + func_append objs "$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form 'libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test no = "$module" \ + && func_fatal_help "libtool library '$output' must begin with 'lib'" + + if test no != "$need_lib_prefix"; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test pass_all != "$deplibs_check_method"; then + func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs" + else + echo + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" + func_append libobjs " $objs" + fi + fi + + test no = "$dlself" \ + || func_warning "'-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test 1 -lt "$#" \ + && func_warning "ignoring multiple '-rpath's for a libtool library" + + install_libdir=$1 + + oldlibs= + if test -z "$rpath"; then + if test yes = "$build_libtool_libs"; then + # Building a libtool convenience library. + # Some compilers have problems with a '.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + test -n "$vinfo" && \ + func_warning "'-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "'-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs=$IFS; IFS=: + set dummy $vinfo 0 0 0 + shift + IFS=$save_ifs + + test -n "$7" && \ + func_fatal_help "too many parameters to '-version-info'" + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major=$1 + number_minor=$2 + number_revision=$3 + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # that has an extra 1 added just for fun + # + case $version_type in + # correct linux to gnu/linux during the next big refactor + darwin|freebsd-elf|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_revision + ;; + freebsd-aout|qnx|sunos) + current=$number_major + revision=$number_minor + age=0 + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_minor + lt_irix_increment=no + ;; + esac + ;; + no) + current=$1 + revision=$2 + age=$3 + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "CURRENT '$current' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "REVISION '$revision' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "AGE '$age' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE '$age' is greater than the current interface number '$current'" + func_fatal_error "'$vinfo' is not valid version information" + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + # On Darwin other compilers + case $CC in + nagfor*) + verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + ;; + *) + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + esac + ;; + + freebsd-aout) + major=.$current + versuffix=.$current.$revision + ;; + + freebsd-elf) + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + irix | nonstopux) + if test no = "$lt_irix_increment"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring=$verstring_prefix$major.$revision + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test 0 -ne "$loop"; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring=$verstring_prefix$major.$iface:$verstring + done + + # Before this point, $major must not contain '.'. + major=.$major + versuffix=$major.$revision + ;; + + linux) # correct to gnu/linux during the next big refactor + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + versuffix=.$current.$age.$revision + verstring=$current.$age.$revision + + # Add in all the interfaces that we are compatible with. + loop=$age + while test 0 -ne "$loop"; do + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring=$verstring:$iface.0 + done + + # Make executables depend on our current version. + func_append verstring ":$current.0" + ;; + + qnx) + major=.$current + versuffix=.$current + ;; + + sco) + major=.$current + versuffix=.$current + ;; + + sunos) + major=.$current + versuffix=.$current.$revision + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 file systems. + func_arith $current - $age + major=$func_arith_result + versuffix=-$major + ;; + + *) + func_fatal_configuration "unknown library version type '$version_type'" + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring=0.0 + ;; + esac + if test no = "$need_version"; then + versuffix= + else + versuffix=.0.0 + fi + fi + + # Remove version info from name if versioning should be avoided + if test yes,no = "$avoid_version,$need_version"; then + major= + versuffix= + verstring= + fi + + # Check to see if the archive will have undefined symbols. + if test yes = "$allow_undefined"; then + if test unsupported = "$allow_undefined_flag"; then + if test yes = "$build_old_libs"; then + func_warning "undefined symbols not allowed in $host shared libraries; building static only" + build_libtool_libs=no + else + func_fatal_error "can't build $host shared library unless -no-undefined is specified" + fi + fi + else + # Don't allow undefined symbols. + allow_undefined_flag=$no_undefined_flag + fi + + fi + + func_generate_dlsyms "$libname" "$libname" : + func_append libobjs " $symfileobj" + test " " = "$libobjs" && libobjs= + + if test relink != "$opt_mode"; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*) + if test -n "$precious_files_regex"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + func_append removelist " $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then + func_append oldlibs " $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` + # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` + # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + func_replace_sysroot "$libdir" + func_append temp_xrpath " -R$func_replace_sysroot_result" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles=$dlfiles + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) func_append dlfiles " $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles=$dlprefiles + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) func_append dlprefiles " $lib" ;; + esac + done + + if test yes = "$build_libtool_libs"; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + func_append deplibs " System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test yes = "$build_libtool_need_lc"; then + func_append deplibs " -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release= + versuffix= + major= + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $opt_dry_run || $RM conftest.c + cat > conftest.c </dev/null` + $nocaseglob + else + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + fi + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib=$potent_lib + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | $SED 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;; + *) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib= + break 2 + fi + done + done + fi + if test -n "$a_deplib"; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib"; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $a_deplib "*) + func_append newdeplibs " $a_deplib" + a_deplib= + ;; + esac + fi + if test -n "$a_deplib"; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib=$potent_lib # see symlink-check above in file_magic test + if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib= + break 2 + fi + done + done + fi + if test -n "$a_deplib"; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib"; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs= + tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + for i in $predeps $postdeps; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"` + done + fi + case $tmp_deplibs in + *[!\ \ ]*) + echo + if test none = "$deplibs_check_method"; then + echo "*** Warning: inter-library dependencies are not supported in this platform." + else + echo "*** Warning: inter-library dependencies are not known to be supported." + fi + echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + ;; + esac + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + if test yes = "$droppeddeps"; then + if test yes = "$module"; then + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" + $ECHO "*** dependencies of module $libname. Therefore, libtool will create" + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using 'nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** 'nm' from GNU binutils and a full rebuild may help." + fi + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." + + if test no = "$allow_undefined"; then + echo + echo "*** Since this library must not contain undefined symbols," + echo "*** because either the platform does not support them or" + echo "*** it was explicitly requested with -no-undefined," + echo "*** libtool will only create a static version of it." + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + deplibs=$new_libs + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test yes = "$build_libtool_libs"; then + # Remove $wl instances when linking with ld. + # FIXME: should test the right _cmds variable. + case $archive_cmds in + *\$LD\ *) wl= ;; + esac + if test yes = "$hardcode_into_libs"; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath=$finalize_rpath + test relink = "$opt_mode" || rpath=$compile_rpath$rpath + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + func_replace_sysroot "$libdir" + libdir=$func_replace_sysroot_result + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append dep_rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath=$finalize_shlibpath + test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + shift + realname=$1 + shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname=$realname + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib=$output_objdir/$realname + linknames= + for link + do + func_append linknames " $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols=$output_objdir/$libname.uexp + func_append delfiles " $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + func_dll_def_p "$export_symbols" || { + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols=$export_symbols + export_symbols= + always_export_symbols=yes + } + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs=$IFS; IFS='~' + for cmd1 in $cmds; do + IFS=$save_ifs + # Take the normal branch if the nm_file_list_spec branch + # doesn't work or if tool conversion is not needed. + case $nm_file_list_spec~$to_tool_file_cmd in + *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) + try_normal_branch=yes + eval cmd=\"$cmd1\" + func_len " $cmd" + len=$func_len_result + ;; + *) + try_normal_branch=no + ;; + esac + if test yes = "$try_normal_branch" \ + && { test "$len" -lt "$max_cmd_len" \ + || test "$max_cmd_len" -le -1; } + then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + elif test -n "$nm_file_list_spec"; then + func_basename "$output" + output_la=$func_basename_result + save_libobjs=$libobjs + save_output=$output + output=$output_objdir/$output_la.nm + func_to_tool_file "$output" + libobjs=$nm_file_list_spec$func_to_tool_file_result + func_append delfiles " $output" + func_verbose "creating $NM input file list: $output" + for obj in $save_libobjs; do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > "$output" + eval cmd=\"$cmd1\" + func_show_eval "$cmd" 'exit $?' + output=$save_output + libobjs=$save_libobjs + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS=$save_ifs + if test -n "$export_symbols_regex" && test : != "$skipped_export"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test : != "$skipped_export" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands, which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + func_append tmp_deplibs " $test_deplib" + ;; + esac + done + deplibs=$tmp_deplibs + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test yes = "$compiler_needs_object" && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + func_append linker_flags " $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test relink = "$opt_mode"; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test yes = "$module" && test -n "$module_cmds"; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test : != "$skipped_export" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + func_basename "$output" + output_la=$func_basename_result + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then + output=$output_objdir/$output_la.lnkscript + func_verbose "creating GNU ld script: $output" + echo 'INPUT (' > $output + for obj in $save_libobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + echo ')' >> $output + func_append delfiles " $output" + func_to_tool_file "$output" + output=$func_to_tool_file_result + elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then + output=$output_objdir/$output_la.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test yes = "$compiler_needs_object"; then + firstobj="$1 " + shift + fi + for obj + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + func_append delfiles " $output" + func_to_tool_file "$output" + output=$firstobj\"$file_list_spec$func_to_tool_file_result\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-$k.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test -z "$objlist" || + test "$len" -lt "$max_cmd_len"; then + func_append objlist " $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test 1 -eq "$k"; then + # The first file doesn't have a previous command to add. + reload_objs=$objlist + eval concat_cmds=\"$reload_cmds\" + else + # All subsequent reloadable object files will link in + # the last one created. + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-$k.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-$k.$objext + objlist=" $obj" + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds$reload_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + func_append delfiles " $output" + + else + output= + fi + + ${skipped_export-false} && { + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + } + + test -n "$save_libobjs" && + func_verbose "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs=$IFS; IFS='~' + for cmd in $concat_cmds; do + IFS=$save_ifs + $opt_quiet || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS=$save_ifs + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + ${skipped_export-false} && { + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands, which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + } + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test yes = "$module" && test -n "$module_cmds"; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs=$IFS; IFS='~' + for cmd in $cmds; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + $opt_quiet || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS=$save_ifs + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test yes = "$module" || test yes = "$export_dynamic"; then + # On all known operating systems, these are identical. + dlname=$soname + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "'-l' and '-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "'-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "'-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "'-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "'-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object '$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj=$output + ;; + esac + + # Delete the old objects. + $opt_dry_run || $RM $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # if reload_cmds runs $LD directly, get rid of -Wl from + # whole_archive_flag_spec and hope we can get by with turning comma + # into space. + case $reload_cmds in + *\$LD[\ \$]*) wl= ;; + esac + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags + else + gentop=$output_objdir/${obj}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # If we're not building shared, we need to use non_pic_objs + test yes = "$build_libtool_libs" || libobjs=$non_pic_objects + + # Create the old-style object. + reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs + + output=$obj + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + test yes = "$build_libtool_libs" || { + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + } + + if test -n "$pic_flag" || test default != "$pic_mode"; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output=$libobj + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "'-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "'-release' is ignored for programs" + + $preload \ + && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ + && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test CXX = "$tagname"; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + func_append compile_command " $wl-bind_at_load" + func_append finalize_command " $wl-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + compile_deplibs=$new_libs + + + func_append compile_command " $compile_deplibs" + func_append finalize_command " $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) func_append dllsearchpath ":$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath=$rpath + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) func_append finalize_perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath=$rpath + + if test -n "$libobjs" && test yes = "$build_old_libs"; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" false + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=: + case $host in + *cegcc* | *mingw32ce*) + # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. + wrappers_required=false + ;; + *cygwin* | *mingw* ) + test yes = "$build_libtool_libs" || wrappers_required=false + ;; + *) + if test no = "$need_relink" || test yes != "$build_libtool_libs"; then + wrappers_required=false + fi + ;; + esac + $wrappers_required || { + # Replace the output file specification. + compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + link_command=$compile_command$compile_rpath + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.$objext"; then + func_show_eval '$RM "$output_objdir/${outputname}S.$objext"' + fi + + exit $exit_status + } + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + func_append rpath "$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test yes = "$no_install"; then + # We don't need to create a wrapper script. + link_command=$compile_var$compile_command$compile_rpath + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + exit $EXIT_SUCCESS + fi + + case $hardcode_action,$fast_install in + relink,*) + # Fast installation is not supported + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "'$output' will be relinked during installation" + ;; + *,yes) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` + ;; + *,no) + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + ;; + *,needless) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command= + ;; + esac + + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output_objdir/$outputname" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Now create the wrapper script. + func_verbose "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + cwrappersource=$output_path/$objdir/lt-$output_name.c + cwrapper=$output_path/$output_name.exe + $RM $cwrappersource $cwrapper + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host"; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + case $build_libtool_libs in + convenience) + oldobjs="$libobjs_save $symfileobj" + addlibs=$convenience + build_libtool_libs=no + ;; + module) + oldobjs=$libobjs_save + addlibs=$old_convenience + build_libtool_libs=no + ;; + *) + oldobjs="$old_deplibs $non_pic_objects" + $preload && test -f "$symfileobj" \ + && func_append oldobjs " $symfileobj" + addlibs=$old_convenience + ;; + esac + + if test -n "$addlibs"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $addlibs + func_append oldobjs " $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append oldobjs " $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + echo "copying selected object files to avoid basename conflicts..." + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase=$func_basename_result + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + func_append oldobjs " $gentop/$newobj" + ;; + *) func_append oldobjs " $obj" ;; + esac + done + fi + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + elif test -n "$archiver_list_spec"; then + func_verbose "using command file archive linking..." + for obj in $oldobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > $output_objdir/$libname.libcmd + func_to_tool_file "$output_objdir/$libname.libcmd" + oldobjs=" $archiver_list_spec$func_to_tool_file_result" + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + oldobjs= + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + func_append objlist " $obj" + if test "$len" -lt "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj"; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$old_archive_cmds\" + objlist= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test -z "$oldobjs"; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test yes = "$build_old_libs" && old_library=$libname.$libext + func_verbose "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + if test yes = "$hardcode_automatic"; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test yes = "$installed"; then + if test -z "$install_libdir"; then + break + fi + output=$output_objdir/${outputname}i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + func_basename "$deplib" + name=$func_basename_result + func_resolve_sysroot "$deplib" + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" + ;; + -L*) + func_stripname -L '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -L$func_replace_sysroot_result" + ;; + -R*) + func_stripname -R '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -R$func_replace_sysroot_result" + ;; + *) func_append newdependency_libs " $deplib" ;; + esac + done + dependency_libs=$newdependency_libs + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "'$lib' is not a valid libtool archive" + func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" + ;; + *) func_append newdlfiles " $lib" ;; + esac + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "'$lib' is not a valid libtool archive" + func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" + ;; + esac + done + dlprefiles=$newdlprefiles + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlfiles " $abs" + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlprefiles " $abs" + done + dlprefiles=$newdlprefiles + fi + $RM $output + # place dlname in correct position for cygwin + # In fact, it would be nice if we could use this code for all target + # systems that can't hard-code library paths into their executables + # and that have no shared library path variable independent of PATH, + # but it turns out we can't easily determine that from inspecting + # libtool variables, so we have to hard-code the OSs to which it + # applies here; at the moment, that means platforms that use the PE + # object format with DLL files. See the long comment at the top of + # tests/bindir.at for full details. + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) + # If a -bindir argument was supplied, place the dll there. + if test -n "$bindir"; then + func_relative_path "$install_libdir" "$bindir" + tdlname=$func_relative_path_result/$dlname + else + # Otherwise fall back on heuristic. + tdlname=../bin/$dlname + fi + ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Linker flags that cannot go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test no,yes = "$installed,$need_relink"; then + $ECHO >> $output "\ +relink_command=\"$relink_command\"" + fi + done + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +if test link = "$opt_mode" || test relink = "$opt_mode"; then + func_mode_link ${1+"$@"} +fi + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $debug_cmd + + RM=$nonopt + files= + rmforce=false + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic=$magic + + for arg + do + case $arg in + -f) func_append RM " $arg"; rmforce=: ;; + -*) func_append RM " $arg" ;; + *) func_append files " $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + for file in $files; do + func_dirname "$file" "" "." + dir=$func_dirname_result + if test . = "$dir"; then + odir=$objdir + else + odir=$dir/$objdir + fi + func_basename "$file" + name=$func_basename_result + test uninstall = "$opt_mode" && odir=$dir + + # Remember odir for removal later, being careful to avoid duplicates + if test clean = "$opt_mode"; then + case " $rmdirs " in + *" $odir "*) ;; + *) func_append rmdirs " $odir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif $rmforce; then + continue + fi + + rmfiles=$file + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + func_append rmfiles " $odir/$n" + done + test -n "$old_library" && func_append rmfiles " $odir/$old_library" + + case $opt_mode in + clean) + case " $library_names " in + *" $dlname "*) ;; + *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; + esac + test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && test none != "$pic_object"; then + func_append rmfiles " $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && test none != "$non_pic_object"; then + func_append rmfiles " $dir/$non_pic_object" + fi + fi + ;; + + *) + if test clean = "$opt_mode"; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + func_append rmfiles " $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + func_append rmfiles " $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + func_append rmfiles " $odir/$name $odir/${name}S.$objext" + if test yes = "$fast_install" && test -n "$relink_command"; then + func_append rmfiles " $odir/lt-$name" + fi + if test "X$noexename" != "X$name"; then + func_append rmfiles " $odir/lt-$noexename.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + + # Try to remove the $objdir's in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then + func_mode_uninstall ${1+"$@"} +fi + +test -z "$opt_mode" && { + help=$generic_help + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode '$opt_mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# where we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: diff --git a/metis_adapter.c b/metis_adapter.c new file mode 100644 index 0000000..c815632 --- /dev/null +++ b/metis_adapter.c @@ -0,0 +1,273 @@ +/* Copyright (C) 2020 COIN-OR + * All Rights Reserved. + * This file is distributed under the Eclipse Public License. + */ + +#include "CoinHslConfig.h" + +#ifndef COINHSL_HAS_METIS + +/* provide dummy implementations of the method metis_nodend as expected by the HSL codes if Metis is not available + * as in Metis, we implement the method in several naming variants to copy with C and fortran naming style conventions + * Not defining COINMETIS_NODEND, as the renaming metis -> coinmetis only happens if Metis is available + */ +typedef int idxtype; + +void METIS_NODEND(int * a, idxtype * b, idxtype * c, int * d, int * e, idxtype * f, idxtype * perm) +{ + perm[0] = -1; +} + +void metis_nodend(int * a, idxtype * b, idxtype * c, int * d, int * e, idxtype * f, idxtype * perm) +{ + perm[0] = -1; +} + +void metis_nodend_(int * a, idxtype * b, idxtype * c, int * d, int * e, idxtype * f, idxtype * perm) +{ + perm[0] = -1; +} + +void metis_nodend__(int * a, idxtype * b, idxtype * c, int * d, int * e, idxtype * f, idxtype * perm) +{ + perm[0] = -1; +} + +void METIS_NodeND(int * a, idxtype * b, idxtype * c, int * d, int * e, idxtype * f, idxtype * perm) +{ + perm[0] = -1; +} + +#else /* COINHSL_HAS_METIS */ + +#include "metis.h" + +#ifndef METIS_VER_MAJOR +#define METIS_VER_MAJOR 4 +#endif + +/* wrapper to map COINMETIS_NODEND to METIS_NODEND from Metis 4 or 5 */ +typedef int idxtype; + +extern void COINMETIS_NODEND(int *, idxtype *, idxtype *, int *, int *, idxtype *, idxtype *); +extern void coinmetis_nodend(int *, idxtype *, idxtype *, int *, int *, idxtype *, idxtype *); +extern void coinmetis_nodend_(int *, idxtype *, idxtype *, int *, int *, idxtype *, idxtype *); +extern void coinmetis_nodend__(int *, idxtype *, idxtype *, int *, int *, idxtype *, idxtype *); + +#if METIS_VER_MAJOR < 5 + +void COINMETIS_NODEND( + int* nvtxs, + idxtype* xadj, + idxtype* adjncy, + int* numflag, + int* options, + idxtype* perm, + idxtype* iperm) +{ + METIS_NODEND(nvtxs, xadj, adjncy, numflag, options, perm, iperm); +} + +void coinmetis_nodend( + int* nvtxs, + idxtype* xadj, + idxtype* adjncy, + int* numflag, + int* options, + idxtype* perm, + idxtype* iperm) +{ + metis_nodend(nvtxs, xadj, adjncy, numflag, options, perm, iperm); +} + +void coinmetis_nodend_( + int* nvtxs, + idxtype* xadj, + idxtype* adjncy, + int* numflag, + int* options, + idxtype* perm, + idxtype* iperm) +{ + metis_nodend_(nvtxs, xadj, adjncy, numflag, options, perm, iperm); +} + +void coinmetis_nodend__( + int* nvtxs, + idxtype* xadj, + idxtype* adjncy, + int* numflag, + int* options, + idxtype* perm, + idxtype* iperm) +{ + metis_nodend__(nvtxs, xadj, adjncy, numflag, options, perm, iperm); +} + +#else /* METIS_VER_MAJOR >= 5 */ + +#if 0 +#include +#endif + +static +void COINMETIS_NodeND( + int* nvtxs, + idx_t* xadj, + idx_t* adjncy, + int* numflag, + int* options, + idx_t* perm, + idx_t* iperm) +{ + idx_t options5[METIS_NOPTIONS]; + +#if 0 + { + int i; + printf("METIS_NodeND called with nvtxs = %d numflag=%d\n", *nvtxs, *numflag); + + printf("xadj:"); + for( i = 0; i < *nvtxs; ++i ) + printf(" %d", xadj[i]); + printf("\nadjncy:"); + for( i = 0; i < xadj[*nvtxs] - *numflag; ++i ) + printf(" %d", adjncy[i]); + printf("\n"); + + printf("options:"); + if( options[0] == 0 ) + printf(" default\n"); + else + { + for( i = 0; i < 8; ++i ) + printf(" %d", options[i]); + printf("\n"); + } + } +#endif + + if( *nvtxs == 1 ) + { + /* MA57 seems to call metis with a graph containing 1 vertex and a self-loop + * Metis5 prints an error for this + */ + perm[0] = *numflag; + iperm[0] = *numflag; + return; + } + + METIS_SetDefaultOptions(options5); + options5[METIS_OPTION_NUMBERING] = *numflag; + + if( options[0] != 0 ) + { + if( options[1] == 1 ) /* random matching */ + options5[METIS_OPTION_CTYPE] = METIS_CTYPE_RM; + else /* heavy-edge or sorted heavy-edge matching; map both to shem, as heave-edge matching not available in metis5 */ + options5[METIS_OPTION_CTYPE] = METIS_CTYPE_SHEM; + + if( options[2] == 1 ) /* edge-based region-growing */ + options5[METIS_OPTION_IPTYPE] = METIS_IPTYPE_GROW; /* ?? */ + else /* node-based region-growing */ + options5[METIS_OPTION_IPTYPE] = METIS_IPTYPE_NODE; + + if( options[3] == 1 ) /* two-sided node FM refinement */ + options5[METIS_OPTION_RTYPE] = METIS_RTYPE_SEP2SIDED; + else /* one-sided node FM refinement */ + options5[METIS_OPTION_RTYPE] = METIS_RTYPE_SEP1SIDED; + + /* options[4] to options5[METIS_OPTION_DBGLV] ? */ + + switch( options[5] ) + { + case 0: /* do not try to compress or order connected components */ + options5[METIS_OPTION_COMPRESS] = 0; + options5[METIS_OPTION_CCORDER] = 0; + break; + case 1: /* try to compress graph */ + options5[METIS_OPTION_COMPRESS] = 1; + options5[METIS_OPTION_CCORDER] = 0; + break; + case 2: /* order each component separately */ + options5[METIS_OPTION_COMPRESS] = 0; + options5[METIS_OPTION_CCORDER] = 1; + break; + case 3: /* try to compress and order components */ + options5[METIS_OPTION_COMPRESS] = 1; + options5[METIS_OPTION_CCORDER] = 1; + break; + } + + options5[METIS_OPTION_PFACTOR] = options[6]; + + options5[METIS_OPTION_NSEPS] = options[7]; + } + + METIS_NodeND(nvtxs, xadj, adjncy, (void*)0, options5, perm, iperm); + +#if 0 + { + int i; + printf("perm:"); + for( i = 0; i < *nvtxs; ++i ) + printf(" %d", perm[i]); + printf("\niperm"); + for( i = 0; i < *nvtxs; ++i ) + printf(" %d", iperm[i]); + printf("\n"); + } +#endif +} + +void COINMETIS_NODEND( + int* nvtxs, + idx_t* xadj, + idx_t* adjncy, + int* numflag, + int* options, + idx_t* perm, + idx_t* iperm) +{ + COINMETIS_NodeND(nvtxs, xadj, adjncy, numflag, options, perm, iperm); +} + +void coinmetis_nodend( + int* nvtxs, + idx_t* xadj, + idx_t* adjncy, + int* numflag, + int* options, + idx_t* perm, + idx_t* iperm) +{ + COINMETIS_NodeND(nvtxs, xadj, adjncy, numflag, options, perm, iperm); +} + +void coinmetis_nodend_( + int* nvtxs, + idx_t* xadj, + idx_t* adjncy, + int* numflag, + int* options, + idx_t* perm, + idx_t* iperm) +{ + COINMETIS_NodeND(nvtxs, xadj, adjncy, numflag, options, perm, iperm); +} + +void coinmetis_nodend__( + int* nvtxs, + idx_t* xadj, + idx_t* adjncy, + int* numflag, + int* options, + idx_t* perm, + idx_t* iperm) +{ + COINMETIS_NodeND(nvtxs, xadj, adjncy, numflag, options, perm, iperm); +} + +#endif /* METIS_VER_MAJOR */ + +#endif /* COINHSL_HAS_METIS */ diff --git a/missing b/missing new file mode 100755 index 0000000..8d0eaad --- /dev/null +++ b/missing @@ -0,0 +1,215 @@ +#! /bin/sh +# Common wrapper for a few potentially missing GNU programs. + +scriptversion=2018-03-07.03; # UTC + +# Copyright (C) 1996-2020 Free Software Foundation, Inc. +# Originally written by Fran,cois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try '$0 --help' for more information" + exit 1 +fi + +case $1 in + + --is-lightweight) + # Used by our autoconf macros to check whether the available missing + # script is modern enough. + exit 0 + ;; + + --run) + # Back-compat with the calling convention used by older automake. + shift + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due +to PROGRAM being missing or too old. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + +Supported PROGRAM values: + aclocal autoconf autoheader autom4te automake makeinfo + bison yacc flex lex help2man + +Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and +'g' are ignored when checking the name. + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: unknown '$1' option" + echo 1>&2 "Try '$0 --help' for more information" + exit 1 + ;; + +esac + +# Run the given program, remember its exit status. +"$@"; st=$? + +# If it succeeded, we are done. +test $st -eq 0 && exit 0 + +# Also exit now if we it failed (or wasn't found), and '--version' was +# passed; such an option is passed most likely to detect whether the +# program is present and works. +case $2 in --version|--help) exit $st;; esac + +# Exit code 63 means version mismatch. This often happens when the user +# tries to use an ancient version of a tool on a file that requires a +# minimum version. +if test $st -eq 63; then + msg="probably too old" +elif test $st -eq 127; then + # Program was missing. + msg="missing on your system" +else + # Program was found and executed, but failed. Give up. + exit $st +fi + +perl_URL=https://www.perl.org/ +flex_URL=https://github.com/westes/flex +gnu_software_URL=https://www.gnu.org/software + +program_details () +{ + case $1 in + aclocal|automake) + echo "The '$1' program is part of the GNU Automake package:" + echo "<$gnu_software_URL/automake>" + echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/autoconf>" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + autoconf|autom4te|autoheader) + echo "The '$1' program is part of the GNU Autoconf package:" + echo "<$gnu_software_URL/autoconf/>" + echo "It also requires GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + esac +} + +give_advice () +{ + # Normalize program name to check for. + normalized_program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + + printf '%s\n' "'$1' is $msg." + + configure_deps="'configure.ac' or m4 files included by 'configure.ac'" + case $normalized_program in + autoconf*) + echo "You should only need it if you modified 'configure.ac'," + echo "or m4 files included by it." + program_details 'autoconf' + ;; + autoheader*) + echo "You should only need it if you modified 'acconfig.h' or" + echo "$configure_deps." + program_details 'autoheader' + ;; + automake*) + echo "You should only need it if you modified 'Makefile.am' or" + echo "$configure_deps." + program_details 'automake' + ;; + aclocal*) + echo "You should only need it if you modified 'acinclude.m4' or" + echo "$configure_deps." + program_details 'aclocal' + ;; + autom4te*) + echo "You might have modified some maintainer files that require" + echo "the 'autom4te' program to be rebuilt." + program_details 'autom4te' + ;; + bison*|yacc*) + echo "You should only need it if you modified a '.y' file." + echo "You may want to install the GNU Bison package:" + echo "<$gnu_software_URL/bison/>" + ;; + lex*|flex*) + echo "You should only need it if you modified a '.l' file." + echo "You may want to install the Fast Lexical Analyzer package:" + echo "<$flex_URL>" + ;; + help2man*) + echo "You should only need it if you modified a dependency" \ + "of a man page." + echo "You may want to install the GNU Help2man package:" + echo "<$gnu_software_URL/help2man/>" + ;; + makeinfo*) + echo "You should only need it if you modified a '.texi' file, or" + echo "any other file indirectly affecting the aspect of the manual." + echo "You might want to install the Texinfo package:" + echo "<$gnu_software_URL/texinfo/>" + echo "The spurious makeinfo call might also be the consequence of" + echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" + echo "want to install GNU make:" + echo "<$gnu_software_URL/make/>" + ;; + *) + echo "You might have modified some files without having the proper" + echo "tools for further handling them. Check the 'README' file, it" + echo "often tells you about the needed prerequisites for installing" + echo "this package. You may also peek at any GNU archive site, in" + echo "case some other package contains this missing '$1' program." + ;; + esac +} + +give_advice "$1" | sed -e '1s/^/WARNING: /' \ + -e '2,$s/^/ /' >&2 + +# Propagate the correct exit status (expected to be 127 for a program +# not found, 63 for a program that failed due to version mismatch). +exit $st + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: