View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0000585 | ascend | solver | public | 2015-04-06 22:25 | 2015-04-07 03:23 |
Reporter | sagitter | ||||
Assigned To | |||||
Priority | normal | Severity | block | Reproducibility | always |
Status | new | Resolution | open | ||
Platform | Linux | OS | Fedora | OS Version | 21/22/23 |
Product Version | 0.9.8 | ||||
Target Version | Fixed in Version | ||||
Summary | 0000585: Compile against Sundials-2.6.1 | ||||
Description | Sundials-2.6.1 does not provide sundials-config anymore. This lack imposes changes of Ascend code to detect properly all Sundials libraries which IDA solver needs. I'm trying to patch scons/sundials.py file and change Sundials libraries detection (please, see patch attached). However scons-check does not find the right Sundials version, IDA solver is disabled. Please, I need help to discover how to fix this problem. | ||||
Steps To Reproduce | This is scons command used: scons %{?_smp_mflags} \ INSTALL_ROOT=%{buildroot} \ INSTALL_PREFIX=%{_prefix} \ INSTALL_SHARE=%{_datadir} \ INSTALL_BIN=%{_bindir} \ INSTALL_INCLUDE=%{_includedir} \ INSTALL_LIB=%{_libdir} \ DEBUG=0 \ WITH_DOC_BUILD=no \ WITH_DOC_INSTALL=no \ WITH_PYTHON=yes \ WITH_TCLTK=no \ WITH_GRAPHVIZ=yes \ IPOPT_CPPPATH=%{_includedir}/coin \ IPOPT_LIBPATH=%{_libdir} \ IPOPT_LIBS="-L%{_libdir} -lipopt -ldmumps -lblas -llapack" \ WITH_CUNIT=yes \ CUNIT_CPPPATH=%{_includedir}/CUnit \ CUNIT_LIBPATH=%{_libdir} \ CUNIT_PREFIX=%{_prefix} \ WITH_SOLVERS=QRSLV,LSODE,LRSLV,DOPRI5,IDA,IPOPT \ ABSOLUTE_PATHS=no \ ascend ascxx pygtk models solvers | ||||
Additional Information | Sundials-2.6.1 is not in Fedora repositories yet. You can find Sundials-2.6.1's RPMs for testing on my own repos; these RPMs contain pkg-config files which should be useful to reach all Sundials libs. To accessing execute these commands by root from Fedora 21 or a recent Fedora 22 (under development): yum install dnf dnf copr enable sagitter/copasi dnf install sundials-devel | ||||
Tags | No tags attached. | ||||
|
ascend-idasolver.patch (5,123 bytes)
--- scons/sundials.orig.py 2014-07-10 17:14:38.000000000 +0200 +++ scons/sundials.py 2015-04-04 19:28:32.694785931 +0200 @@ -51,103 +51,36 @@ """ try: if platform.system()=="Windows": - try: - # one day, we'll provide a SUNDIALS installer so that people don't have to - # build their own SUNDIALS. In that case, look for the settings in the registry - import _winreg - x=_winreg.ConnectRegistry(None,_winreg.HKEY_LOCAL_MACHINE) - y= _winreg.OpenKey(x,r"SOFTWARE\SUNDIALS") - PATH,t = _winreg.QueryValueEx(y,"InstallPath") - LIB = os.path.join(PATH,"lib") - BIN = os.path.join(PATH,"bin") - INCLUDE = os.path.join(PATH,"include") - env['SUNDIALS_CPPPATH'] = [munge(INCLUDE)] - env['SUNDIALS_LIBPATH'] = [munge(BIN)] - env['SUNDIALS_LIBS'] = ['sundials_ida','sundials_nvecserial','m'] - except WindowsError: - sundialsconfig = find_sundials_config(env) - if not sundialsconfig: - raise RuntimeError("Unable to locate sundials-config in Windows PATH") - # if someone has installed sundials with ./configure --prefix=/MinGW using MSYS, then - # this should work, but we would like to make this a lot more robust! - cmd = ['sh.exe',sundialsconfig,'-mida','-ts','-lc'] - env1 = env.Clone() - env1['CPPPATH'] = None - env1['LIBPATH'] = None - env1['LIBS'] = None - #print "RUNNING sundials-config" - env1.ParseConfig(cmd) - env['SUNDIALS_CPPPATH'] = [munge(winpath(p)) for p in env1.get('CPPPATH')] - env['SUNDIALS_LIBPATH'] = [munge(winpath(p)) for p in env1.get('LIBPATH')] - env['SUNDIALS_LIBS'] = env1.get('LIBS') - env['HAVE_SUNDIALS'] = True + pkgconfig = ['c:\\MSYS\\1.0\\bin\\sh.exe','/MinGW/bin/pkg-config'] - env['HAVE_SUNDIALS'] = True - else: - sundialsconfig = env.WhereIs("sundials-config") - if not sundialsconfig: - raise RuntimeError("Unable to locate 'sundials-config' in PATH") - cmd = ['sundials-config','-mida','-ts','-lc'] - env1 = env.Clone() - env1['CPPPATH'] = None - env1['LIBPATH'] = None - env1['LIBS'] = None - env1.ParseConfig(cmd) - - # tricky stuff to detect the necessary extra 'lapack' linkage if required - if os.path.exists("/etc/lsb-release"): - print "CHECKING SUNDIALS" - s = env.WhereIs('sundials-config') - if s == "/usr/bin/sundials-config": - print "STANDARD CONFIG" - # With Ubuntu 11.10 onwards, we need to explicitly add lapack (and blas?) - f = file("/etc/lsb-release") - v = {} - for l in f: - x = l.strip().split("=") - v[x[0]] = x[1] - print v - if v['DISTRIB_ID']=="Ubuntu" and float(v['DISTRIB_RELEASE'])>=11.10: - print "ADDING LAPACK" - env1['LIBS'].append("lapack") - - env['SUNDIALS_CPPPATH'] = env1.get('CPPPATH') - env['SUNDIALS_LIBPATH'] = env1.get('LIBPATH') - env['SUNDIALS_LIBS'] = env1.get('LIBS') - env['HAVE_SUNDIALS'] = True + pkgconfig = ['/usr/bin/pkg-config'] + + cmd = pkgconfig + ['ida','--libs','--cflags'] + env1 = env.Clone() + env1['CPPPATH'] = None + env1['LIBPATH'] = None + env1['LIBS'] = None + env1.ParseConfig(cmd) + env['SUNDIALS_CPPPATH'] = env1.get('CPPPATH') + env['SUNDIALS_LIBPATH'] = env1.get('LIBPATH') + env['SUNDIALS_LIBS'] = env1.get('LIBS') + env['HAVE_SUNDIALS'] = True print "SUNDIALS_LIBS =",env.get('SUNDIALS_LIBS') print "SUNDIALS_LIBPATH =",env.get('SUNDIALS_LIBPATH') print "SUNDIALS_CPPPATH =",env.get('SUNDIALS_CPPPATH') + except Exception, e: print "FAILED SUNDIALS DETECTION (%s):" % platform.system(),e.__class__,str(e) env['HAVE_SUNDIALS'] = False -def find_sundials_config(env): - """ - Try and figure out if sundials-config is installed on this machine, and if so, where. - """ - if SCons.Util.can_read_reg: - # If we can read the registry, get the NSIS command from it - try: - # 0x20019 is KEY_READ, - k = SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE,'SOFTWARE\\SUNDIALS',0,0x20019) - val, tok = SCons.Util.RegQueryValueEx(k,None) - ret = val + os.path.sep + 'makensis.exe' - if os.path.exists(ret): - return '"' + ret + '"' - else: - return None - except: - pass # Couldn't find the key, just act like we can't read the registry - # Hope it's on the path, but note that we have to be careful with PATHEXT since sundials-config doesn't have an - # an executable-signifying suffix (seems like a weakness with env.WhereIs in SCons?? - return WhereIs('sundials-config',path=os.environ['PATH'],pathext="") - def exists(env): - if find_sundials_config(env) != None: - return 1 - return 0 + """ + Make sure this tool exists. + """ + if not subprocess.call('pkg-config --exists ipopt'): + return True + return False --- solvers/ida/ida.orig.h 2014-07-10 17:15:33.000000000 +0200 +++ solvers/ida/ida.h 2015-04-05 21:49:58.487195791 +0200 @@ -48,7 +48,7 @@ # define IDA_MTX_T DenseMat #endif -#if SUNDIALS_VERSION_MAJOR==2 && SUNDIALS_VERSION_MINOR==2 +#if SUNDIALS_VERSION_MAJOR==2 && SUNDIALS_VERSION_MINOR>=2 # include <sundials/sundials_config.h> # include <sundials/sundials_nvector.h> # include <ida/ida_spgmr.h> |